神经网络反向传播的数学原理
2016-12-01 12:54
746 查看
作者:李飞腾
链接:https://zhuanlan.zhihu.com/p/22473137
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果能二秒内在脑袋里解出下面的问题,本文便结束了。
已知:
,其中
。
求:
,
,
。
到这里,请耐心看完下面的公式推导,无需长久心里建设。
首先,反向传播的数学原理是“求导的链式法则” :
设
和
为
的可导函数,则
。
接下来介绍
矩阵、向量求导的维数相容原则
利用维数相容原则快速推导反向传播
编程实现前向传播、反向传播
卷积神经网络的反向传播
一个原则维数相容,实质是多元微分基本知识,没有在课本中找到下列内容,维数相容原则是我个人总结:
维数相容原则:通过前后换序、转置 使求导结果满足矩阵乘法且结果维数满足下式:
如果
,
,那么
。
利用维数相容原则解上例:
step1:把所有参数当做实数来求导,
,
依据链式法则有
,
,
可以看出除了
,
和
的求导结果在维数上连矩阵乘法都不能满足。
step2:根据step1的求导结果,依据维数相容原则做调整:前后换序、转置
依据维数相容原则
,但
中
、
,自然得调整为
;
同理:
,但
中
、
,那么通过换序、转置我们可以得到维数相容的结果
。
对于矩阵、向量求导:
“当做一维实数使用链式法则求导,然后做维数相容调整,使之符合矩阵乘法原则且维数相容”是快速准确的策略;
“对单个元素求导、再整理成矩阵形式”这种方式整理是困难的、过程是缓慢的,结果是易出错的(不信你试试)。
如何证明经过维数相容原则调整后的结果是正确的呢?直觉!简单就是美...
和
的导数,使用梯度下降(一阶GD、SGD,二阶LBFGS、共轭梯度等)优化目标函数。
接下来,展示不使用下标的记法(
,
or
)直接对
和
求导,反向传播是链式法则和维数相容原则的完美体现,对每一层参数的求导利用上一层的中间结果完成。
这里的标号,参考UFLDL教程 - Ufldl
前向传播:
(公式1)
(公式2)
为第
层的中间结果,
为第
层的激活值,其中第
层包含元素:输入
,参数
、
,激活函数
,中间结果
,输出
。
设神经网络的损失函数为
(这里不给出具体公式,可以是交叉熵、MSE等),根据链式法则有:
这里记
,其中
、
可由
公式1 得出,
加转置符号
是根据维数相容原则作出的调整。
如何求
? 可使用如下递推(需根据维数相容原则作出调整):
其中
、
。
那么我们可以从最顶层逐层往下,便可以递推求得每一层的
注意:
是逐维求导,在公式中是点乘的形式。
反向传播整个流程如下:
1) 进行前向传播计算,利用前向传播公式,得到隐藏层和输出层 的激活值。
2) 对输出层(第
层),计算残差:
(不同损失函数,结果不同,这里不给出具体形式)
3) 对于
的隐藏层,计算:
4) 计算各层参数
、
偏导数:
、
作为一个layer,激活函数
作为一个layer(如:sigmoid、relu、softplus、softmax)。
反向传播时分清楚该层的输入、输出即能正确编程实现,如:
(公式1)
(公式2)
(1)式AffineTransform/FullConnected层,以下是伪代码:
注: out_diff =
是上一层(Softmax 或 Sigmoid/ReLU的 in_diff)已经求得:
(公式 1-1)
(公式 1-2)
(公式 1-3)
(2)式激活函数层(以Sigmoid为例)
注:out_diff =
是上一层AffineTransform的in_diff,已经求得,
在实际编程实现时,in、out可能是矩阵(通常以一行存储一个输入向量,矩阵的行数就是batch_size),那么上面的C++代码就要做出变化(改变前后顺序、转置,把函数参数的Vector换成Matrix,此时Matrix out_diff 每一行就要存储对应一个Vector的diff,在update的时候要做这个batch的加和,这个加和可以通过矩阵相乘out_diff*input(适当的转置)得到。
如果熟悉SVD分解的过程,通过SVD逆过程就可以轻松理解这种通过乘积来做加和的技巧。
丢掉那些下标记法吧!
那么既然通过矩阵乘法,维数相容原则仍然可以运用,CNN求导比DNN复杂一些,要做些累加的操作。具体怎么做还要看编程时选择怎样的策略、数据结构。
快速矩阵、向量求导之维数相容大法已成。
链接:https://zhuanlan.zhihu.com/p/22473137
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果能二秒内在脑袋里解出下面的问题,本文便结束了。
已知:
,其中
。
求:
,
,
。
到这里,请耐心看完下面的公式推导,无需长久心里建设。
首先,反向传播的数学原理是“求导的链式法则” :
设
和
为
的可导函数,则
。
接下来介绍
矩阵、向量求导的维数相容原则
利用维数相容原则快速推导反向传播
编程实现前向传播、反向传播
卷积神经网络的反向传播
快速矩阵、向量求导
这一节展示如何使用链式法则、转置、组合等技巧来快速完成对矩阵、向量的求导一个原则维数相容,实质是多元微分基本知识,没有在课本中找到下列内容,维数相容原则是我个人总结:
维数相容原则:通过前后换序、转置 使求导结果满足矩阵乘法且结果维数满足下式:
如果
,
,那么
。
利用维数相容原则解上例:
step1:把所有参数当做实数来求导,
,
依据链式法则有
,
,
可以看出除了
,
和
的求导结果在维数上连矩阵乘法都不能满足。
step2:根据step1的求导结果,依据维数相容原则做调整:前后换序、转置
依据维数相容原则
,但
中
、
,自然得调整为
;
同理:
,但
中
、
,那么通过换序、转置我们可以得到维数相容的结果
。
对于矩阵、向量求导:
“当做一维实数使用链式法则求导,然后做维数相容调整,使之符合矩阵乘法原则且维数相容”是快速准确的策略;
“对单个元素求导、再整理成矩阵形式”这种方式整理是困难的、过程是缓慢的,结果是易出错的(不信你试试)。
如何证明经过维数相容原则调整后的结果是正确的呢?直觉!简单就是美...
快速反向传播
神经网络的反向传播求得“各层”参数和
的导数,使用梯度下降(一阶GD、SGD,二阶LBFGS、共轭梯度等)优化目标函数。
接下来,展示不使用下标的记法(
,
or
)直接对
和
求导,反向传播是链式法则和维数相容原则的完美体现,对每一层参数的求导利用上一层的中间结果完成。
这里的标号,参考UFLDL教程 - Ufldl
前向传播:
(公式1)
(公式2)
为第
层的中间结果,
为第
层的激活值,其中第
层包含元素:输入
,参数
、
,激活函数
,中间结果
,输出
。
设神经网络的损失函数为
(这里不给出具体公式,可以是交叉熵、MSE等),根据链式法则有:
这里记
,其中
、
可由
公式1 得出,
加转置符号
是根据维数相容原则作出的调整。
如何求
? 可使用如下递推(需根据维数相容原则作出调整):
其中
、
。
那么我们可以从最顶层逐层往下,便可以递推求得每一层的
注意:
是逐维求导,在公式中是点乘的形式。
反向传播整个流程如下:
1) 进行前向传播计算,利用前向传播公式,得到隐藏层和输出层 的激活值。
2) 对输出层(第
层),计算残差:
(不同损失函数,结果不同,这里不给出具体形式)
3) 对于
的隐藏层,计算:
4) 计算各层参数
、
偏导数:
编程实现
大部分开源library(如:caffe,Kaldi/src/{nnet1,nnet2})的实现通常把、
作为一个layer,激活函数
作为一个layer(如:sigmoid、relu、softplus、softmax)。
反向传播时分清楚该层的输入、输出即能正确编程实现,如:
(公式1)
(公式2)
(1)式AffineTransform/FullConnected层,以下是伪代码:
注: out_diff =
是上一层(Softmax 或 Sigmoid/ReLU的 in_diff)已经求得:
(公式 1-1)
(公式 1-2)
(公式 1-3)
(2)式激活函数层(以Sigmoid为例)
注:out_diff =
是上一层AffineTransform的in_diff,已经求得,
在实际编程实现时,in、out可能是矩阵(通常以一行存储一个输入向量,矩阵的行数就是batch_size),那么上面的C++代码就要做出变化(改变前后顺序、转置,把函数参数的Vector换成Matrix,此时Matrix out_diff 每一行就要存储对应一个Vector的diff,在update的时候要做这个batch的加和,这个加和可以通过矩阵相乘out_diff*input(适当的转置)得到。
如果熟悉SVD分解的过程,通过SVD逆过程就可以轻松理解这种通过乘积来做加和的技巧。
丢掉那些下标记法吧!
卷积层求导
卷积怎么求导呢?实际上卷积可以通过矩阵乘法来实现(是否旋转无所谓的,对称处理,caffe里面是不是有image2col),当然也可以使用FFT在频率域做加法。那么既然通过矩阵乘法,维数相容原则仍然可以运用,CNN求导比DNN复杂一些,要做些累加的操作。具体怎么做还要看编程时选择怎样的策略、数据结构。
快速矩阵、向量求导之维数相容大法已成。
相关文章推荐
- 神经网络反向传播的数学原理
- 神经网络反向传播梯度计算数学原理
- 神经网络反向传播的数学原理
- 基于反向传播的多层神经网络训练原理(翻译)
- 利用反向传播训练多层神经网络的原理
- 基于反向传播的多层神经网络训练原理
- 双层神经网络与逻辑回归正反向传播数学公式简要推导
- 再谈神经网络反向传播原理
- 反向传播神经网络极简入门
- 【机器学习】反向传播神经网络推导
- 神经网络误差反向传播
- 神经网络的前向传播和误差反向传播(NN,RNN,LSTM)(二)
- 反向传播神经网络(有代码)
- 机器学习笔记07:神经网络的反向传播(Backpropagation)
- 理解神经网络中的反向传播法
- CS231n 2016 通关 第四章-反向传播与神经网络(第一部分)
- C++从零实现深度神经网络之二——前向传播和反向传播
- 反向传播神经网络极简入门
- 神经网络中前向传播和反向传播解析
- 【模式识别】反向传播神经网络 BPNN