一.深度学习与神经网络的区别
首先放上我们上一篇文章的图,由神经网络到深度学习有哪些改变。
二.目标函数
在神经网络中,我们用到的损失函数为均方误差,而在深度学习中,我们大部分都是用交叉熵来作为损失函数的。
选择交叉熵作为损失函数的原因主要是,交叉熵变化的速率更快,能使参数较快的迭代。
三.Softmax层
Softmax层的作用是突出“最大值”并转换成概率的形式。
四.梯度消失
神经元的激活函数采用Sigmoid函数,则大部分情况下|w|<1,而Sigmoid的导数<0.25。
五.激活函数
2006年,人们用RBM预训练的方式解决梯度消失的问题,到了2015年,人们用RELU激活函数。下图为RELU激活函数的坐标图。
采用RELU激活函数后,一些单元的输出成了0,而另一些则成了完全线性的单元。从而避免了调整各层权重时的“梯度消失”问题。
六.学习步长
学习步长的设置是个难题,若学习步长过大,则目标函数可能不降低,但若学习步长过小,则训练过程可能非常缓慢。
解决办法:训练几轮后就按一些因素调整学习步长。
七.优化器
在神经网络中,我们用的优化器大部分为SGD,但是SGD存在着很多问题。
比如learning rate也就是学习步长不易确定,若选择太小,收敛速度会很慢;如果太大,loss function就会在极小值处不停的震荡甚至偏离。
每个参数的learning rate都是相同的,如果数据是稀疏的,则希望对出现频率低的特征进行大一点的更新。
深层神经网络之所以比较难训练,并不是因为容易进入局部最小,而是学习过程容易陷入到马鞍面中,在这种区域,所有方向的梯度值都几乎是0.
所以在优化器中,我们加入了动量,使学习中我们可以脱离马鞍面,继续进行梯度下降。
1.Momentum(动量)
Momentum借用了物理中的动量概念,即,前几次的梯度也会参与计算。
为了表示动量,引入了一个新的变量v。v是之前梯度的累加,但每回合都有一定的衰减。
前后梯度方向一致时,能够加速学习;前后梯度方向不一致时,能够抑制震荡。
2.Nesterov Momentum
对Momentum的一种改进,先对参数进行估计,然后使用估计后的参数来计算误差。
3.Adagrad
Adagrad认为应该为不同的参数设置不同的学习步长。
梯度越小,则学习步长越大,反之亦然。
4.RMSprop
RMSprop是一种改进的Adagrad,通过引入一个衰减系数,让r每回合都衰减一定比例。
这种方法很好的解决了Adagrad过早结束的问题,适合处理非平稳目标,对于RNN效果很好。
5.Adam
Adam这个名字来源于adaptive moment estimation,自适应矩估计。
Adam本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
6.各种梯度下降算法的比较
总结:1.若数据是稀疏的,就用自适应方法,即Adagrad,Adadelta,RMSprop,Adam
2.RMSprop,Adadelta,Adam在很多情况下的效果是相似的。通常,Adam是最好的选择
3.很多论文里都会用SGD,没有momentum等。SGD虽然也能达到极小值,但是比其他算法用的时间长,而且可能会被困在鞍点。
4.SGD相对稳定,可以自己调
关于算法选择的建议:
1.首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑SGD+Nesterov Momentum或者Adam
2.选择熟悉的算法,这样可以更加熟练的利用经验进行调参
3.充分了解数据,若模型是非常稀疏的,那么优先考虑自适应学习率的算法
4.根据需求来选择,在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam;在模型上线或者发布前,可以用精调的SGD进行模型的极致优化。
5.先用小数据集进行试验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小关系不大。因此可以先用一个具有代表性的小数据集进行试验。
6.考虑不同算法的组合。先用Adam进行快速下降。而后再换到SGD进行充分的调优。
7.数据集一定要充分的打散。这样在使用自适应学习率算法的时候,可以避免特征集中出现而导致有时学习过度,有时学习不足,使得下降方向出现偏差的问题。
8.训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练;对实验数据的监控是为了避免出现过拟合。
9.制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次,或者利用精度或AUC等性能指标来监控。
八.Batch Normalization
1.由来:
在CNN训练时,绝大多数都采用基于mini-batch的随机梯度下降算法为基础的算法进行训练。随着输入数据的不断变化,及网络中参数不断调整,网络的各层输入数据的分布则会不断变化。则各层在训练的过程中就需要不断地改变以适应这种新的数据分布,从而造成网络训练的困难,难以拟合的问题。
2.Batch Nomalization的步骤:
在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1.最后的"scale and shift"操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入。
九.过适应
1.避免过适应
只要在训练集图片中稍加一些噪声,学习机就不能做出正确的判断。
过适应的根本原因:权重参数太多,而样本量不足。
如何避免过适应:(1)早期停止训练
(2)权重衰减
(3)Dropout
(1)早期停止训练
当目标函数在“验证集”上不再减小时,训练就应该停止了。不能一味追求“训练集”的误差减小。
(2)权重衰减
有些权重是“无用的”。
原梯度下降的公式:
经过“权重衰减”后的公式:
(3)Dropout
每次更新参数前,按一定的比例删减部分神经元。删减后整个网络变得“更瘦”。本质上,Dropout就是用一小块数据来训练一系列“子网络”。Dropout是“集成学习”的一种。
测试时,使用所有的神经元,且权重应根据删减比例缩小。
十.卷积神经网络(CNN)
1.CNN的基本组件
卷积层(Convolutional layer)
激活函数(Sigmoid,ReLU,......)
池化层(Pooling layer)
平均池化(Average pooling)
最大化池化(Mas pooling)
全连接层(Fully-Connected layer)
2.CNN卷积层
3通道(RGB)输入图片>>3D tensor
3D滤波器/卷积核
(2)每层含有多个核,每个核对应一个输出通道
(3)提取局部特征
(4)权重参数需要学习
3D滤波器/卷积核的超参数
(1)滤波器/卷积核数量(output number)
(2)核尺寸(kernel size)
(3)步长(stride)
(4)零填充(zero padding)
尺寸计算(W,H,D)
(1)W = ( W - size + 2 * padding ) / stride + 1
(2)H = ( H - size + 2 * padding ) / stride + 1
(3)D = output number
CNN卷积层原理演示
非线性激活函数
(1)Sigmoid
(2)ReLU(Rectified Linear Unit)
ReLU激活函数
分段线性函数
无饱和问题,明显减轻梯度消失问题
深度网络能够进行优化的关键
组合简例
卷积步长大于1,有降维作用
3.CNN池化层
作用:特征融合,降维
无参数需要学习
超参数
(1)尺寸
(2)步长
(3)计算类别
最大化池化
平均池化
4.CNN-Softmax层
指数归一化函数
将一个实数值向量压缩到(0,1)
所有元素和为1
最后一个全连接层对接1000-way的softmax层
得出1000类标签的概率值
用于构建loss
5.复习下上节课的部分内容
6.池化层的误差反向传播
当接在卷积层的下一层为池化层,已知池化层残差,则卷积层的残差计算方法为:
假设第 l-1 层为卷积层,第 l 层为池化层,池化层的残差为,卷积层的残差为 有:
假设卷积层的矩形大小为4×4,池化后得到的矩形大小为2×2
先考虑mean-pooling:得到的卷积层应该是4×4大小,其值分布为(等值复制)左图:
由于需要满足反向传播时各层间残差总和不变,所以卷积层对应每个值需要平摊:
除以pooling区域大小即可,这里pooling层大小为2×2=4,
最后的卷积层值分布为右图:
再考虑max-pooling,则需要记录前向传播过程中pooling区域中最大值的位置,
这里假设pooling层值1,3,2,4对应的pooling区域位置分别为右下,右上,左上,左下
则此时对应卷积层误差敏感值分布为:
7.卷积层运算
假设我们要处理如下的卷积操作:
这个操作乍看完全不同于全连接层的操作,可以把卷积操作表示成下面的等式:
卷积操作一般是要把卷积核旋转180度再相乘的,但由于CNN中的卷积参数本来就是训练过程”学“出来的,所以旋不旋转,关系其实不大
8.卷积层运算的展开表示
左边青色的神经元表示a11到a33,中间橙色的表示z11到z22
注意:青色和橙色神经元之间的权值连接用了不同的颜色标出,紫色线表示w11,蓝色线表示w12,以此类推。
9.卷积层的误差反向传播
假设是前一层经过某些操作后得到的输出,即,同时也是本层的输入。
可能是激活函数,也可能是pooling层等,无论哪种操作,都可以用来表示。
根据链式法则:
根据前面展开的卷积操作的等式,这个导数其实比全连接层更容易求
如果把所有式子都写出来,就会发现可以用一个卷积运算来计算所有
跟原始的BP不同的是,这里需要将后一层的误差写成矩阵的形式,并用0填充到合适的维度。
注意:这里不再是跟矩阵相乘,而是先将旋转180度后,再跟其做卷积运算。
假设第 l-1 层(池化层)有N个通道,即有N张特征图。第 l 层(卷积层)有M个特征, l-1层中每个通道图都对应有自己的残差。
第 l 层中第 j 个核对第 l-1 层第 i 个通道的残差计算方法为:
另外因为这里默认池化层是线性激励函数,所以后面没有乘相应节点的导数
第 l-1 层某个通道图,大小为3×3,第 l 层有2个特征核,核大小为2×2,则在前向传播卷积时第 l 层会有2个大小为2×2的卷积图。
假设2个特征核分别为:
反向传播求误差敏感项时,假设已经知道第l层2个卷积图的残差:
经过padding后的矩阵和对应的核进行卷积的结果如下:
第 l-1 层中每个通道图都对应有自己的残差,其计算依据为第l层所有特征核的贡献之和。
即,求第 i 个通道的残差时需要将第 l 层的所有核都计算一遍,然后求和
本质上还是BP算法,只不过这里是有重叠的,第 l-1 层中某个点会对第 l 层中的多个点有影响。