神经网络反向传播的数学原理

2017 年 9 月 22 日 AI研习社 李飞腾

本文原作者李飞腾,本文整理自知乎专栏——数字编程。AI 研习社已获得转载授权。

如果能二秒内在脑袋里解出下面的问题,本文便结束了。

已知:,其中

求:

到这里,请耐心看完下面的公式推导,无需长久心里建设。

首先,反向传播的数学原理是 “求导的链式法则” :

的可导函数,则

接下来介绍

  • 矩阵、向量求导的维数相容原则

  • 利用维数相容原则快速推导反向传播

  • 编程实现前向传播、反向传播

  • 卷积神经网络的反向传播

  快速矩阵、向量求导

这一节展示如何使用链式法则、转置、组合等技巧来快速完成对矩阵、向量的求导

一个原则维数相容,实质是多元微分基本知识,没有在课本中找到下列内容,维数相容原则是我个人总结:

维数相容原则:通过前后换序、转置 使求导结果满足矩阵乘法且结果维数满足下式:

如果 ,那么

利用维数相容原则解上例:

step1:把所有参数当做实数来求导,

依据链式法则有

可以看出除了的求导结果在维数上连矩阵乘法都不能满足。

step2:根据 step1 的求导结果,依据维数相容原则做调整:前后换序、转置

依据维数相容原则,但,自然得调整为

同理:,但,那么通过换序、转置我们可以得到维数相容的结果

对于矩阵、向量求导:

  • “当做一维实数使用链式法则求导,然后做维数相容调整,使之符合矩阵乘法原则且维数相容” 是快速准确的策略;

  • “对单个元素求导、再整理成矩阵形式” 这种方式整理是困难的、过程是缓慢的,结果是易出错的(不信你试试)。

如何证明经过维数相容原则调整后的结果是正确的呢?直觉!简单就是美...

  快速反向传播

神经网络的反向传播求得 “各层” 参数的导数,使用梯度下降(一阶 GD、SGD,二阶 LBFGS、共轭梯度等)优化目标函数。

接下来,展示不使用下标的记法()直接对求导,反向传播是链式法则维数相容原则的完美体现,对每一层参数的求导利用上一层的中间结果完成。

这里的标号,参考 UFLDL 教程 - Ufldl(http://t.cn/zTOSOPP)

前向传播:

 (公式 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 复杂一些,要做些累加的操作。具体怎么做还要看编程时选择怎样的策略、数据结构。

快速矩阵、向量求导之维数相容大法已成。


新人福利



关注 AI 研习社(okweiwu),回复  1  领取

【超过 1000G 神经网络 / AI / 大数据,教程,论文】



深度学习要另起炉灶,彻底抛弃反向传播?

▼▼▼

登录查看更多
3

相关内容

反向传播一词严格来说仅指用于计算梯度的算法,而不是指如何使用梯度。但是该术语通常被宽松地指整个学习算法,包括如何使用梯度,例如通过随机梯度下降。反向传播将增量计算概括为增量规则中的增量规则,该规则是反向传播的单层版本,然后通过自动微分进行广义化,其中反向传播是反向累积(或“反向模式”)的特例。 在机器学习中,反向传播(backprop)是一种广泛用于训练前馈神经网络以进行监督学习的算法。对于其他人工神经网络(ANN)都存在反向传播的一般化–一类算法,通常称为“反向传播”。反向传播算法的工作原理是,通过链规则计算损失函数相对于每个权重的梯度,一次计算一层,从最后一层开始向后迭代,以避免链规则中中间项的冗余计算。
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
干货书《数据科学数学系基础》2020最新版,266页pdf
专知会员服务
319+阅读 · 2020年3月23日
机器学习速查手册,135页pdf
专知会员服务
341+阅读 · 2020年3月15日
《深度学习》圣经花书的数学推导、原理与Python代码实现
一文搞懂反向传播
机器学习与推荐算法
18+阅读 · 2020年3月12日
面试时让你手推公式不在害怕 | 梯度下降
计算机视觉life
14+阅读 · 2019年3月27日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
机器之心最干的文章:机器学习中的矩阵、向量求导
深度学习世界
12+阅读 · 2018年2月7日
CNN 反向传播算法推导
统计学习与视觉计算组
30+阅读 · 2017年12月29日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
PCA的基本数学原理
算法与数学之美
11+阅读 · 2017年8月8日
Neural Approaches to Conversational AI
Arxiv
8+阅读 · 2018年12月13日
Arxiv
3+阅读 · 2018年10月25日
Arxiv
5+阅读 · 2018年5月21日
Arxiv
4+阅读 · 2018年4月10日
Arxiv
22+阅读 · 2018年2月14日
VIP会员
相关资讯
一文搞懂反向传播
机器学习与推荐算法
18+阅读 · 2020年3月12日
面试时让你手推公式不在害怕 | 梯度下降
计算机视觉life
14+阅读 · 2019年3月27日
基于Numpy实现神经网络:反向传播
论智
5+阅读 · 2018年3月21日
机器之心最干的文章:机器学习中的矩阵、向量求导
深度学习世界
12+阅读 · 2018年2月7日
CNN 反向传播算法推导
统计学习与视觉计算组
30+阅读 · 2017年12月29日
干货 | 深度学习之CNN反向传播算法详解
机器学习算法与Python学习
17+阅读 · 2017年11月21日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
PCA的基本数学原理
算法与数学之美
11+阅读 · 2017年8月8日
相关论文
Neural Approaches to Conversational AI
Arxiv
8+阅读 · 2018年12月13日
Arxiv
3+阅读 · 2018年10月25日
Arxiv
5+阅读 · 2018年5月21日
Arxiv
4+阅读 · 2018年4月10日
Arxiv
22+阅读 · 2018年2月14日
Top
微信扫码咨询专知VIP会员