2. DNN神经网络的反向更新(BP)

1. DNN神经网络的前向传播(FeedForward)

2. DNN神经网络的反向更新(BP)

1. 前言

DNN前向传播介绍了DNN的网络是如何的从前向后的把数据传递过去的,但是只有这个过程还不够,我们还需要想办法对所有参数进行一个梯度的更新,才能使得网络能够慢慢的学习到新的东西。

在神经网络中有一种通用的方法来更新参数,叫做反向更新BP

2. DNN反向更新过程

根据前面的前向传播的过程我们得到了一个传播公式,其中\(\sigma\)是激活函数,对具体的函数不做要求,可以是线性激活函数,也可以是非线性激活函数。

\[
a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)\;\;\;\;\;\;(0)
\]
我们假设DNN的损失函数是MSE,其中\(a^L\)是输出层的输出:

\[
J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2
\]
对低\(l\)层的\(W,b\)求导数有:

\[
\frac{\partial J(W,b,x,y)}{\partial W^l} = \frac{\partial J(W,b,x,y)}{\partial z^l} \frac{\partial z^l}{\partial W^l}\;\;\;\;\;\;(1)
\]

\[
\frac{\partial J(W,b,x,y)}{\partial b^l} = \frac{\partial J(W,b,x,y)}{\partial z^l} \frac{\partial z^l}{\partial b^l}\;\;\;\;\;\;(2)
\]
我们令

\[
\delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l}\;\;\;\;\;\;(3)
\]

把(3)带入(1)(2)得到下式(4)(5)
\[
\frac{\partial J(W,b,x,y)}{\partial W^l} = \delta^{l}(a^{l-1})^T\;\;\;\;\;\;(4)
\]

\[
\frac{\partial J(W,b,x,y)}{\partial b^l} = \delta^{l}\;\;\;\;\;\;(5)
\]
我们只要求出\(\delta^l\)的表达式,就能求出每一层的\(W^l,b^l\)的梯度,就能对每层进行梯度更新。

由(3)不难得出

\[
\delta^{l} = \frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial z^{l}} = \delta^{l+1}\frac{\partial z^{l+1}}{\partial z^{l}}\;\;\;\;\;\;(6)
\]
又因为有

\[
z^{l+1}= W^{l+1}a^{l} + b^{l+1} = W^{l+1}\sigma(z^l) + b^{l+1}\;\;\;\;\;\;(7)
\]
根据(6)(7)我们得出

\[
\delta^{l} = \delta^{l+1}\frac{\partial z^{l+1}}{\partial z^{l}} = (W^{l+1})^T\delta^{l+1}\odot \sigma^{'}(z^l)\;\;\;\;\;\;(8)
\]
现在我们有了一个\(\delta^{l}\)和\(\delta^{l+1}\)的递推公式,我们只要求出最后一层的\(\delta^{L}\),就能算出所有层的\(\delta^{l}\),然后根据(4)(5)可以算出每层的参数的梯度并进行更新。

如果理解了上面的过程,相比读者对计算\(\delta^{L}\)已经不在话下了:
\[
\delta^L = \frac{\partial J(W,b,x,y)}{\partial z^L} = (a^L-y)\odot \sigma^{'}(z^L)
\]

到此为止,我们已经能成功的更新了每层的梯度,整个网络在理论上已经能够跑通了。不过在此说明两点。

  1. 上面的推理过程是在MSE的假设下进行的,如果换一个损失函数,那需要对计算输出层\(\delta^{L}\)进行相应的修改。
  2. 因为方便推理过程,前面都使用同一个激活函数\(\sigma\),但是其实每一层可以有自己相应的激活函数,只要计算过程中使用相应的相应激活函数的导数即可。

3. 总结

由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里我们以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])

原文地址:https://www.cnblogs.com/huangyc/p/10000394.html

时间: 2024-10-20 17:58:04

2. DNN神经网络的反向更新(BP)的相关文章

3. DNN神经网络的正则化

1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考虑泛化,这里我们就对DNN的正则化方法做一个总结. 2. DNN的L1和L2正则化 想到正则化,我们首先想到的就是L1正则化和L2正则化.L1正则化和L2正则化原理类似,这里重点讲述DNN的L2正则化. 而DNN的L2正则化通常的做法是只针对与线性系数矩阵\(W\),而不针对偏倚系数\(b\).利用

minimize.m:共轭梯度法更新BP算法权值

minimize.m:共轭梯度法更新BP算法权值 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Carl Edward Rasmussen在高斯机器学习的MATLAB代码中写到一个优化类的函数:minimize.m,同时,Geoff Hinton在用BP算法精调深度自编码网络时,也借鉴了这个函数minimize.m,下面来简单聊一聊这个函数的大致机理. matlab函数minimum.m用来查找(非线性)多元函数的(局部)最小值.用户必须提供一个

第二节,神经网络中反向传播四个基本公式证明——BackPropagation

参考文章 神经网络基础 Neural Networks and Deep Learning.       Michael A. Nielsen 一文弄懂神经网络中的反向传播法:讲的很详细,用实例演示了反向传播法中权重的更新过程,但是未涉及偏置的更新 假设一个三层的神经网络结构图如下: 对于一个单独的训练样本x其二次代价函数可以写成: C = 1/2|| y - aL||2 = 1/2∑j(yj - ajL)2 ajL=σ(zjL) zjl = ∑kωjklakl-1 + bjl 代价函数C是aj

神经网络之反向传播算法实现

1 神经网络模型 以下面神经网络模型为例,说明神经网络中正向传播和反向传播过程及代码实现 1.1 正向传播 (1)输入层神经元\(i_1,i_2\),输入层到隐藏层处理过程 \[HiddenNeth_1 = w_1i_1+w_2i_2 + b_1\] \[HiddenNeth_2 = w_3i_1+w_4i_2 + b_1\] \[h_1 = sigmoid(HiddenNeth_1)\] \[h_2 = sigmoid(HiddenNeth_2)\] (2)隐藏层:神经元\(h_1,h_2\)

神经网络和反向传播算法推导

注:由于自己画图实在太难画,本文中基本所有插图来源于算法团子机器学习班,请勿转载 1.普通的机器学习模型: 其实,基本上所有的基本机器学习模型都可以概括为以下的特征:根据某个函数,将输入计算并输出.图形化表示为下图: 当我们的g(h)为sigmoid函数时候,它就是一个逻辑回归的分类器.当g(h)是一个只能取0或1值的函数时,它就是一个感知机.那么问题来了,这一类模型有明显缺陷:当模型线性不可分的时候,或者所选取得特征不完备(或者不够准确)的时候,上述分类器效果并不是特别喜人.如下例: 我们可以

卷积神经网络(待更新)

在机器视觉,图像处理领域,卷积神经网络取得了巨大的成功.本文将参考UFLDL和DEEPLEARNING.NET的教程,结合自己的理解,梳理一下卷积神经网络的构成以及其BP算法的求解.虽然利用theano可以方便的实现LeNet5,但是不利于学习和理解卷积神经网络,所以最后会自己动手用python实现一个简单的LeNet5,并尝试利用python的PyCUDA库进行加速. 首先看LeNet5的结构,如下图所示(来自Yann LeCun的论文). 对于卷积层,其计算公式为 其中K表示由L层到L+1层

机器学习之五:神经网络、反向传播算法

一.逻辑回归的局限 在逻辑回归一节中,使用逻辑回归的多分类,实现了识别20*20的图片上的数字. 但所使用的是一个一阶的模型,并没有使用多项式,为什么? 可以设想一下,在原有400个特征的数据样本中,增加二次.三次.四次多项式,会是什么情形? 很显然,训练样本的特征数量将会拔高多个数量级,而且,更重要的,要在一个式子中拟合这么多的特征,其难度是非常大的,可能无法收敛到一个比较理想的状态. 也就是说,逻辑回归没法提供很复杂的模型. 因为其本质上是一个线性的分类器,擅长解决的是线性可分的问题. 那么

反向传播BP为什么高效

之前有一篇文章讲了反向传播的原理: 下面这篇文章讲了反向传播为什么高效: https://blog.csdn.net/lujiandong1/article/details/52716726 主要通过对比得到的结论,也就是对比反向传播和之前的算神经网络权重的方法. 原文地址:https://www.cnblogs.com/charlesblc/p/8832905.html

三层神经网络的反向查询

前面讲的都是前向传播,已知输入层数据,计算出输出层结果.如果我们已知输出层结果是否可以反向推理出图片的像素值呢.在前面的神经网络基础上面进行修改. 1.训练 训练神经网络和前面讲的一样. 2.定义反向查询函数 1.>定义反向激活函数.利用logit函数 self.inverse_activation_function = lambda x: spc.logit(x) 2.>利用已知结果得到激活之前的输出值,在通过矩阵点乘得到激活之后的隐藏层的值,在通过反向激活函数得到激活之前的隐藏层值,在通过