深度神经网络(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. 网络流n题

    近日好不容易在自救之路写完暑训遗留下来的网络流8题,在此回顾一下. Going Home POJ - 2195 题意:m要去H,一个H只能容纳一个m,一步一块钱,问最小花费. 思路:最小费用最大流的板 ...

  2. nginx 限速最容易理解的说明

    nginx 限速研究汇报 写在前面 这两天服务器带宽爆了,情况如下图: 出于降低带宽峰值的原因,我开始各种疯狂的研究nginx限速.下面是我研究过程中的心得!(花了好几个小时的时间写的人生第一篇技术类 ...

  3. maven构建myeclipse 工程

    前提:安装maven完成后 mvn -version查看版本 一,新建WEB 工程  mvn archetype:generate -DgroupId={project-packaging} -Dar ...

  4. Java Web之上传文件

    本篇文章你会学到 1. Apache FileUpload组件 2.上传文件保存的路径和名称问题 3.缓存大小和临时目录 4.控制文件上传的格式 先讲一个简单的例子,一个注册页面,有账号,邮箱,和头像 ...

  5. Java 语言特性

    介绍以下几种语言特性: Java5的特性 1.静态引用 2.可变参数 3.自动装箱和拆箱  包装类的缓存设计 4.枚举 一.静态引用(语法糖,不推荐使用,了解一下即可) 先看看普通的引用,就是impo ...

  6. python html css 初识

    ##################总结############ 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文 ...

  7. jQuery图片灯箱和视频灯箱

    在一些前端页面中经常需要文件上传,为了美观,我们经常做一个灯箱来显示我们选择的文件, 而不是简单的input标签. html 代码:这个是多图片上传 <div class="layui ...

  8. Integer与int值的比较

    ==一般用于比较内存地址,equals()用于比较Object的值,注意int用equals()是会报错的.Integer i=1Integer k=1i.equals(k)=truei==k=tru ...

  9. HDU 1016(素数环 深搜)

    题意是说对一个长度为 n 的数环进行排列,使得相邻两数的和为素数,按从小到大的顺序依次输出. 因为是环,所以总能调整成以 1 为序列首输出.用深度优先搜索的方法即可.在判断素数时由于 n 小于 20, ...

  10. webService的介绍与简单使用

    webService开发项目介绍: 1 Webservice:跨语言跨平台的远程调用技术.Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. ...