详情
喜欢的地方很远,喜欢的东西很贵,喜欢的人很优秀。
文章链接
https://gitee.com/fakerlove/deep-learning
BP神经网络
资料参考
https://www.zybuluo.com/hanbingtao/note/476663
反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称。
梯度下降是求极值的方法
bp是求梯度的算法
复合函数是由多个函数构成的函数
z=t2t=x+y
如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
这就是链式法则的原理,乍一看可能比较难理解,但实际上它是一个非常简单的性质。
\frac{\part z}{\partial x}=\frac{\partial z}{\partial t}\frac{\partial t}{\partial x}
\part z正好可以像下面这样“互相抵消”,所以记起来很简单。
\frac{\part z}{\partial t}=2t,\frac{\part t}{\partial x}=1
\frac{\part z}{\partial x}=2t\times 1=2(x+y)
两个人猜数字
这一过程类比没有隐层的神经网络,比如逻辑回归,
其中马里奥代表输出层节点,左侧接受输入信号,右侧产生输出结果,哆啦A梦则代表了误差,指导参数往更优的方向调整。 由于哆啦A梦可以直接将误差反馈给马里奥,同时只有一个参数矩阵和马里奥直接相连,所以可以直接通过误差进行参数优化(实纵线),迭代几轮,误差会降低到最小。
三个人猜数字
这一过程类比带有一个隐层的三层神经网络。 其中小女孩代表隐藏层节点,马里奥依然代表输出层节点,小女孩左侧接受输入信号,经过隐层节点产生输出结果,哆啦A梦代表了误差,指导参数往更优的方向调整。 由于哆啦A梦可以直接将误差反馈给马里奥,所以与马里奥直接相连的左侧参数矩阵可以直接通过误差进行参数优化(实纵线); 而与小女孩直接相连的左侧参数矩阵由于不能得到哆啦A梦的直接反馈而不能直接被优化(虚棕线)。 但由于反向传播算法使得哆啦A梦的反馈可以被传递到小女孩那进而产生间接误差,所以与小女孩直接相连的左侧权重矩阵可以通过间接误差得到权重更新,迭代几轮,误差会降低到最小。
资料参考
https://blog.csdn.net/linxiaoyin/article/details/104123881
反向传播的计算顺序是,将信号E乘以节点的局部导数∂x∂y,然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中$y = f(x) 的导数,也就是y关于x的导数\frac{\partial y}{\partial x},比如,假设y=f(x)=x^2,则局部导数为\frac{\partial y}{\partial x}=2x。把这个局部导数乘以上游传过来的值(本例中为E$),然后传递给前面的节点。
这就是反向传播的计算顺序。通过这样的计算,可以高效地求出导数的值,这是反向传播的要点。
例子
现在我们尝试将链式法则的计算用计算图表示出来。
反向传播向x上面的就是∂x∂z的结果为2(x+y)。
反向传播向y下面的就是∂y∂z的结果为2(x+y)。
加法节点的反向传播:左图是正向传播,右图是反向传播。如右图的反向传播所示,加法节点的反向传播将上游的值原封不动地输出到下游
乘法的反向传播:左图是正向传播,右图是反向传播。乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。
ReLU函数的计算图:
ReLU 层的作用就像电路中的开关一样。正向传播时,有电流通过的话,就将开关设为ON;没有电流通过的话,就将开关设为OFF。反向传播时,开关为ON的话,电流会直接通过;开关为OFF的话,则不会有电流通过。
Sigmoid函数的正向计算图如下:
Sigmoid函数的计算图的简洁版为:
因此,Sigmoid函数的反向传播,只根据正向传播的输出就能计算出来
Sigmoid函数被选为激活函数还有一个很重要的原因是它的导数很容易计算:
f′(x)=f(x)(1−f(x))
这里假设要进行3类分类,从前面的层接收3个输入。如下图所示, Softmax层将输入(a1,a2,a3)正规化,输出(y1,y2,y3)。 Cross Entropy Error层接收Softmax的输出$$(y_1, y_2, y_3)$$和监督标签(t1,t2,t3),从这些数据中输出损失L
Softmax层的反向传播得到了(y1−t1,y2−t2,y3−t3)这样“漂亮”的结果。由于(y1,y2,y3)是Softmax层的输出,(t1,t2,t3)是监督数据,所以(y1−t1,y2−t2,y3−t3)是Softmax层的输出和监督标签的差。
更新公式θj=θj−α(hθ(x0(i),x1(i),x2(i)...xn(i))−y(i))xj(i)
hθ(x0(i),x1(i),x2(i)...xn(i))−y(i) 是误差
α 是步长,或者学习率
xi是值
参考资料
https://blog.csdn.net/ft_sunshine/article/details/90221691
参考资料
https://blog.csdn.net/u014313009/article/details/51039334
参考资料
https://blog.csdn.net/weixin_42398658/article/details/83859131
参考资料
https://blog.csdn.net/ft_sunshine/article/details/90221691
参考资料
https://www.cnblogs.com/charlotte77/p/5629865.html
资料参考2
https://blog.csdn.net/weixin_45579930/article/details/112464775
参考资料
https://www.jianshu.com/p/fc0f28bf6aa2
参考链接
https://zhuanlan.zhihu.com/p/32819991
首先明确,“正向传播”求损失,“反向传播”回传误差。同时,神经网络每层的每个神经元都可以根据误差信号修正每层的权重,
过程如下
如何将输入层的信号传输至隐藏层呢,以隐藏层节点c为例,站在节点c上往后看(输入层的方向),可以看到有两个箭头指向节点c,因此a,b节点的信息将传递给c,同时每个箭头有一定的权重,因此对于c节点来说,输入信号为:
z12=a11⋅w111+a21⋅w211+b12
同理,节点d的输入信号为:
z22=a11⋅w121+a21⋅w221+b22
由于计算机善于做带有循环的任务,因此我们可以用矩阵相乘来表示:
Z2=W1A1+B2
所以,隐藏层节点经过非线性变换后的输出表示如下:
A2=sigmoid(Z2)
同理,输出层的输入信号表示为权重矩阵乘以上一层的输出:
Z3=W2⋅A2+B3
同样,输出层节点经过非线性映射后的最终输出表示为:
A3=sigmoid(Z3)
输入信号在权重矩阵们的帮助下,得到每一层的输出,最终到达输出层。可见,权重矩阵在前向传播信号的过程中扮演着运输兵的作用,起到承上启下的功能。
统一表达式
输入表达式
zk3=∑j=0mwjk2aj2,k=1,2,3,⋯,n,表示输出层的输入
zj2=∑i=0mwij1ai1,j=1,2,3,⋯,n,表示隐藏层的输入
使用的是权重计算
输出表达式
ak3=f(zk3)=f(∑j=0mwjk2aj2),
ak2=f(zk2)=f(∑j=0mwjk1aj1),
其中f为激活函数,f一般为sigmoid函数
使用的是激活函数计算
从后往前,利用链式求导法则,计算损失函数值对各参数 / 输入值 / 中间值的偏导数 / 梯度,梯度下降法需要使用反向传播来计算梯度。
在利用梯度下降法对权重矩阵等参数进行更新时,需要利用反向传播去计算损失函数对权重参数的偏导数。
代价函数被用来计算ANN输出值与实际值之间的误差。
常用的代价函数是二次代价函数(Quadratic cost function):
定义输出层误差
E=21(Y−Y^)2=21k=1∑m(yk−ak3)2
将误差E式展开到隐层为:
E=21k=1∑n(yk−ak3)2==21k=1∑n(yk−f(zk3))2=21k=1∑n(yk−f(j=0∑mwjk2aj2))2
将误差E进一步展开至输入层为:
E=21k=1∑n(yk−f(j=0∑mwjk2aj2))2=21k=1∑n(yk−f(j=0∑mwjk2f(i=0∑lwij1zi1)))2
上面的计算过程并不难,只要耐心一步步的拆开式子,逐渐分解即可。现在还有两个问题需要解决:
误差E有了,怎么调整权重让误差不断减小?
想到使用梯度下降法进行更新权值可以达到最优,
我们知道了,怎么传递到上一层,有随机梯度下降可知道,我们还需要梯度
均方差损失函数表达式为:
E=21∑k=1K(yk−ak)2
其中yk为输出值,ak为输出值,偏导数为
∂ai∂E=(ai−yi)
更新公式xt+1←xt−η×梯度
梯度这么来????
想要更新参数,就得计算梯度,梯度是根据误差计算的。所以先试用反向传播来传递误差
计算各个层损失
从最后一层的误差开始计算,用δj(l)表示第l层的单元j的损失,Δ(l)表示第l层的梯度,则δ5=a5−y,利用这个误差值来计算前一层的误差:
δ5=a5−yδ(4)=((θ(4))Tδ(5)⋅g′(z(4)))δ(3)=((θ(3))Tδ(4)⋅g′(z(3)))Δ(3)=δ(4)⋅a(3)Δ(2)=δ(3)⋅a(2)
于是假设λ=0,即不做任何正则化处理时:
∂θij(l)∂J(θ)=aj(l)δi(l+1)
为啥这样子呢????,请看下面的公式推导
1. 求偏导
E=21(Y−Y^)2=21∑k=1m(yk−ak3)2
我们知道一点的梯度就是这里的一阶偏导,因此对w求偏导即可:
\Delta w^2_{jk}=-\eta \frac{\part E}{\part w_{jk}^2}
\Delta v_{ij}^1=-\eta \frac{\part E}{\part w_{ij}^1}
wij1表示隐藏层权值,Δvij1表示输出层权值
负号表示梯度下降,η表示学习率
2.利用链式法则
\Delta w_{jk}=-\eta \frac{\part E}{\part w_{jk}}=-\eta \frac{\part E}{\part z^3_k}\frac{\part z^3_k}{\part w_{jk}} \\ \Delta v_{ij}=-\eta \frac{\part E}{\part \Delta v_{ij}}=-\eta \frac{\part E}{\part z^2_j}\frac{\part z^2_j}{\part \Delta v_{ij}}
3. 定义误差信号
为了看起来方便,我们对输出层和隐层各定义一个误差信号e
\text{令}\delta_{k}^{o}=-\frac{\part E}{\part z^3_k} \\ \text{令}\delta_{j}^{h}=-\frac{\part E}{\part z^2_j} \\ z^3_k=\sum_{j=0}^mw^2_{jk}a^2_j,\frac{\part z^3_k}{\part w_{jk}}=a^2_j \\ z^2_j=\sum_{i=0}^m\Delta v_{ij}a^1_i, \frac{\part z^2_j}{\part \Delta v_{ij}}=a_i^1
权值调整为
Δwjk=η⋅δko⋅aj2Δvij=η⋅δjh⋅ai1
4. 再次使用链式法则
\delta_{k}^{o}=-\frac{\part E}{\part z^3_k}=-\frac{\part E}{\part a^3_k}\frac{\part a^3_k}{\part z^3_k}=-\frac{\part E}{\part a^3_k}f^\prime(z^3_k)
\delta_{j}^{h}=-\frac{\part E}{\part z^2_j}=-\frac{\part E}{\part a^2_j}\frac{\part a^2_j}{\part z^2_j}=-\frac{\part E}{\part a^2_j}f^\prime(z^2_j)
替换变量\frac{\part E}{\part a^3_k}
E=21∑k=1m(yk−ak3)2
\frac{\part E}{\part a^3_k}=-(y_k-a_k^3)
替换变量\frac{\part E}{\part a^2_j}
\frac{\part E}{\part a^2_j}=\frac{\part E}{\part a_k^3}\frac{\part a_k^3}{\part a^2_j}=-(y_k-a_k^3)\frac{\part a_k^3}{\part a^2_j} \\ \frac{\part a_k^3}{\part a^2_j}=\frac{\part a_k^3}{\part z^3_k}\frac{\part z_k^3}{\part a^2_j}=f^\prime(z_k^3)\frac{\part z_k^3}{\part a^2_j} \\ z^3_k=\sum_{j=1}^mw^2_{jk}a^2_j,\frac{\part z_k^3}{\part a^2_j}=\sum_{j=1}^mw_{jk}^2 \\ \frac{\part E}{\part a^2_j}=-(y_k-a_k^3)f^\prime(z_k^3)\sum_{j=1}^mw_{jk}^2
最终
\delta_{k}^{o}=(y_k-a_k^3)f^\prime(z^3_k)=(y_k-a_k^3)z^3_k(1-z_k^3) \\ \frac{\part E}{\part a^2_j}=-(y_k-a_k^3)f^\prime(z_k^3)\sum_{j=1}^mw_{jk}^2=-\sum_{j=1}^m\delta_{k}^{o}w_{jk} \\ \delta_{j}^{h}=-\frac{\part E}{\part a^2_j}f^\prime(z^2_j)=(\sum_{k=1}^l\delta_{k}^{o}\cdot w_{jk})z_j^2(1-z_j^2)
5. 使用上面的公式带入其中
Δwjk=η⋅δko⋅aj2=η(yk−ak3)f′(zk3)aj2Δvij=η⋅δjh⋅ai1=η(k=1∑lδko⋅wjk)f′(zj2)ai1
通用公式
反向传播算法伪代码
训练集{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))}
fori=1tom
对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值令a(1)=x(i)
前向传播,计算出所有的a(l),z(l)
计算输出层产生的错误δL=(aL−y)⋅g′(z(L))
反向传播错误δl=((wl+1)Tδl+1)⋅g′(zl)
使用梯度下降(gradient descent),训练参数
Δij(l)=Δij(l)+aj(l)δi(l+1)
Dij(l)=m1Δij(l)+λθij(l),ifj=0
Dij(l)=m1Δij(l),ifj=0
∂θij(l)∂J(θ)=Dij(l)
下面是前向(前馈)运算(激活函数为sigmoid):
下面是反向传播(求网络误差对各个权重参数的梯度):
我们先来求最简单的,求误差E对w5的导数。首先明确这是一个“链式求导”过程,要求误差E对w5的导数,需要先求误差E对out o1的导数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:
导数(梯度)已经计算出来了,下面就是反向传播与参数更新过程:
上面的图已经很显然了,如果还看不懂真的得去闭门思过了(开玩笑~),耐心看一下上面的几张图,一定能看懂的。
如果要想求误差E对w1的导数,误差E对w1的求导路径不止一条,这会稍微复杂一点,但换汤不换药,计算过程如下所示:
BP网络优点:
非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数。这使得其特别适合于求解内部机制复杂的问题,即BP神经网络具有较强的非线性映射能力。
自学习和自适应能力:BP神经网络在训练时,能够通过学习自动提取输出、输出数据间的“合理规则”,并自适应的将学习内容记忆于网络的权值中。即BP神经网络具有高度自学习和自适应的能力。
泛化能力:所谓泛化能力是指在设计模式分类器时,即要考虑网络在保证对所需分类对象进行正确分类,还要关心网络在经过训练后,能否对未见过的模式或有噪声污染的模式,进行正确的分类。也即BP神经网络具有将学习成果应用于新知识的能力。
容错能力:BP神经网络在其局部的或者部分的神经元受到破坏后对全局的训练结果不会造成很大的影响,也就是说即使系统在受到局部损伤时还是可以正常工作的。即BP神经网络具有一定的容错能力。
BP网络缺点:
W1表示隐藏层的权值矩阵
W2表示输出层的权值矩阵
B表示偏置矩阵
既然梯度下降需要每一层都有明确的误差才能更新参数,所以接下来的重点是如何将输出层的误差反向传播给隐藏层。
其中输出层、隐藏层节点的误差如图所示,输出层误差已知,接下来对隐藏层第一个节点c作误差分析。还是站在节点c上,不同的是这次是往前看(输出层的方向),可以看到指向c节点的两个蓝色粗箭头是从节点e和节点f开始的,因此对于节点c的误差肯定是和输出层的节点e和f有关。
因此对于隐藏层节点c的误差为:
eh1=w112+w212w112eo1+w122+w222w122eo2
同理,对于隐藏层节点d的误差为:
eh2=w112+w212w212eo1+w122+w222w222eo2
为了减少工作量,我们还是乐意写成矩阵相乘的形式:
[eh1eh2]=⎣⎡w112+w212w112w112+w212w212w112+w222w122w122+w222w222⎦⎤⋅[eo1eo2]
你会发现这个矩阵比较繁琐,如果能够简化到前向传播那样的形式就更好了。实际上我们可以这么来做,只要不破坏它们的比例就好,因此我们可以忽略掉分母部分,所以重新成矩阵形式为:
[eh1eh2]=[w112w212w122w222]⋅[eo1eo2]
仔细观察,你会发现这个权重矩阵,其实是前向传播时权重矩阵w的转置,因此简写形式如下:
Eh=W2TEo
不难发现,输出层误差在转置权重矩阵的帮助下,传递到了隐藏层,这样我们就可以利用间接误差来更新与隐藏层相连的权重矩阵。
该应用可以安装在您的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和您的操作系统安全地进行交互。
喜欢的地方很远,喜欢的东西很贵,喜欢的人很优秀。