深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础。

  回顾监督学习的一般性问题。假设我们有$m$个训练样本$\{(x_1, y_1), (x_2, y_2), …, (x_m, y_m)\}$,其中$x$为输入向量,$y$为输出向量,利用这个训练样本训练模型的参数,使得给定模型一个$x_{test}$,其能够预测$y_{test}$。

  采用CNN模型的时候,$x$输入向量全部喂给输入层,$y$输出向量和输出层的向量一起计算损失函数,而其中若干个神经元的隐藏层,每一个隐藏层都有对应的权重矩阵$W$和偏置向量$b$,对于训练过程中,喂入样本$x$得到$y_{predict}$,根据$y_{predict}$以及$y$计算出的损失函数,怎么去更新网络中的参数,即需要反向传播算法。在机器学习中,求出损失函数的最小极值,其对应的参数即为我们所期望的到的。在DNN中,常用的优化极值求解过程的方法为梯度下降法,其他还有牛顿法、拟牛顿法等等。

  综上,对DNN的损失函数采用梯度下降法进行迭代优化求极小值的过程即为反向传播算法。

1 - DNN反向传播算法

  定义一个损失函数,度量训练样本通过模型的预测输出与真实输出之间的差距(损失)。训练样本的预测输出可以通过一系列对于第l层的一般公式${a^{l}}=\sigma(z^{l})=\sigma(W^{l}a^{l-1}+b^{l})$计算得出。输出层对应的${a^{L_{output}}}$即为模型预测的输出。

DNN常用可选择均方差来作为损失函数,其公式如下$$J(W,b,x,y)=\frac{1}{2}\begin{Vmatrix}a^{L}-y \end{Vmatrix}^2_2$$

  其中$a^L$和$y$分别为预测输出和期望真实输出(期望输出),而$\begin{Vmatrix}S\end{Vmatrix}_2$为$S$的$L2$范数。

对于输出层$L_{output}$,其$W_{output}$和$b_{output}$满足如下公式:$${a^{L_{output}}}=\sigma(z^{L_{output}})=\sigma(W^{L_{output}}a^{L_{output\_prev}}+b^{L_{output}})$$

因此,对于输出层的参数,我们有损失函数如下:

$$J(W,b,x,y)=\frac{1}{2}\begin{Vmatrix}a^{L_{output}}-y\end{Vmatrix}^2_2=\frac{1}{2}\begin{Vmatrix} \sigma(W^{L_{output}}a^{L_{output\_prev}}+b^{L_{output}})-y\end{Vmatrix}^2_2$$

因此对于该损失函数,可对其对于输出层的$W_{output}$和$b_{output}$分别求偏导数从而得到梯度,如下:

$$\frac{\partial J(W,b,x,y)}{\partial W^{L_{output}}}=\frac{\partial J(W,b,x,y)}{\partial z^{L_{output}}}\frac{\partial z^{L_{output}}}{\partial W^{L_{output}}}=(a^{L_{output}}-y)\bigodot \sigma^{'}(z^{L_{output}})(a^{L_{output\_prev}})^T$$

$$\frac{\partial J(W,b,x,y)}{\partial b^{L_{output}}}=\frac{\partial J(W,b,x,y)}{\partial z^{L_{output}}}\frac{\partial z^{L_{output}}}{\partial b^{L_{output}}}=(a^{L_{output}}-y)\bigodot \sigma^{'}(z^{L_{output}})$$

上述$\bigodot$代表$Hadamard$积,对于两个维度相同的向量$A(a_1,a_2,...,a_n)^T$和$B(b_1,b_2,...,b_n)^T$,有${A}\bigodot{B}=(a_1b_1,a_2b_2,...,a_n,b_n)^T$。

对于$W_{output}$和$b_{output}$,有公共部分$\frac{\partial J(W,b,x,y)}{\partial z^{L_{output}}}$,将其记做$\delta^L$,如下:

$$\delta^L=\frac{\partial J(W,b,x,y)}{\partial z^{L_{output}}}=(a^{L_{output}}-y)\bigodot \sigma^{'}(z^{L_{output}})$$

以上就是计算输出层的梯度,而对于第l层的梯度,根据链式法则可得公式如下:

$$\delta^l=\frac{\partial J(W,b,x,y)}{\partial z^{l}}=\frac{\partial J(W,b,x,y)}{\partial z^{L_{output}}}\frac{\partial z^{L_{output}}}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}}$$

注意到,其中$L_{output}$等价于$L$。这对于任意第l层,计算出该层的$W^l$和$b^l$的梯度如下:

$$\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}}=\delta^l(a^{l-1})^T $$

$$\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}}=\delta^l $$

因此,关键是需要求出$\delta^l$。注意到有递推公式$\delta^l=\frac{\partial J(W,b,x,y)}{\partial z^l}=\frac{\partial J(W,b,x,y)}{\partial z^{l+l}}\frac{z^{l+1}}{z^l}=\delta^{l+1}\frac{\partial z^{l+1}}{\partial z^l}$,所以关键在于求解$\frac{\partial z^{l+1}}{\partial z^l}$。而$z^{l+1}$和$z^l$的关系可以表示为$z^{l+1}=W^{l+1}a^l+b^{l+1}=W^{l+1}\sigma(z^l)+b^{l+1}$,可以得出如下关系:

$$\frac{\partial z^{l+1}}{\partial z^l}=(W^{l+1})^T\bigodot\begin{matrix}\underbrace{(\sigma^{'}(z^l),...,\sigma^{'}(z^l))}\\ n={l+1}\end{matrix}$$

代入上式可以得到:

$$\delta^l=\delta^{l+1}\frac{\partial z^{l+1}}{\partial z^l}=(W^{l+1})^T\delta^{l+1}\bigodot\sigma^{'}(z^{l})$$

综上,可以通过$\delta^l$求出对应l层的$W^l$和$b^l$的梯度。

2 - DNN反向传播伪代码

initialize all variables by random value
for loop from to num_epoch
choose x_i as the model input
compute the output of the output-layer a^L
compute the δ^L of the output-layer
for l=L to
compute the δ^l based on δ^(l+) and W^(l+) and z^l
compute the gradient of W^l and b^l
update the W^l and b^l in lth-layer:W^l = W^l-αsum(δ^l(a^(l-)^T), b^l=b^l-αsum(δ^l)

3 - 参考资料

https://www.cnblogs.com/pinard/p/6422831.html

深度学习——深度神经网络(DNN)反向传播算法的更多相关文章

  1. 神经网络之反向传播算法(BP)公式推导(超详细)

    反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...

  2. 卷积神经网络(CNN)反向传播算法

    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...

  3. (3)Deep Learning之神经网络和反向传播算法

    往期回顾 在上一篇文章中,我们已经掌握了机器学习的基本套路,对模型.目标函数.优化算法这些概念有了一定程度的理解,而且已经会训练单个的感知器或者线性单元了.在这篇文章中,我们将把这些单独的单元按照一定 ...

  4. 神经网络(NN)+反向传播算法(Backpropagation/BP)+交叉熵+softmax原理分析

    神经网络如何利用反向传播算法进行参数更新,加入交叉熵和softmax又会如何变化? 其中的数学原理分析:请点击这里.

  5. 深度学习之神经网络核心原理与算法-caffe&keras框架图片分类

    之前我们在使用cnn做图片分类的时候使用了CIFAR-10数据集 其他框架对于CIFAR-10的图片分类是怎么做的 来与TensorFlow做对比. Caffe Keras 安装 官方安装文档: ht ...

  6. 深度学习实战-----0001(移植反向传播Python to c++)

    1. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/  老外教程 2. https://github. ...

  7. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

  8. 深度学习之反向传播算法(BP)代码实现

    反向传播算法实战 本文仅仅是反向传播算法的实现,不涉及公式推导,如果对反向传播算法公式推导不熟悉,强烈建议查看另一篇文章神经网络之反向传播算法(BP)公式推导(超详细) 我们将实现一个 4 层的全连接 ...

  9. 深度学习课程笔记(三)Backpropagation 反向传播算法

    深度学习课程笔记(三)Backpropagation 反向传播算法 2017.10.06  材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ...

随机推荐

  1. socket关闭状态问题

    下面是对 譬如  “CLOSE_WAIT” 现象的一些解释: 主动关闭方和被动方经历的状态:FIN_WAIT_1(主动关闭一方): 当SOCKET在ESTABLISHED状态时,它想主动关     闭 ...

  2. go操作redis和mysql示例

    一:redis示例 使用redis的包是: github.com/garyburd/redigo/redis 1:编写第一个示例: 链接,设置,获取 redis_basic.go package ma ...

  3. Python之字符编码与文件操作

    目录 字符编码 Python2和Python3中字符串类型的差别 文件操作 文件操作的方式 文件内光标的移动 文件修改 字符编码 什么是字符编码? ''' 字符编码就是制定的一个将人类的语言的字符与二 ...

  4. qml: QtCharts模块得使用(数据整合和显示) ---- <二>

    QtCharts目前已经可以免费使用,而且使用非常方便.快捷,并且提供了各种类别的支持(例如:曲线图,柱形图,折线图,饼图等). 这里讲解qml端图表显示,C++端进行数据整合,并能实现实时数据刷新( ...

  5. 【3D动画建模设计工具】Maxon Cinema 4D Studio for Mac 20.0

    图标 Icon   软件介绍 Description Maxon Cinema 4D Studio R20 ,是由德国公司Maxon Computer一款适用于macOS系统的3D动画建模设计工具,是 ...

  6. python类继承的重写和super

    给已经存在的类添加新的行为,继承是非常好的实现方式.但是如果要改变行为呢?比如在Python继承扩展内置类,我们的contact类只允许一个名字和一个邮箱,但是如果要对某些人增加电话号码呢?这里可以通 ...

  7. Mysql连接查询、子查询、联合查询 整理

    连接查询 连接语法的基本形式 from 表1  [连接方式]  join 表2  [on 连接条件]: 交叉连接 语法: from  表1  [cross]  join  表2  ;      //可 ...

  8. 2017-12-15python全栈9期第二天第七节之练习题

    #!/user/bin/python# -*- coding:utf-8 -*-print(6 or 2 > 1)print(3 or 2 >1 )print(0 or 5 <4)p ...

  9. u-boot(一)启动简介

    目录 u-boot(一)启动简介 启动概述 内部存储布局 Bootloader概述 内核启动参数 taggedlist 体验一下实际的Uboot U-boot的使用帮助 U-boot基本要求 titl ...

  10. docker mesos集群资源调度平台

    mesos原理与架构 首先,再次需要强调 Mesos 自身只是一个资源调度框架,并非一整套完整的应用管理平台,所以只有 Mesos 自己是不能干活的.但是基于 Mesos,可以比较容易地为各种应用管理 ...