目录
初学神经网络的同学,碰到反向传播算法章节时通常有些困惑,这篇文章不求张本继末,但能让读者思路逐渐清晰便可。要理解反向传播算法,需要先学习一下前向模式求导 和 反向模式求导。
一、前向模式求导
首先我们用图来表示计算式 g=((a+1)+b)*(b+c) :
(图1)
若令变量a=5、b=3、c=1,则上图可表示为:
(图2)
接下来我们对上图路径上的每一个子算式求偏导:
d=a+1
e=d+b
f=b+c
g=e*f
(图3)
根据导数的定义(高等数学第二章):
可知 通常可以理解为因变量随自变量的变化率,即当自变量 d 变化1个单位,因变量 e 随之变化1个单位,同理 则表示自变量 e 变化1个单位,因变量 g 随之变化5个单位。
那么,按照图中的关联关系,是否 呢?
(图4)
由图可见,从 b 节点到 e 节点有两条路径 ① b->e->g 和 ② b->f->g,所以 g 的变化除了由b、e决定,还有f, 我们需要将所有的路径都考虑进去:
✔
即:路径上所有的边相乘,所有的路径相加。
若从 x 到 y 有n=9条路径, 求 ,如下图所示:
(图5)
则 ----------------------- (1)
相当于是集合 {i, j, k} 和集合 {h, m, n}的笛卡尔积,于是(1)式又可以写成:
----------------------- (2)
上面(2)式可理解为 先求 x 对 y 的总影响 (i+j+k) ,再求 y 对 z 的总影响(h + m +n) ,最后综合在一起,这便是前向模式求导,(图5)可显示成如下形式:
(图6)
(图3)用前向模式求导以(图6)的方式表示如下:
(图7)
二、反向模式求导
反向模式求导是从后向前,先求 y 对 z 的影响(h + m +n) ,再求 x 对 y 的影响(i+j+k) ,然后相乘(h + m +n)*(i+j+k):
(图8)
前向模式求导追踪一个输入如何影响每一个节点,对每一个节点进行 操作;反向求导模式追踪每一个节点如何影响一个输出,对每一个节点进行 操作。
(图2)用反向模式求导以(图8)的方式表示如下:
(图9)
无论是前向还是反向模式求导,计算时记得将同一可达路径相乘(上图黄色方框内),不同可达路径相加即可。
三、小结
图7 和 图9 一个是前向模式求导,一个是反向模式求导,两者区别如下:
1)图7 和 图9 中椭圆形框内,图7每一个椭圆形框内求得的只是对 b 的偏导,而 图9 椭圆形框内求得的是 g 对输入a、b、c的偏导;
2)从计算时间复杂度来讲,图7 计算g 对所有输入a、b、c的偏导需计算三次 ,, (图7只计算了 ),图9 反向求导只计算了一次/遍,就得到三个输入的偏导 ,, ;
由此可见,反向模式求导可以极大减少计算次数,加速机器学习效率,当我们训练神经网络时,神经网络的权重参数可以是百万甚至过亿级别,因此反向求导模式可以极大的加速学习。