[cs231n之第四课]Backprop

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

本课主要内容:

  1. 介绍计算图表的建立原理,推导反向传播中梯度的计算过程
  2. 神经网络的简介。
    这里写图片描述

回顾上节课,我们已经得到了线性得分函数f,以及各类的得分向量S,各个样本的损失函数Li,整体样本的损失函数L:样本损失函数值加上正则化项。为了求得最优解W,使得样本的损失函数最小,我们想要求得L对W的梯度。
这里写图片描述
梯度下降的优化方法有以下几种。
这里写图片描述
梯度的定义如下:
这里写图片描述
本课内容开始
计算图。我们用结点链接的形式将下列分类过程表示出来,每一个结点代表某个计算方法。
这里写图片描述
AlexNet的网络结构如下,输入图像,计算权值,优化权值,得到最小损失,得到分类结果。
这里写图片描述
这里写图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-32UYKYV8-1572932664984)(https://img-blog.csdn.net/20170815165142636?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
下面来过一遍,计算f函数中各个结点的梯度。使用反向传播的方法,求解每个结点的梯度。每一次只关注梯度流的输入值与局部梯度值的积,最后使用链式法则求得输出对某个结点的梯度。
这里写图片描述
如下图所示:
这里写图片描述
每个结点的梯度形状与输入相同。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0JJkogI-1572932664988)(https://img-blog.csdn.net/20170815165447294?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
我们可以把能确定梯度值的几个结点结合成为一个结点,例如sigmoid 函数。
这里写图片描述
反向传播流里的各个门结点的作用。
add门:梯度分流
max门:梯度路由
mul门:梯度转换
这里写图片描述
如果一个结点的输出有多个,那么它的梯度值也将由多个值影响。
这里写图片描述
计算图的应用:正向、反向传播
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUk71UsM-1572932664997)(https://img-blog.csdn.net/20170815165900598?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
这里写图片描述
代码如下:
这里写图片描述
例子-设计一个乘以常数的门,代码如下:
这里写图片描述
下面是Caffe里的sigmoid层,去看源码。
这里写图片描述
向量编程可以使得梯度计算非常简洁。
这里写图片描述
使用向量进行计算。如下图所示,输入向量为4096维,f是一个ReLU,输出向量为4096维。Jacobian矩阵的维数为40964096。
它是函数f对每一个x的分量求偏导,在这里,它形式上是一个对角线矩阵。
这里写图片描述
实践中,我们通常会把mini_batch的100个样本同时训练,那么输出得到的Jacobian矩阵维数就是409600
409600了。超级大啊,想想所有数据都能用得着吗?
这里写图片描述
人家的作业,自己实现一个SVM分类器。
这里写图片描述
总结:

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

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

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

这里写图片描述
几种激活函数如下。其中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也是常用的改进的方法。)

这里写图片描述
神经网络的结构如下:
这里写图片描述
这里写图片描述
这里写图片描述
设置神经网络的层数和大小。神经元的个数就是隐含层的层数,层数越深,效果越好。
这里写图片描述
不要使用神经网络的大小作为正则化项,使用更强的正则化项。
这里写图片描述
这里写图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值