array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 深层神经网络和卷积神经网络的反向传播过程推导 - 爱码网

反向传播过程是深度学习的核心所在,虽然现在很多深度学习架构如Tensorflow等,已经自带反向传播过程的功能。我们只需要完成网络结构的正向传播的搭建,反向传播过程以及参数更新都是由架构本身来完成的。但为了更好的了解深度学习的机理,理解反向传播过程的原理还是很重要的。

在学习完吴恩达的深度学习课程后,对浅层神经网络的反向传播有了一个很清楚的认识。但在课程中对于深层神经网络和卷积神经网络反向传播过程,只给出了反向传播的公式。并没有给出具体的推导过程,所以在这一块之前一直不是很明白。通过最近几天的研究算是大体弄明白了整个过程,接下来写一下自己的心得体会和理解。

深层神经网络的反向传播过程

首先,为了量化预测结果的好坏。我们使用损失函数这样一个评价指标,来衡量预测结果与真实标签值之间的误差情况。

深层神经网络和卷积神经网络的反向传播过程推导

这里给出的是范数形式的损失函数,损失函数当然还可以有其他形式,例如交叉熵形式的等等。但损失函数的自变量都是网络结构中的参数,也就是说只与网络结构中的参数有关。

例如在这里w表示深层神经网络中所有权重参数的集合,b是每一层神经网络中的偏差,n是样本数量,x是神经网络的输入量,y是预测值,a是标签。前向传播过程:深层神经网络和卷积神经网络的反向传播过程推导,**函数深层神经网络和卷积神经网络的反向传播过程推导

反向传播过程的推导与偏导数有关,并且都是基于链式法则进行的,接下来进行梯度下降法的推导:

1.首先是误差函数C关于输出层的L中每一个元素的偏导数

深层神经网络和卷积神经网络的反向传播过程推导

根据链式法则:

深层神经网络和卷积神经网络的反向传播过程推导

由于在前向传播过程中,**函数深层神经网络和卷积神经网络的反向传播过程推导

所以可以简化成:

深层神经网络和卷积神经网络的反向传播过程推导

上式左边项为损失函数C关于输出层L**值也就是预测值的偏导数。例如,如果损失函数C是二次项的形式,那么关于预测值的偏导数的值:

深层神经网络和卷积神经网络的反向传播过程推导

实际过程中这一项都是由损失函数决定的。

用矩阵形式来表示输出层L所有元素的偏导数:

深层神经网络和卷积神经网络的反向传播过程推导

上式第一项是损失函数C关于预测值的梯度向量,中间这个运算符叫做哈达玛(Hadamard)乘积,用于矩阵或向量之间点对点的乘法运算:

深层神经网络和卷积神经网络的反向传播过程推导

第二项是**函数关于输出层深层神经网络和卷积神经网络的反向传播过程推导各元素导数构成的向量

2.中间层各层的偏导数:

深层神经网络和卷积神经网络的反向传播过程推导层第j个元素的偏导数:

深层神经网络和卷积神经网络的反向传播过程推导

由于第深层神经网络和卷积神经网络的反向传播过程推导层中的k个输出值深层神经网络和卷积神经网络的反向传播过程推导都含有深层神经网络和卷积神经网络的反向传播过程推导这一项,所以在第二行展开过程中根据函数求导法则,需要对深层神经网络和卷积神经网络的反向传播过程推导的k个偏导数进行求和运算。

又由于:

深层神经网络和卷积神经网络的反向传播过程推导

求中深层神经网络和卷积神经网络的反向传播过程推导代表第深层神经网络和卷积神经网络的反向传播过程推导层参数矩阵w的第k行第j列的元素

求导后得到:

深层神经网络和卷积神经网络的反向传播过程推导

代入得到:

深层神经网络和卷积神经网络的反向传播过程推导

写成向量形式:

深层神经网络和卷积神经网络的反向传播过程推导

3.参数w及偏置b的偏导数:

深层神经网络和卷积神经网络的反向传播过程推导

写成单个元素的形式:

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导

4.总结

深层神经网络和卷积神经网络的反向传播过程推导

卷积神经网络的反向传播过程

由于CNN的运算过程与DNN不一样,所以CNN的反向传播过程也有所不同。

首先简单介绍一下CNN的计算过程:

(1)卷积运算过程

之后的反向传播的推导也需要用到这个图,记为图1

深层神经网络和卷积神经网络的反向传播过程推导

                                                                                                图1

图1描述的是CNN卷积核进行卷积的过程,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小,这里假设步长为1。

(2)池化运算过程

深层神经网络和卷积神经网络的反向传播过程推导

上图所示的是最大池化,类似于卷积核在图片上的移动,这里是不断取核中4个值最大的那个值最为输出。平均池化与之类似,只不过输出的是四个位置的平均值。

(3)全连接层网络

全连接层的网络计算与之前DNN中的计算一样

CNN与DNN的不同

1.池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导深层神经网络和卷积神经网络的反向传播过程推导,这个推导方法和DNN完全不同。

2.卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的深层神经网络和卷积神经网络的反向传播过程推导递推计算方法肯定有所不同。

3.对于卷积层,由于W使用的运算是卷积,那么从深层神经网络和卷积神经网络的反向传播过程推导推导出该层的所有卷积核的W,b的梯度方式也不同。

对于这三个问题,我们一个一个来解决

已知池化层的深层神经网络和卷积神经网络的反向传播过程推导推导上一层的深层神经网络和卷积神经网络的反向传播过程推导,这个过程一般称为upsample

假设池化的size为2*2,深层神经网络和卷积神经网络的反向传播过程推导

                                                                       深层神经网络和卷积神经网络的反向传播过程推导

由于池化size为2*2,首先将size还原:

                                                                         深层神经网络和卷积神经网络的反向传播过程推导

假设是最大池化,并且之前记录的最大值的位置为左上,右下,右上,左下。那么深层神经网络和卷积神经网络的反向传播过程推导:

                                                 深层神经网络和卷积神经网络的反向传播过程推导

解释下为什么要这么做,在正向传播的时候,池化之前的四个最大值位置左上,右下,右上,左下,都以比例为1的系数传递到下一层。而其他位置对输出的贡献都为0,也就是说对池化输出没有影响,因此比例系数可以理解为0。所以在正向传播的过程中,最大值所在位置可以理解为通过函数f(x)=x传递到下一层,而其他位置则通过f(x)=0传递到下一层,并且把这些值相加构成下一层的输出,虽然f(x)=0并没有作用,但这样也就不难理解反向传播时,把深层神经网络和卷积神经网络的反向传播过程推导的各个值移到最大值所在位置,而其他位置为0了。因为由f(x)=x,最大值位置的偏导数为1,而f(x)=0的偏导数为0。

如果平均池化,那么深层神经网络和卷积神经网络的反向传播过程推导

                                         深层神经网络和卷积神经网络的反向传播过程推导

平均池化的话,池化操作的四个位置传递到下一层的作用可以等价为f(x)=x/4,所以在方向传播过程中就相当于把深层神经网络和卷积神经网络的反向传播过程推导每一个位置的值乘1/4再还原回去。

所以由深层神经网络和卷积神经网络的反向传播过程推导推导深层神经网络和卷积神经网络的反向传播过程推导可以总结为:

深层神经网络和卷积神经网络的反向传播过程推导

等式右边第一项表示上采样,第二项是**函数的导数,在池化中可以理解为常数1(因为池化过程的正向传播过程中没有**函数)。

已知卷积层的深层神经网络和卷积神经网络的反向传播过程推导推导上一层的深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导

首先由链式法则:

                                                              深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导代表对卷积核进行翻转180°的操作,深层神经网络和卷积神经网络的反向传播过程推导为**函数的导数。这里比较难理解的是为什么要对卷积核进行180°的翻转。

假设我们深层神经网络和卷积神经网络的反向传播过程推导层的输出深层神经网络和卷积神经网络的反向传播过程推导是一个3x3矩阵,第深层神经网络和卷积神经网络的反向传播过程推导层的卷积核W是一个2x2矩阵,采用1像素的步幅,则输出深层神经网络和卷积神经网络的反向传播过程推导是一个2x2的矩阵。这里暂时不考虑偏置项b的影响。

那么可得:

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导

展开:

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导的梯度:

深层神经网络和卷积神经网络的反向传播过程推导

又由展开式:

深层神经网络和卷积神经网络的反向传播过程推导只与深层神经网络和卷积神经网络的反向传播过程推导有关,并且系数为深层神经网络和卷积神经网络的反向传播过程推导,所以:

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导只与深层神经网络和卷积神经网络的反向传播过程推导深层神经网络和卷积神经网络的反向传播过程推导有关,并且系数分别为深层神经网络和卷积神经网络的反向传播过程推导深层神经网络和卷积神经网络的反向传播过程推导所以:

深层神经网络和卷积神经网络的反向传播过程推导

同理:

深层神经网络和卷积神经网络的反向传播过程推导

使用矩阵形式表示就是:

深层神经网络和卷积神经网络的反向传播过程推导

这就解释了为什么在反向传播时需要将卷积核进行180°的翻转操作了。

已知卷积层的深层神经网络和卷积神经网络的反向传播过程推导推导w,b的梯度:

全连接层中的w,b的梯度与DNN中的推导一致,池化层没有w,b参数,所以不用进行w,b梯度的推导。

对于卷积层正向传播过程:

深层神经网络和卷积神经网络的反向传播过程推导

所以参数w的梯度:

深层神经网络和卷积神经网络的反向传播过程推导

注意到这里并没有翻转180°的操作:

因为由之前的展开式:

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导

所以w的梯度:

深层神经网络和卷积神经网络的反向传播过程推导

这也就是没有进行翻转的原因。

b的梯度:

这里假设w=0,那么z=b,梯度深层神经网络和卷积神经网络的反向传播过程推导是三维张量,而b只是一个向量,不能像普通网络中那样直接和深层神经网络和卷积神经网络的反向传播过程推导相等。通常的做法是将误差δ的各个子矩阵的项分别求和,得到一个误差向量所以这里b的梯度就是深层神经网络和卷积神经网络的反向传播过程推导的各个通道对应位置求和:

深层神经网络和卷积神经网络的反向传播过程推导

得到的是一个误差向量。

总结一下CNN的反向传播过程:

1 池化层的反向传播:

深层神经网络和卷积神经网络的反向传播过程推导

2 卷积层的反向传播

深层神经网络和卷积神经网络的反向传播过程推导

3 参数更新

深层神经网络和卷积神经网络的反向传播过程推导

深层神经网络和卷积神经网络的反向传播过程推导

相关文章: