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

最新文章

  1. ARM Cortex-M0权威指南高清中文版pdf免费分享下载
  2. Python学习第一天 -- 简单的属性、 语法学习
  3. sql拼接一列数据
  4. Javascript事件模型系列(一)事件及事件的三种模型
  5. Spark Streaming源码解读之JobScheduler内幕实现和深度思考
  6. jsp的9大对象
  7. 17111 Football team
  8. kafka管理器kafka-manager部署安装
  9. Android实例-LocationSensor位置传感器(XE8+小米2)
  10. SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)
  11. 【Linux指令】使用中学习(一)
  12. Common Lisp Style Guide - Ariel Networks Labs
  13. "错: void 值不被忽略,因为预期"解决
  14. 从移动硬盘开机,引导VHD(Win10)
  15. 未能加载文件或程序集Newtonsoft.Json, Version=4.5.0.0
  16. SSM-Spring-05:Spring的bean是单例还是多例,怎么改变?
  17. priority_queue和sort应用
  18. Feature Extractor[content]
  19. 【转】wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用
  20. 从源码安装Node

热门文章

  1. Android上实现MVP模式的途径
  2. JsonPath小结
  3. rhel 7 设置默认运行级别为图形
  4. cucumber java从入门到精通(4)Scenario Outline及数据驱动
  5. TF 设置GPU模式训练
  6. 温故而知新 Ajax 的新坑 dataType: 'json'
  7. C#基础第八天-作业答案-设计类-面向对象方式实现两个帐户之间转账
  8. U811.1接口EAI系列之六--物料上传--VB语言
  9. 跨系统-跨数据库访问表或创建映射视图-PB访问数据库的特殊处理
  10. IOS App 后台运行