前向传播、反向传播并不是什么高深的数学知识,事实上,在大一的高数课程上就学了,只是到了神经网络这里套了新名词而已。

那么什么是前向传播、反向传播呢?这里先说结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。

前向传播

在正式介绍前向传播前,先简单介绍计算图(Computational Graph)的概念,以 y=wx+by=w*x+b 可以用下面的有向无环图表示。

w
*
x
+
b
y

再简单说下前向传播,如下图(图片来自于 李飞飞 CS231n 2017 的课程),图右上角是 f(x,y,z)=(x+y)zf(x, y, z)=(x+y)*z 的计算图。

Gotcha! 理解前向传播、反向传播

分别赋值 x=2y=5z=4x = -2,y = 5, z = -4,从计算图的左边开始,数据开始流动,依次计算出 qfq、f

最终得到计算图中那 6 个绿色的数字,这就是前向传播的结果。

文章开头给出的结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。

反向传播

我们说了,反向传播本质上是一种求梯度的高效方法。

那么什么是梯度(Gradient)?这里简单说下,梯度是一个向量,其指向的方向就是函数下降最快的方向,梯度向量由偏导数构成分量。

这里把思路捋一下:求损失函数最小值 → 梯度下降法 → 求梯度 → 求偏导数

那怎么求偏导数呢?学过高数的都知道,求导法则啊!比如说下面这个函数,

Gotcha! 理解前向传播、反向传播
老汤说,这道题我拿到手就会算。可计算机不是人啊,那计算机是怎么做的呢,没错,就是计算图,通过链式法则(Chain Rule)一步步分解复杂函数,逐步求解。

回到前向传播的那个图,

Gotcha! 理解前向传播、反向传播

我们要求偏导数 fx\frac{\partial f}{\partial x},分解为:

fx=fqqx\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q} \cdot \frac{\partial q}{\partial x}

提前说明:计算图中红色的数字是反向传播的结果。最右边的 11 怎么来的呢,ff=1\frac{\partial f}{\partial f}=1

我们再对 ff 求关于 qq 的偏导,fq=z=4\frac{\partial f}{\partial q}=z=-4

再对 qq 求关于 xx 的偏导,qx=1\frac{\partial q}{\partial x}=1

其他的不再赘述。

文章开头给出的结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。

这里也就不难理解了,反向传播其实就是将复杂函数(尽管例子中的函数并不复杂)的求导,分解成一个个小步骤。

一个复杂的例子

讲师 Serena Yeung 在课堂上给出了一个更复杂的例子,有兴趣可以去看看(传送门),不再赘述。
Gotcha! 理解前向传播、反向传播

Patterns in Backward Flow

这里讨论计算图中不同函数结点(function node)的作用。

add gateadd \ gate:获取上游梯度(upstream gradient),不改变任何值,传递分发给相连的分支

max gatemax\ gate:获取上游梯度(upstream gradient),原值传递给相连的最大分支,〇传递给相连的最大分支外的其他分支

mul gatemul\ gate:获取上游梯度 2.002.00,则 8.00=4.002.00-8.00 = -4.00 * 2.006.00=3.002.006.00 = 3.00 * 2.00

Gotcha! 理解前向传播、反向传播

相关文章: