BP 神经网络原理

BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。

1 BP 神经网络的结构和传播规则

BP神经网络由 输入层、隐含层(也称中间层)和 输出层 构成 ,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过 权重 来体现。

在这里插入图片描述

BP神经网络的核心步骤如下。其中,实线代表正向传播,虚线代表反向传播。

在这里插入图片描述

1.1 正向传播

数据(信息、信号)从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果。
通过每一层的感知器,层层计算,得到输出,每个节点的输出作为下一个节点的输入。这个过程就是正向传播。

1.1.1 激活函数

必须处处可导(一般都使用S型函数)。

sigmoid 函数:

δ ( x ) = 1 1 + e − x \delta(x) = \frac{1}{1 + e^{-x}} δ(x)=1+ex1

sigmoid 函数的导函数:

δ ′ ( x ) = δ ( x ) ( 1 − δ ( x ) ) \delta ^{'} (x) = \delta(x) (1 - \delta(x)) δ(x)=δ(x)(1δ(x))

1.1.2 前向传播计算

如前面的 BP 神经网络结构图所示,使用 w j k l w_{jk}^{l} wjkl 表示从网络第 (l-1)层中的第 k 个神经元指向网络第 l 层中的第 j 个神经元的连接权重; b j l b_{j}^{l} bjl 表示网络第 l 层中的第 j 个神经元的 bias; y j l y_{j}^{l} yjl 表示网络第 l 层中的第 j 个神经元的线性输出的结果; x j l x_{j}^{l} xjl 表示网络第 l 层中的第 j 个神经元的激活函数的输出。

那么网络第 l 层中的第 j 个神经元的激活函数的输出可以表示成:

x j l = δ ( ∑ k w j k l a k l − 1 + b l l ) x_{j}^{l} = \delta (\sum _k w_{jk}^{l}a_k^{l-1} + b_l^l) xjl=δ(kwjklakl1+bll)

写成矩阵形式,定义权重矩阵 w l w^l wl,权重矩阵的每一个元素都代表一个权重:

w l = [ w 11 l w 12 l w 13 l w 21 l w 22 l w 23 l w 31 l w 32 l w 33 l ] w^l = \left[ \begin{matrix} w_{11}^l & w_{12}^l & w_{13}^l \\ w_{21}^l & w_{22}^l & w_{23}^l \\ w_{31}^l & w_{32}^l & w_{33}^l \\ \end{matrix} \right] wl= w11lw21lw31lw12lw22lw32lw13lw23lw33l

同样可以写出 x、b、y 的矩阵形式:

x l = [ x 1 l x 2 l x 3 l ] x^l = \left[ \begin{matrix} x_1^l \\ x_2^l \\ x_3^l \\ \end{matrix} \right] xl= x1lx2lx3l

b l = [ b 1 l b 2 l b 3 l ] b^l = \left[ \begin{matrix} b_1^l \\ b_2^l \\ b_3^l \\ \end{matrix} \right] bl= b1lb2lb3l

y l = δ ( [ w 11 l w 12 l w 13 l w 21 l w 22 l w 23 l w 31 l w 32 l w 33 l ] ⋅ [ x 1 l − 1 x 2 l − 1 x 3 l − 1 ] + [ b 1 l b 2 l b 3 l ] ) y^l = \delta \left( \left[ \begin{matrix} w_{11}^l & w_{12}^l & w_{13}^l \\ w_{21}^l & w_{22}^l & w_{23}^l \\ w_{31}^l & w_{32}^l & w_{33}^l \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_1^{l-1} \\ x_2^{l-1} \\ x_3^{l-1} \\ \end{matrix} \right] + \left[ \begin{matrix} b_1^l \\ b_2^l \\ b_3^l \\ \end{matrix} \right] \right) yl=δ w11lw21lw31lw12lw22lw32lw13lw23lw33l x1l1x2l1x3l1 + b1lb2lb3l

即,

y l = δ ( [ w 11 l x 1 l − 1 + w 12 l x 2 l − 1 + w 13 l x 3 l − 1 + b 1 l w 21 l x 1 l − 1 + w 22 l x 2 l − 1 + w 23 l x 3 l − 1 + b 2 l w 31 l x 1 l − 1 + w 32 l x 2 l − 1 + w 33 l x 3 l − 1 + b 3 l ] ) y^l = \delta \left( \left[ \begin{matrix} w_{11}^lx_1^{l-1} + w_{12}^lx_2^{l-1} + w_{13}^lx_3^{l-1} + b_1^l \\ w_{21}^lx_1^{l-1} + w_{22}^lx_2^{l-1} + w_{23}^lx_3^{l-1} + b_2^l \\ w_{31}^lx_1^{l-1} + w_{32}^lx_2^{l-1} + w_{33}^lx_3^{l-1} + b_3^l \\ \end{matrix} \right] \right) yl=δ w11lx1l1+w12lx2l1+w13lx3l1+b1lw21lx1l1+w22lx2l1+w23lx3l1+b2lw31lx1l1+w32lx2l1+w33lx3l1+b3l

前向传播的一般形式:

y l = δ ( w l ⋅ x l − 1 + b l ) y^l = \delta (w^l \cdot x^{l-1} + b^l) yl=δ(wlxl1+bl)

这里的输入只有一条数据,因此输入数据表现为一维列向量。多样本输入的时候是一样的,只是输入数据变成了一个二维的矩阵,矩阵的每一列都是一个输入样本数据。

多样本输入可以表示为:

Y l = δ ( w l ⋅ X l − 1 + b l ) X l = δ ( Y l ) Y^l = \delta (w^l \cdot X^{l-1} +b^l) \\ X^l = \delta (Y^l) Yl=δ(wlXl1+bl)Xl=δ(Yl)

1.2 梯度下降算法

梯度下降法是训练神经网络和线性分类器的一种普遍方法。斜率是函数的导数。梯度上的每个元素都会指明函数在该点处各个方向的斜率,梯度指向函数变化最快的方向。正梯度和负梯度指向变大最快的方向和变小最快的方向。

在正向传播的过程中,有一个 与期望的结果比较是否满意 的环节,在这个环节中实际的输出结果与期望的输出结果之间就会产生一个误差。为了减小这个误差,这个问题就转换为了一个优化问题。在这个优化问题中,目标函数就是损失函数(Loss function)。

L o s s = 1 2 ∑ i = 1 n ( y i − y ^ i ) 2 = 1 2 ∑ i = 1 n [ y i − ( w x i + b ) ] 2 Loss = \frac{1}{2} \sum _{i=1}^{n} (y_i - \hat{y}_{i})^2 \\ = \frac{1}{2} \sum _{i=1}^{n} [y_i - (wx_i + b)]^2 Loss=21i=1n(yiy^i)2=21i=1n[yi(wxi+b)]2

为了让实际的输出结果与期望的输出结果之间的误差最小,需要寻找损失函数的最小值。

1.2.1 使用迭代的方式寻找最小值

解析解:通过严格的公示推倒计算,给出的方程的精确解,任意精度下满足方程。

数值解:在一定条件下,通过某种近似计算得到的解,能够在给定的精度下满足方程。

迭代的方法寻找损失最小值 就是通过 梯度下降 + 迭代 的方式寻找数值解。

在这里插入图片描述

在迭代过程中,每次迭代各层节点之间的权重将不断地更新。

W ( t + 1 ) = W ( t ) − η ∂ L o s s ∂ w + α [ W ( t ) − W ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta \frac{\partial Loss}{\partial w} + \alpha [W_{(t)} - W_{(t - 1)}] W(t+1)=W(t)ηwLoss+α[W(t)W(t1)]

  • η ∂ L o s s ∂ w \eta \frac{\partial Loss}{\partial w} ηwLoss,每次更新权重的调整量
  • α [ W ( t ) − W ( t − 1 ) ] \alpha [W_{(t)} - W_{(t - 1)}] α[W(t)W(t1)],更新权重时的平滑项

每次迭代都会更新一次权重,之后将更新的权重与训练样本进行正向传播,如果得到的结果不满意,则进行反向传播,继续迭代。如此往复,直到得到满意的结果为止。

1.2.2 局部最小值和全局最小值

梯度下降学习法,总是沿着梯度下降的方向对权重进行调整。考虑梯度存在多个极值点,那么这些极值点中只有一个时全局最小值点,其他都是局部最小值点。

在这里插入图片描述

当权重调整至某个局部最小值附近的时候,由于总是沿着梯度下降的方向对权重进行调整,那么最终就会将权重调整至这个局部最小值点,并把它当作是全局最小值点了。但是实际上此时权重并不是处于全局最小值点,这样的情况并不是我们期望的。

1.2.3 算法改进
1.2.3.1 引入动量项

W ( t + 1 ) = W ( t ) − η [ ( 1 − α ) ∂ L o s s ∂ W ( t ) + α ∂ L o s s ∂ W ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta [(1 - \alpha) \frac{\partial Loss}{\partial W_{(t)}} + \alpha \frac{\partial Loss}{\partial W_{(t-1)}}] W(t+1)=W(t)η[(1α)W(t)Loss+αW(t1)Loss]

  • η > 0 \eta > 0 η>0,为学习率
  • 0 ≤ α < 1 0 \le \alpha < 1 0α<1 ,为动量因子
  • 通过引入动量项,给权重调整量添加一个梯度正方向的修正,类似于物体的惯性的效果,可以一定成都解决把局部最小值当做全局最小值的问题。
1.2.3.2 变步长法

学习率 η \eta η 选的太小,会导致收敛太慢;选的太大,会导致权重调整过头,导致震荡甚至发散。可以采用变步长法进行改进:
W ( t + 1 ) = W ( t ) − η ( t ) ∂ L o s s ∂ w η ( t ) = 2 λ η ( t − 1 ) λ = s g n [ ∂ L o s s ∂ w ( t ) ⋅ ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta (t) \frac{\partial Loss}{\partial w} \\ \eta (t) = 2^{\lambda} \eta (t - 1) \\ \lambda = sgn[\frac{\partial Loss}{\partial w_{(t)}} \cdot \frac{\partial Loss}{\partial w_{(t - 1)}}] W(t+1)=W(t)η(t)wLossη(t)=2λη(t1)λ=sgn[w(t)Lossw(t1)Loss]

  • 上面第三个式子根据相邻两次计算的梯度乘积来计算符号函数,可以实时调整学习率。当连续两次迭代的梯度的方向相同,说明下降太慢,这时通过上面第二个式子使步长加倍;当连续两次迭代的梯度的方向相反,说明下降过头,这时通过上面第二个式子使步长减半。
  • 上面的第二个式子里面的 2,可以根据实际需要,改成其他值,以此来控制步长的变化快慢。
1.3 反向传播
1.3.1 求梯度矩阵

假设函数 f : R m × n → R f: R^{m \times n} \rightarrow R f:Rm×nR 可以把输入矩阵映射为一个实数,那么函数 f f f 的梯度定义为:

∇ A f ( A ) = [ ∂ f ( A ) ∂ A 11 ∂ f ( A ) ∂ A 12 … ∂ f ( A ) ∂ A 1 n ∂ f ( A ) ∂ A 21 ∂ f ( A ) ∂ A 22 … ∂ f ( A ) ∂ A 2 n ⋮ ⋮ ⋱ ⋮ ∂ f ( A ) ∂ A m 1 ∂ f ( A ) ∂ A m 2 … ∂ f ( A ) ∂ A m n ] \nabla _A f(A) = \left[ \begin{matrix} \frac{\partial f(A)}{\partial A_{11}} & \frac{\partial f(A)}{\partial A_{12}} & \dotsc & \frac{\partial f(A)}{\partial A_{1n}} \\ \frac{\partial f(A)}{\partial A_{21}} & \frac{\partial f(A)}{\partial A_{22}} & \dotsc & \frac{\partial f(A)}{\partial A_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f(A)}{\partial A_{m1}} & \frac{\partial f(A)}{\partial A_{m2}} & \dotsc & \frac{\partial f(A)}{\partial A_{mn}} \\ \end{matrix} \right] Af(A)= A11f(A)A21f(A)Am1f(A)A12f(A)A22f(A)Am2f(A)A1nf(A)A2nf(A)Amnf(A)

( ∇ A f ( A ) ) i j = ∂ f ( A ) ∂ A i j (\nabla_A f(A))_{ij} = \frac{\partial f(A)}{\partial A_{ij}} (Af(A))ij=Aijf(A)

同样地,对于输入向量的函数 f : R n × 1 → R f: R^{n \times 1} \rightarrow R f:Rn×1R,那么:

∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] \nabla_x f(x) = \left[ \begin{matrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \\ \end{matrix} \right] xf(x)= x1f(x)x2f(x)xnf(x)

根据上面的矩阵和向量的梯度矩阵的定义,可以得到:

∇ x ( f ( x ) + g ( x ) ) = ∇ x f ( x ) + ∇ x g ( x ) ∇ x ( t f ( x ) ) = t ∇ x f ( x ) , t ∈ R \nabla_x (f(x) + g(x)) = \nabla_x f(x) + \nabla_x g(x) \\ \nabla_x (tf(x)) = t\nabla_x f(x), t \in R x(f(x)+g(x))=xf(x)+xg(x)x(tf(x))=txf(x),tR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】JAVA+Vue.js实现天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

Java基于微信小程序的房屋租赁、租房小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

逻辑漏洞(pikachu)

#水平&#xff0c;垂直越权&#xff0c;未授权访问 通过个更换某个id之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除&#xff09;B账号数据 使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限操作 通过删除请求中的认…

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者&#xff0c;然后通过每个使用方消费消息队列的消息的方式来完成消息的消费&#xff0c;并且一般来说我们消费消息后极有可能会操作DB&#xff0c;不过这种方式如果处理不够仔细&#xff0…

spark sql 转换字符串数组成多列结构

背景 在平时使用spark sql分析数据时&#xff0c;特别是分析从mysql的表入仓的hive表时&#xff0c;我们会经常和字符串数组的列打交道&#xff0c;而且这种情况下我们一般都需要把一行字符串数组的行数据转成多列的形式&#xff0c;我们看下怎么写这个sql spark sql 转换字符…

计算机网络(2)-----数据链路层

目录 一.数据链路层的基本概念 二.数据链路层的功能概述 功能一:为网络层提供服务。无确认无连接服务&#xff0c;有确认无连接服务&#xff0c;有确认面向连接服务。 功能二:链路管理&#xff0c;即连接的建立、维持、释放(用于面向连接的服务)。 功能三:组帧 透明传输:…

ESU毅速丨不锈钢材料为什么在金属3D打印中的广泛应用

不锈钢是一种传统且常见的材料&#xff0c;在金属3D打印领域应用最广。那么&#xff0c;为何不锈钢材料在3D打印中如此受欢迎呢&#xff1f;以下是几个关键原因。 卓越的工艺适应性 金属3D打印技术&#xff0c;如直接金属激光烧结&#xff08;DMLS&#xff09;和选择性激光熔融…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

Jmeter分布式部署

前期准备&#xff1a; 1. 控制机一台&#xff0c;代理机一台&#xff0c;Jmeter安装包 操作步骤&#xff1a; 1. Linux安装Jmeter&#xff08;windows安装教程自己搜一下&#xff09; 1.1创建一个单独的文件夹(jmeter)&#xff0c;用来存放Jmeter的安装包 mkdir jmeter 1.2…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

vscode设置打开浏览器

安装这个插件 Open Browser Preview

全排列 全排列 II N皇后

46.全排列 力扣题目链接(opens new window) 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 递归终止条件&#xff1a;当收集元素的数组path的大小达到和nums数组…

CSP-201803-1-跳一跳

CSP-201803-1-跳一跳 解题思路 使用getline函数接收一行输入&#xff0c;即玩家的跳跃序列。初始化总得分scoreSum为0&#xff0c;上一次得分lastGrade为2&#xff08;因为跳到中心的初始得分是2&#xff09;&#xff0c;以及一个布尔标志flag表示上一次是否跳到了中心&#…

Thinkphp框架漏洞--->5.0.23 RCE

1.Thinkphp ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架&#xff0c;是为了敏捷WEB应用开发和简化 企业应用开发而诞生的。 2.漏洞原理及成因 该漏洞出现的原因在于 ThinkPHP5框架底层对控制器名过滤不严 &#xff0c;从而让攻击者可以通过…

lotus 从矿工可用余额扣除扇区质押

修改 miner配置文件 # Whether to use available miner balance for sector collateral instead of sending it with each message## type: bool# env var: LOTUS_SEALING_COLLATERALFROMMINERBALANCE#CollateralFromMinerBalance falseCollateralFromMinerBalance true质押金…

(Sora模型风口)2024最新GPT4.0使用教程,AI绘画,一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的&#xff0c;有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟&#xff0c;让程序员⾃⼰可以根据实际需求申请和释放相应空间&#xff0c;这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤&#xff1a; 服务器选购推荐&#xff1a;腾讯云轻量服务器 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作为游戏服…

微服务简介及其相关技术栈

目录 1、简介 2、技术栈 3、单体架构 4、分布式架构 5、微服务 6、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Pyth…

wpa_supplicant交叉编译

文章目录 源码编译openssl编译libnl交叉编译WPA 开发板测试使用 源码 wpa_supplicant官网&#xff1a;http://w1.fi/wpa_supplicant/ GIT源&#xff1a;git://w1.fi/hostap.git openssl 源码&#xff1a; https://www.openssl.org/ libnl 源码&#xff1a; https://github.c…