【深度学习】CS231n系列课程Lecture 5:Train Neural Networks, Part 1
发布时间:2026/10/22 1:00:57来源:尧图企业网站定制
第五课的链接: 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:PerceptronWidrow and Hoff, ~1960:Adaline/MadalineRumelhart et al. 1986:First time back-propagation became popularHinton and Salakhutdinov, 2006: Reinvigorated research in Deep Learning值得注意的是神经网络的发展并不是一帆风顺的其中也有过几次低潮时期。第一次是利用的是step函数作为激活函数导致反向传播不可导第二次是因为硬件问题在构建网络时如果构建的网络太深那么训练的时间开销就会非常的大。使用的激活函数是Sigmoid函数会存在很多问题这个在介绍激活函数的时候会具体讲到。知道后来ImageNet比赛上卷积神经网络大获全胜才又渐渐引起了大家的广泛关注这个在第一节课的时候就提到了。激活函数刚开始接触神经网络的时候LZ对激活函数是一点概念都木有什么叫激活函数这不仅仅是个函数的名称对于神经元来说是有不同的状态的激活状态和非激活状态。激活函数其实就是针对一定的输入在函数变化下满足一定的条件通常激活状态的函数值是正数在负数或为0的状态是不激活状态因为在后续作为输入的话不做出贡献神经元被激活啦现在激活函数种类已经非常多了SigmoidtanhReLULeaky ReLUMaxoutELU......其实各有各的特点。下面我们就简要的介绍一下Sigmoid函数上面就是Sigmoid函数的介绍右上角是Sigmoid函数的表达式看过之前课程的应该对这个函数已经很熟悉了。这个函数的特点就是可以把原本无穷的范围缩小导(0, 1)之间根据上节课求导时候可以得到(1- S)*S的形式还是比较简单的一个表达形式的。但是这个函数也会存在很多问题。 1存在梯度消失神马叫梯度消失可以想象一下在x10的时候根据上图我们可以看到梯度趋向于0上节课我们说过求反向传播的时候是局部梯度*全局梯度局部梯度趋向于0那么最终反向传播的梯度也是趋向于0那么经过的神经元越多那么梯度最终可能会消失那么继续优化也不会产生任何权重的更新了。 2Sigmoid的函数是非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 NormalizationBN的概念是在2015年提出的主要的是起到了正则化的效果实验证明效果会比dropout要好。这里具体就不介绍公式了在代码中使用就好了。Hyperparameter Optimization超参数的优化在之前课程中我们已经讲过神马叫超参数了可是怎么优化呢一般都会选择交叉验证集进行调参但是这样会比较慢所以有经验的工程师可能就会凭借自己的第六感进行参数调整了。还有一个搜索策略的问题一般情况下是有两种搜索策略随机搜索Random Search和网格搜索Grid Search,但是在实际操作中随机搜索的效果会比网格效果好为什么呢因为网格搜索如果以二维搜索为例它是在每一个维度上平均分配点的但实际上每个维度对最终的结果做出的贡献是不一样的即每个维度的权重是不相同的。要牢牢记住超参数的重要性是不均等的。 这节课主要就是讲了怎么训练神经网络当中LZ省略了部分学习的程序小伙伴可以跟着对应的PPT看一下就明白了O(∩_∩)O