前向传播、反向传播并不是什么高深的数学知识,事实上,在大一的高数课程上就学了,只是到了神经网络这里套了新名词而已。
那么什么是前向传播、反向传播呢?这里先说结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。
前向传播
在正式介绍前向传播前,先简单介绍计算图(Computational Graph)的概念,以 可以用下面的有向无环图表示。
再简单说下前向传播,如下图(图片来自于 李飞飞 CS231n 2017 的课程),图右上角是 的计算图。
分别赋值 ,从计算图的左边开始,数据开始流动,依次计算出 。
最终得到计算图中那 6 个绿色的数字,这就是前向传播的结果。
文章开头给出的结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。
反向传播
我们说了,反向传播本质上是一种求梯度的高效方法。
那么什么是梯度(Gradient)?这里简单说下,梯度是一个向量,其指向的方向就是函数下降最快的方向,梯度向量由偏导数构成分量。
这里把思路捋一下:求损失函数最小值 → 梯度下降法 → 求梯度 → 求偏导数
那怎么求偏导数呢?学过高数的都知道,求导法则啊!比如说下面这个函数,
老汤说,这道题我拿到手就会算。可计算机不是人啊,那计算机是怎么做的呢,没错,就是计算图,通过链式法则(Chain Rule)一步步分解复杂函数,逐步求解。
回到前向传播的那个图,
我们要求偏导数 ,分解为:
提前说明:计算图中红色的数字是反向传播的结果。最右边的 怎么来的呢,
我们再对 求关于 的偏导,
再对 求关于 的偏导,
其他的不再赘述。
文章开头给出的结论:前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法。
这里也就不难理解了,反向传播其实就是将复杂函数(尽管例子中的函数并不复杂)的求导,分解成一个个小步骤。
一个复杂的例子
讲师 Serena Yeung 在课堂上给出了一个更复杂的例子,有兴趣可以去看看(传送门),不再赘述。
Patterns in Backward Flow
这里讨论计算图中不同函数结点(function node)的作用。
:获取上游梯度(upstream gradient),不改变任何值,传递分发给相连的分支
:获取上游梯度(upstream gradient),原值传递给相连的最大分支,〇传递给相连的最大分支外的其他分支
:获取上游梯度 ,则 ,