反向传播
首先介绍一个概念:计算图。简单来说,计算图是一个函数的可视化表达,如下图:
其中每个节点代表一个计算。
利用计算图,我们可以很容易地使用反向传播的思想计算每个变量的梯度:
首先我们在每个运算后定义一个变量来保存其对应的运算结果,如上图的q和f;然后我们从后向前地分别计算每个运算结果对其上一级变量的导数,如df/dq、df/dz、dq/dx;依次这样做,直到到达了计算图的最前面,即输入数据处。此时计算结果对应输入数据的导数,即df/dx时,利用链式求导法则,只需一路将从f到x的路径上的导数相乘即可。
一个稍复杂的例子如下图:
值得注意的一点是,这里可以聚合几个运算,把它们视作一个运算进行处理。这是因为sigmoid函数的有着非常优美的求导结果。这种处理方式可以简化神经网络,或许也能减少算法的运算时间。
这里举出了一个包含矩阵的计算图计算的例子: