课程视频地址:https://study.163.com/courses-search?keyword=CS231

课程主页:http://cs231n.stanford.edu/2017/

这一讲主要介绍反向传播以及神经网络。

反向传播

反向传播是计算梯度的一种方法,这种方法需要利用计算图,计算图的每个节点表示我们执行的每一步计算,例如上一讲介绍的损失函数的计算图如下

第一个节点计算得分${s}$,第二个节点计算折页损失,最后一个节点计算总损失(加上正则项)。

计算图的计算步骤分为前向传播以及反向传播,刚刚描述的步骤为前向传播,现在我们结合下图理解反向传播计算梯度的思路

对于每个节点,假设我们已知输出的梯度$\frac{\partial L}{\partial z}$,我们现在要计算输入的梯度$\frac{\partial L}{\partial x},\frac{\partial L}{\partial y}$,计算的思路很简单,利用链式法则,首先计算“局部梯度”$\frac{\partial z}{\partial x},\frac{\partial z}{\partial y}​$,然后利用链式法则可得

计算过程如下图所示

如果节点有多个输出$z_j$,那么输入的梯度$\frac{\partial L}{\partial x},\frac{\partial L}{\partial y}$需要累加,具体公式为

计算过程如下图所示

来看一个具体例子,我们要求如下函数的梯度

计算图如下

这里需要用到如下梯度计算公式

按照之前的方法,可以计算出每个节点的梯度如下所示

这里有个化简技巧,将上述一部分合并为一个sigmoid门

其中sigmoid函数为

从而

合并为sigmoid门后的计算图可以化简如下

反向流中的模式

下面看下不同运算符对于梯度的影响

从上图中不难发现如下规律

  • 加法门:梯度分配器(不改变梯度)
  • 最大值门:梯度路由器(保留最大值的梯度,较小值的梯度为$0$)
  • 乘法门:梯度交换器
向量化操作

下面把之前的结论推广到向量的形式,对于

$\frac{\partial f}{\partial x}​$就要改写为雅克比矩阵。

我们来看一个具体例子

给出如下记号

计算图如下

$f$关于$q_i​$求梯度可得

$q_k$关于$W_{i,j}​$求梯度可得

从而

$q_k$关于$x_i$求梯度可得

神经网络

神经网络实际上是第二讲介绍的得分函数的推广,例如如下例子

神经网络的灵感常被认为是来自于大脑的神经元细胞,如下图所示

神经网络的神经元也是类似结构,首先计算

然后经由激活函数得到输出,常用的激活函数如下所示