【Deep learning AI】 超参数调试、正则化与优化
超参数选择
layers
hidden units
learning rates
activation functions
数据集的设置经验
设置训练/交叉验证集/测试集
数据集很大 比如有一百万个数据, 验证集和测试集或许只拿1万出来即可 评估分类器的性能
98/1/1
没有测试集也可以
保证测试集与验证集是来自同一分布(比如训练集是网站上的猫,验证/测试则是用户手机照片的猫)
偏差与方差
trace-off 权衡
正则化
神经网络内对w参数进行正则化的表达式(L2正则化) 。
||w||^2 是矩阵内每一个元素的平方和,即计算每一层每一个单元的w平方和
往下是w的更新方式,也被称为权重衰减。
还有L1正则化,则是计算矩阵内每一个权重的模之和,会使神经网络变得稀疏因为某些参数w会变成0。
dropout正则化(随机失活)
设置每一层的某些隐藏单元以 p 的概率失活,构成一个比较小的神经网络进行样本学习。可以有效防止过拟合。
1.对权重矩阵比较大的层数使用drop out的概率较大
2.输入层若要使用则p要接近1.
3.使用dropout之后costfunction J就难以计算,建议先不用drop算出J的变化过程。
4.dropout大多在计算机视觉方向使用。
其他正则化
1.数据增强(data agumentation)
2.early stopping
绘制出dev error 和 traing error 的J,找出适中的点(即Jdev 和Jtrain都比较小的点)作为迭代次数。也即该迭代次数时的w
归一化输入
当不同特征的变化范围有很大不同时(比如0<x1<1,1000<x2<10000),我们需要使用归一化输入
将x1,x2的范围趋同
求出均值与其方差
梯度消失与梯度爆炸
直观感受:当训练一个深度 l 十分之大的网络的时候,假设参数矩阵只比1略小或者略大,此时输出将是参数矩阵的0.5^(l)或者是1.5^(l),以指数增长或者指数下降。
指数增长增长速度之快会导致梯度爆炸,最后的输出值会非常非常大,导致算法更新速度缓慢,梯度下降步长会很短
指数下降则会导致梯度消失,最后的输出极接近0。
梯度爆炸于梯度下降的解决办法参见:http://blog.****.net/qq_25737169/article/details/78847691
梯度数值逼近
使用数学的方法检测自己的梯度是否下降的正确
使用导数的定义法,求出其导数,于自己的后向传播算法进行比较。若相近则表明该梯度是正确的
梯度检验详解:http://blog.****.net/u012526120/article/details/48973497
Mini-batch
将训练分为多个子集X^{t}进行训练,在向量化的训练过程中则每次将一个子集送入神经网络进行学习。
假设总训练样本数为m,子集大小为1000 则子集个数为m/1000.也即是iterations的次数
将所有样本都遍历了一次则称为epoch。使用多次epoch希望自己的网络可以收敛到一个适合的范围。
iterations 和 epoch的区别 :http://blog.****.net/guotong1988/article/details/54694217
上图是使用Batch和mini-batch时候的区别
mini-batch在使用的时候Cost下降会有很大的噪声,因为可能某个batch很好运算,很符合当前的神经网络参数,而下一个batch则非常不符合,导致cost上涨。
当mini-batch size= m 的时候,即是Batch 梯度下降
当mini-batch size=1的时候,即叫随机梯度下降
随机梯度下降丢弃了向量化带来的便利,而同时梯度下降时也会有很大的噪声,不会到达最小值点而是在其附近不断扰动
当训练集的数量少于2000的时候,一般使用batch梯度下降
传统的mini-batch size:64 128 256 512.
尽量使用2的指数。
同时还要确保mini-batch 符合CPU/GPU的内存
1.指数加权平均
温度平均值:V 当天温度θt
V0=0
Vt=βVt-1 + (1-β)θt
V是1/(1-β) 天的平均移动值,ex:当β=0.5 时,V是两天的平均移动值(黄线),对气温的变化更加敏感。当β=0.98时,V是50天的平均移动值(绿线),曲线更加平滑。
当我们使用指数加权平均的时候,得到的会是紫色的线,因为开始时V0=0, v1=0.02θ1初期是非常非常小的值
我们使用右侧的偏差修正来计算指数加权平均值,当t->无穷 时, β^t --> 0。此时对后续日子的修正会非常非常小。
动量梯度下降(momentum)
当使用梯度下降时,梯度的变化经常上下抖动才到达最小值。我们希望梯度变化的方向在纵轴↑ 上慢一点,在横轴→上更快一点。这样就可以减少扰动更快地到达最小值。
由此产生了动量梯度下降法,其实现细节如上。初始化Vdw=Vdb=0,注意Vdw和dw的维度相同,Vdb也和db的维度相同。
β=0.9是比较好的超参数选择,因为他平均了最近10次的数据。
(1-β)dW 类似于加速度,使梯度可以获得动量
β相当于摩擦力 给Vdw不至于太快地下降。
RMSprop
大致于动量梯度下降相同,但实际内部操作如何还需要继续学习
Adam algorithm
结合了momentum和RMSprop 广泛适用于各个神经网络
其实现如上。
其中超参数包括:
α:学习率 经常需要调试的值,需要尝试不同的初始值。
β1:动量的参数,默认0.9
β2:RMSprop的参数,默认0.999
kesita:10^-8 默认值,无需调整,只是为了保证RMS数值稳定性。
学习率衰减
当使用固定的学习率的时候,梯度会在最小值附近很大的范围打转。
在训练初期我们的学习率可以很大,但在逐渐收敛的时候需要逐渐减少学习率,那么梯度则将会更加接近最小值。
常用的学习率衰减如下图
我们曾被自己三维想象力所困认为我们的算法很可能会进入一个局部最小值的范围。但事实并不会类似左图一样,如果有一个局部最小值,则其所有的维度都是凹函数,其概率非常非常的低。
我们所遇到的问题更可能是鞍型的图像,在一个方向是凹,另一个方向是凸函数。
鞍型问题会导致在平坦地区,我们的导数下降的会非常慢,接近0的步长后才会下降到最小值的问题。
Adam算法就可以较好的解决该问题。
超参数的调试
需要调试的超参数有:
学习率是第一个需要考虑的。
其次是:动量,隐藏单元数,Mini-batch size
最后:layer数,学习衰减数
在adam算法中就无需调试β1,β2和Σ的值。取默认即可
在调试之中,我们应该随机取样本点,因为我们无法事先知道那个超参数比较重要。假如是左侧采样的话那么我们就只取了5次比较重要的点。而右侧我们就取了25次不同的超参数1的点。
当在一个大范围内取值后,发现某个小范围内的取值对算法表现更好。我们应该适当缩小搜索超参数的范围,由粗至细搜索。
“超参数选择, Batch Norm 等内容”
超参数尺度
在对超参数进行随机挑选的时候,要注意尺度的问题。
当对神经网络层数 #layers 或者是神经元数 n 进行随机挑选的时候。变化范围都是线性尺度内,所以不必在意尺度的选择
当对类似学习率α,加权指数β(用1-β进行)变化范围在0.001-1之间的话,就必须使用对数尺度
从0.001-0.01-0.1-1的尺度进行挑选。
两种对模型的训练时的超参数修改
在训练模型时,需要不断地更改并找出最适合的超参数。这是我们有两个方法来达成我们的目的。
1.像熊猫一样照顾自己的模型。日日夜夜监视着自己的模型的迭代,当感觉良好时修改一下学习率,再看迭代情况如何,若表现更加良好则保留,表现较差则退回原状态修改成另一个参数。
2.像鱼一样对待自己的模型,用不同的参数并行训练自己的模型,找出一个Loss最小的模型作为自己的最终成果。这比较适合有强大CPU和GPU运算能力时使用。
对隐藏层的输出进行归一化(Batch Norm)
我们在对输入进行归一化处理的时候,可以发现其加速了模型的训练。
那么我们可不可以对隐藏层里的输出(作为下一层的输入)也进行归一化来加速模型的训练呢?
答案是可以的,称之为Batch Norm
计算出z(i)的均值μ---> 求出其均方差---> 求出Znorm(i)---->用Ztilde(i)代替Z(i)
其中γ和β都是可以进行学习的参数(利用梯度下降进行学习)
其作用是增大方差,使其不仅仅落在均值为0,方差为1的高斯区间内。
我们想要Z的取值范围尽可能大,不仅仅是在**函数的线性范围内。
Batch-Norm是在**函数之前进行的。
其实现方法如下
其中b因为在均方化之后自动被减掉了,所以是不存在的一项,可以令其为0
“Batch Norm”是如何工作的? 测试集中的“Batch-Norm”又是怎么一回事?
Softmax函数
当分类数多于2个的时候,就要使用到softmax层,编号为(0至C-1)
其softmax为一个**的函数,返回一个向量。**表达式如上,求上一个输出之和并求出 每个单元输出值所占的比率。即该种类的可能性。
Training a softmax layer
softmax的 loss function 为 如上形式,其实就是原本标签值的 -logYhat . 若要Loss 越小(越接近0) 则Yhat2必须接近1(接近原标签值1)。 若y2很小则其负的对数值将会变得很大。
使用深度学习框架 他会自己figure out 怎么进行BP。