CS231 第四讲 介绍神经网络
课程视频地址: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$求梯度可得
神经网络
神经网络实际上是第二讲介绍的得分函数的推广,例如如下例子
神经网络的灵感常被认为是来自于大脑的神经元细胞,如下图所示
神经网络的神经元也是类似结构,首先计算
然后经由激活函数得到输出,常用的激活函数如下所示