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

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

3. DNN神经网络的正则化

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的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

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

  1. 3. DNN神经网络的正则化

    1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考 ...

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

    1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 神经网络技术起源于上世纪五.六十年代,当时叫感知机(perc ...

  3. 3. CNN卷积网络-反向更新

    1. CNN卷积网络-初识 2. CNN卷积网络-前向传播算法 3. CNN卷积网络-反向更新 1. 前言 如果读者详细的了解了DNN神经网络的反向更新,那对我们今天的学习会有很大的帮助.我们的CNN ...

  4. 神经网络,前向传播FP和反向传播BP

    1 神经网络 神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入.例如,下图就是一个简单的神经网络: 我们使用圆圈来表示神经网络的输入,标上“”的圆 ...

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

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

  6. 关于 RNN 循环神经网络的反向传播求导

    关于 RNN 循环神经网络的反向传播求导 本文是对 RNN 循环神经网络中的每一个神经元进行反向传播求导的数学推导过程,下面还使用 PyTorch 对导数公式进行编程求证. RNN 神经网络架构 一个 ...

  7. NLP教程(3) | 神经网络与反向传播

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

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

    minimize.m:共轭梯度法更新BP算法权值 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Carl Edward Rasmussen在高斯机器学 ...

  9. MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合

    2.1 案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模.在这种情况下,可以建立BP神经网络表达这些非线性系统.该方法把未知系统看成是一个黑箱,首先用 ...

随机推荐

  1. ceph-RGW Jewel版新概念

    一.概述 zone: 包含多个RGW实例的一个逻辑概念.zone不能跨集群,同一个zone的数据保存在同一组pool中: zonegroup:一个zonegroup如果包含一个或多个zone,如果包含 ...

  2. 在Linux上yum安装运行Redis,只能安装2.4.10(主从)

    Installing Redis on CentOS 6.4 First, install the epel repo sudo rpm -Uvh http://download.fedoraproj ...

  3. iOS 一个小动画效果-b

    近期工作不忙,来一个需求感觉棒棒的,是一个比较简单的页面,如下图(图1) 图1 应该很简单吧,没什么大的功能,就是一个展示,一个拨打电话,拨打电话不需要说,几行代码搞定,基本UI也不用说了,刚培训完的 ...

  4. github上完成个人的站点搭建

    未完待续 很早就想有一个自己的站点了,可是我买不起服务器,不想研究WordPress,ect.无意间,博主发现了github居然可以实现自己梦想,加之网络上的资料偏旧(或则说github+jekyll ...

  5. struts系列:校验(三)国际化

    一.设置国际化资源标识 struts可以通过request_locale参数来进行国际化参数设置 例如页面可以通过如下链接完成语言切换: <s:a href="locale.actio ...

  6. java中基础数据类型的应用

    1.float 与 double float是单精度类型,占用4个字节的存储空间  double是双精度类型,占用8个字节的存储空间  1)当你不声明的时候,默认小数都用double来表示,所以如果要 ...

  7. SeqGAN 原理简述

    1. 背景GAN在之前发的文章里已经说过了,虽然现在GAN的变种越来越多,用途广泛,但是它们的对抗思想都是没有变化的.简单来说,就是在生成的过程中加入一个可以鉴别真实数据和生成数据的鉴别器,使生成器G ...

  8. [转]Java的文件读写操作

    file(内存)----输入流---->[程序]----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStr ...

  9. django后台使用MySQL情况下的事务控制详解

    写在前面: 默认情况下django会把autocommit设置为“1”也就是说所针对数据库的每一次操作都会被做成“单独”的一个事务:这样的处理好处就在于它方便, 在编程的时候可以少写一些代码,比如我们 ...

  10. 用python做网页抓取与解析入门笔记[zz]

    (from http://chentingpc.me/article/?id=961) 事情的起因是,我做survey的时候搜到了这两本书:Computational Social Network A ...