[cs231n之第四课]Backprop

课程地址:
http://www.bilibili.com/video/av13260183/index_1.html#page=4
课件地址:
http://cs231n.stanford.edu/slides/2017/

本课主要内容:

  1. 介绍计算图表的建立原理,推导反向传播中梯度的计算过程
  2. 神经网络的简介。
    [cs231n之第四课]Backprop

回顾上节课,我们已经得到了线性得分函数f,以及各类的得分向量S,各个样本的损失函数Li,整体样本的损失函数L:样本损失函数值加上正则化项。为了求得最优解W,使得样本的损失函数最小,我们想要求得L对W的梯度。
[cs231n之第四课]Backprop
梯度下降的优化方法有以下几种。
[cs231n之第四课]Backprop
梯度的定义如下:
[cs231n之第四课]Backprop
本课内容开始
计算图。我们用结点链接的形式将下列分类过程表示出来,每一个结点代表某个计算方法。
[cs231n之第四课]Backprop
AlexNet的网络结构如下,输入图像,计算权值,优化权值,得到最小损失,得到分类结果。
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop
下面来过一遍,计算f函数中各个结点的梯度。使用反向传播的方法,求解每个结点的梯度。每一次只关注梯度流的输入值与局部梯度值的积,最后使用链式法则求得输出对某个结点的梯度。
[cs231n之第四课]Backprop
如下图所示:
[cs231n之第四课]Backprop
每个结点的梯度形状与输入相同。
[cs231n之第四课]Backprop
我们可以把能确定梯度值的几个结点结合成为一个结点,例如sigmoid 函数。
[cs231n之第四课]Backprop
反向传播流里的各个门结点的作用。
add门:梯度分流
max门:梯度路由
mul门:梯度转换
[cs231n之第四课]Backprop
如果一个结点的输出有多个,那么它的梯度值也将由多个值影响。
[cs231n之第四课]Backprop
计算图的应用:正向、反向传播
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop
代码如下:
[cs231n之第四课]Backprop
例子-设计一个乘以常数的门,代码如下:
[cs231n之第四课]Backprop
下面是Caffe里的sigmoid层,去看源码。
[cs231n之第四课]Backprop
向量编程可以使得梯度计算非常简洁。
[cs231n之第四课]Backprop
使用向量进行计算。如下图所示,输入向量为4096维,f是一个ReLU,输出向量为4096维。Jacobian矩阵的维数为4096*4096。
它是函数f对每一个x的分量求偏导,在这里,它形式上是一个对角线矩阵。
[cs231n之第四课]Backprop
实践中,我们通常会把mini_batch的100个样本同时训练,那么输出得到的Jacobian矩阵维数就是409600*409600了。超级大啊,想想所有数据都能用得着吗?
[cs231n之第四课]Backprop
人家的作业,自己实现一个SVM分类器。
[cs231n之第四课]Backprop
总结:

神经网络非常大,不可能手动计算每个参数的梯度; 反向传播=递归地应用链式法则求解计算图上每个结点的梯度值;
应用于图结构,在每个结点上应用前向反向传播API; 前向:计算图结构上的每个结点的值,并保存在内存(回头计算梯度要用呢);
反向:利用链式法则计算损失函数值对输入的梯度;

[cs231n之第四课]Backprop
下面开始神经网络的内容。下图表示一个两层的神经网络。第一层是一个线性分类器,第二层是ReLU。最后输出一个10维的向量。
[cs231n之第四课]Backprop
下图可以表示一个三层的神经网络,事实上,可以加无数层,这就是深度学习的来源。
[cs231n之第四课]Backprop
实现一个二层神经网络的代码如下:
[cs231n之第四课]Backprop
使用神经网络来模拟生物神经元的行为。神经元的**在这里,由sigmoid函数模拟。
[cs231n之第四课]Backprop
但是神经网络是有别于生物的神经网络的。
生物学的神经元有以下特性:

很多类别;
突触不是单个的权值而是复杂的非线性的动态系统(好难理解);
ratecode不合适。(?这里不明白是什么意思)

[cs231n之第四课]Backprop
几种**函数如下。其中sigmoid 和双曲正切函数tanh是饱和的**函数,ReLU是非饱和的。

(用ReLU代替了传统的Tanh或者Logistic。好处有:
1. ReLU本质上是分段线性模型,前向计算非常简单,无需指数之类操作;
2. ReLU的偏导也很简单,反向传播梯度,无需指数或者除法之类操作;
3. ReLU不容易发生梯度发散问题,Tanh和Logistic**函数在两端的时候导数容易趋近于零,多级连乘后梯度更加约等于0;
4. ReLU关闭了右边,从而会使得很多的隐层输出为0,即网络变得稀疏,起到了类似L1的正则化作用,可以在一定程度上缓解过拟合。
当然,ReLU也是有缺点的,比如左边全部关了很容易导致某些隐藏节点永无翻身之日,所以后来又出现pReLU、random ReLU等改进,而且ReLU会很容易改变数据的分布,因此ReLU后加Batch Normalization也是常用的改进的方法。)

[cs231n之第四课]Backprop
神经网络的结构如下:
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop
设置神经网络的层数和大小。神经元的个数就是隐含层的层数,层数越深,效果越好。
[cs231n之第四课]Backprop
不要使用神经网络的大小作为正则化项,使用更强的正则化项。
[cs231n之第四课]Backprop
[cs231n之第四课]Backprop