本文参考deeplearningbook.org一书第六章 6.5 Back-Propagation and Other Differentiation
Algorithms
反向传播算法分为两篇来讲,第一篇讲概念理解,第二篇用RNN简单推导。
第一篇就是本文 (一)反向传播算法理解 (Back-Propagation)
第二篇的链接(二)RNN 的 反向传播算法详细推导
下面我们就开始吧~
首先明确反向传播算法用来做什么:求梯度。
一、前向传播 foward propagation
“反向传播算法”,其中 反向 两个字顾名思义,先有一个前向的过程,才有反向一说。所以要搞懂反向传播之前,需先把前向传播弄清楚。简易地画了一个流程图如下:(图中的LOSS是一个实数值)。
上图中,前向传播路径是从输入到LOSS ,反向传播路径是从LOSS到参数(因为我们求梯度只要求参数的梯度就好了)。
前向和反向有两点不同的地方,一是方向相反,二是计算的内容不同,它两也有一样的地方,那就是一步步的向前走/向后走。反向传播求梯度就是一步步的求,而不是一步到位。
二、为什么要用反向传播算法求梯度
首先,我们可用数值法求得梯度(根据导数的定义来求解梯度),但是有个缺点,那就是参数多时,特别费时间,很慢。此方法排除。
再者,从输入到LOSS会有一个完整的函数表达式,直接根据这个函数式推导得到参数的导数表达式,再代入数值计算得到导数不就好了嘛。推导参数的导数表达式有两种方式,一是化简直接求导,二是链式求导。
假设 并且
,我们求 z 对 x 的导数:
直接求导: (式一)
链式求导: