CS231n系列课程Lecture 5:Train Neural Networks, Part 1

来源:互联网 发布:asp 网页访问数据库 编辑:程序博客网 时间:2024/05/16 17:30

第五课的链接: http://pan.baidu.com/s/1eS89t8e 密码: 79te

课程首先讲了两个误区:

1)卷积神经需要很多数据进行训练,这是错误的,通常情况下我们可以使用训练好的网络对其进行微调(finetune)就可以了。如果数据集的尺寸很小,可以直接改最后一层softmax分类器。如果数据集的尺寸中等,可以对网络进行微调,重新训练全部网络或对某些高层的网络进行训练。(例如:使用caffe model zoo)2)我们有无穷的计算能力,这其实是明显错误的。(LZ不会辛酸地说当时没有英伟达显卡时,是如何靠自己的小笔记本跑CNN的,简直是龟速),即使现在有了GPU加速,也不能任意地认为我们有无穷地计算能力,再好的GPU内存也是一定的,或者可以使用多个GPU对其训练(实验室好有钱。。。),反正LZ已经很感激有一块GPU可以使用了

训练神经网络

原视频中讲了一些神经网络的一点历史,LZ这里就不讲细节了。贴出时间节点,有兴趣的小伙伴可以自行搜索一下:

Frank Rosenblatt, ~1957:Perceptron

Widrow and Hoff, ~1960:Adaline/Madaline

Rumelhart et al. 1986:First time back-propagation became popular

Hinton and Salakhutdinov, 2006: Reinvigorated research in Deep Learning

值得注意的是神经网络的发展并不是一帆风顺的,其中也有过几次低潮时期。第一次是利用的是step函数作为激活函数,导致反向传播不可导,第二次是因为硬件问题在构建网络时,如果构建的网络太深,那么训练的时间开销就会非常的大。使用的激活函数是Sigmoid函数,会存在很多问题,这个在介绍激活函数的时候会具体讲到。知道后来ImageNet比赛上,卷积神经网络大获全胜,才又渐渐引起了大家的广泛关注,这个在第一节课的时候就提到了。

激活函数

刚开始接触神经网络的时候,LZ对激活函数是一点概念都木有,什么叫激活函数?这不仅仅是个函数的名称,对于神经元来说,是有不同的状态的,激活状态和非激活状态。激活函数其实就是针对一定的输入,在函数变化下满足一定的条件(通常激活状态的函数值是正数,在负数或为0的状态是不激活状态,因为在后续作为输入的话,不做出贡献),神经元被激活啦!

现在激活函数种类已经非常多了:Sigmoid,tanh,ReLU,Leaky ReLU,Maxout,ELU......其实各有各的特点。下面我们就简要的介绍一下:

Sigmoid函数

上面就是Sigmoid函数的介绍,右上角是Sigmoid函数的表达式,看过之前课程的应该对这个函数已经很熟悉了。这个函数的特点就是可以把原本无穷的范围缩小导(0, 1)之间,根据上节课求导时候可以得到(1- S)*S的形式,还是比较简单的一个表达形式的。但是这个函数也会存在很多问题。1)存在梯度消失,神马叫梯度消失?可以想象一下在x=10的时候,根据上图我们可以看到梯度趋向于0,上节课我们说过求反向传播的时候是(局部梯度*全局梯度),局部梯度趋向于0,那么最终反向传播的梯度也是趋向于0,那么经过的神经元越多,那么梯度最终可能会消失,那么继续优化也不会产生任何权重的更新了。2)Sigmoid的函数是非0中心的。

Q:如果x输入为正,那么关于权重的梯度是怎样的?
A:根据w的梯度是x乘以s的梯度,如果x是正数,且输出为正,那么w的梯度为正,如果输出为负,那么w的梯度为负。所以w的梯度要么全正要么全负,会出现zig zag现象,这就是为什么我们需要0均值的数据。而且在实际的训练过程中,如果数据不中心对称,那么收敛速度会很慢。所以一般在拿到数据的时候都会进行预处理,具体处理过程在后文中会讲到。

3)做指数运算计算的成本有点高

tanh函数

tanh函数就是Sigmoid函数一个变形,相当于两个Sigmoid函数的叠加,解决了中心对称的问题,但其他问题还是没有解决。

ReLU(Rectified Linear Unit)

ReLU是2012年才提出来的激活函数,可以看到ReLU不会像之前提到的两个函数会存在饱和状态,在输入大于0的情况下,梯度都是1,相当于把之前的梯度直接向前传递。在实际训练的过程中,它收敛的速度非常快(毕竟梯度在那里啊),但是它也存在几个问题:1)也不是0中心的输出。2)还有一个严重的问题,如果在输入为全负的情况下,所有的神经元相当于非激活状态,那么梯度又消失了!3)在0点的时候,是一个很尴尬的位置,虽然几率很小,但是0点的梯度是0还是1,这也是有些纠结的一个问题

Leaky ReLU and PReLU

这就是根据ReLU进行的一点改变,具体的定义也就是在输入为负数的时候设置了一定的梯度

ELU(Exponential Linear Units)

这是2015年才提出来的一个激活函数,主要存在的问题也还是需要指数计算。

Maxout

这是在2013年提出的一个激活函数,和我们之前见的激活函数好像不太一样。但是,我们可以从表达中看到这个激活函数有两套权重,大大增加了计算的复杂性。总结一下,其实在实际的应用中,还是使用ReLU的比较多,其它的函数可以自己去试一试,但是不要使用Sigmoid函数(真的缺点有点多)!

数据预处理

在实际应用中,数据预处理会有PCA(主成分分析法)和Whitening(白化)的方法对数据进行预处理,主成分分析法主要有两个性质:存在一个超平面,最近重构性(样本点到这个超平面的距离都足够近),最大可分性(样本点在这个超平面上的投影尽可能分开)。PCA其实就是对数据进行降维的一种方法,白化LZ一开始也是不明白,后来明白其实就是将数据进行归一化的一个操作。在实际的图片数据处理的时候,以CIFAR-10为例,图片是[32, 32, 3]的形式。在AlexNet是减去平均的图片,也就是算出这个32*32*3的均值,然后每个像素点减去这个均值。在VGGNet中是减去每个通道的均值,彩色图像通常是三通道,计算出每个通道的均值,在各个通道上减去该通道的均值。而在图像处理中,是很少见到使用PCA和Whitening这种方式的。

权重初始化

Q:如果初始化的是后我们把权重都设置为0,会出现神马情况?
A:这相当于是所有的神经元是等价的,因为输入乘以相同的权重,神经元都是一样的,没有区分性。

第一个想法是随机初始一个比较小的值,在实际应用在,在比较小的网络是可行的,但是会导致激活的层级之间是非齐次性分布,啥意思?

上图是一个10层的网络,每层有500个神经元,使用tanh非线性激活函数,初始化方式是(均值为0,标准差为1e-2的高斯分布),我们可以看到上图,从第三个图开始基本上神经元都是0。也就是说所有以tanh为激活函数的神经元输出都是0。

Q:考虑一下后向传播的梯度是神马样子的?
A:都会非常非常小,严重的话会出现梯度消失的现象。所以对于对初始值比较敏感的神经网络来说,初始化的方式是非常重要的。

现在通常使用的初始化方式是Xavier initialization。具体的细节可以看论文,我这里就贴出PPT了。

这是2010年的版本,出现上图情况的原因是并没有考虑tanh的非线性。但是Xavier初始化的方法在ReLU使用的时候却出现了问题。看下图,基本上最后的输出又都变成0了,没有保持之前层的分布特性,所以在2015年的时候又做了些改变。

这里在初始化的是后多了一个除以2,这是因为在使用ReLU的时候如果是0均值的分布,会有一般的神经元会被置0,除以2就能够很好的处理好这个问题。所以也有很多研究的学者会对参数的初始话方式进行相应的研究,好的初始话对训练的速度还是有很大影响的。

Batch Normalization

BN的概念是在2015年提出的,主要的是起到了正则化的效果,实验证明效果会比dropout要好。这里具体就不介绍公式了,在代码中使用就好了。

Hyperparameter Optimization

超参数的优化,在之前课程中我们已经讲过神马叫超参数了,可是怎么优化呢?一般都会选择交叉验证集进行调参,但是这样会比较慢,所以有经验的工程师可能就会凭借自己的第六感进行参数调整了。还有一个搜索策略的问题,一般情况下是有两种搜索策略,随机搜索(Random Search)和网格搜索(Grid Search),但是在实际操作中,随机搜索的效果会比网格效果好,为什么呢?

因为网格搜索,如果以二维搜索为例,它是在每一个维度上平均分配点的,但实际上每个维度对最终的结果做出的贡献是不一样的,即每个维度的权重是不相同的。要牢牢记住超参数的重要性是不均等的。这节课主要就是讲了怎么训练神经网络,当中LZ省略了部分学习的程序,小伙伴可以跟着对应的PPT看一下就明白了O(∩_∩)O
0 0