深度学习之网络优化与正则化
视频链接:7.1 神经网络优化的特点_哔哩哔哩_bilibili
神经网络优化的特点
网络优化的难点
(1)网络结构差异大:不同模型之间的结构差异大——没有通用的优化算法、超参数多
(2)非凸优化问题:导致得到的最优解可能是全局最优解——参数如何初始化、如何逃离局部最优或鞍点
(3)梯度消失和爆炸问题:当网络非常深时,靠下的层的参数的梯度要么接近0,要么非常大,十分难优化
高维空间中的非凸优化问题
鞍点
低维空间中的非凸优化问题要解决的核心问题是如何逃离f'(x)=0的局部最优解
而在高维空间中的非凸优化问题要解决的核心问题是如何逃离鞍点
鞍点:梯度为0的点
鞍点在某些维度上是局部最小点,而在某些维度上是局部最大点
假设在D维空间中有一点为鞍点,在每一维上,如果它是一个非凸优化问题,基本上一个局部最低点与局部最高点的比例是1:1。因此在每个维度上一个梯度为0的点是局部最优点的概率为1/2,因此在D维空间的鞍点为全局最优点的概率为(1/2)^D
平坦最小值
在高维空间中,大部分的最小值都是平坦最小值,当参数冗余的时候,改变一个参数一般不会引起损失的大幅变化
由于局部最小解往往十分接近全局最优解,所以很多时候没必要去找全局最优解,反而是过于追求全局最优解可能会带来过拟合
优化地形的可视化
加入了残差连接的网络还可以使优化地形变得平滑
优化方法
优化算法改进
随机梯度下降(SGD)
对训练集中的样本进行随机排序,然后按照顺序每次取一个样本计算梯度,再反向传播更新参数至错误率不再下降
小批量随机梯度下降(MiniBatch)
每次取K个样本,更新是按步长更新,可以理解为把K个当成整体
批量大小(Batch Size)
与学习率的关系
当每次取K个样本、更新m次时,得到的Δ梯度如图左下角所示,可以看到这个式子是每次取batchsize为m的K个样本时的Δ梯度的m倍。为了使它们的步长差不多,学习率也要变成m倍。但是在实际应用中不需要过于追求线性关系,超参调整趋势大致一致就行
对收敛的影响
Iteration是更新一次,Epoch是整个数据集更新一次
如何改进
动态学习率
学习率衰减
周期性学习率调整
学习率不是一味的衰减,整体趋势是下降的,可以使模型更好地跳出sharp的局部最优点,得到更加平坦的局部最优点,增强模型的鲁棒性
左图是普通学习率调整,右图是周期性学习率调整(经过多个局部最优,方便找到更好地局部最优点)
其他学习率调整方法
(1)固定学习率调整批量大小,相当于减小了学习率
(2)先设置一个小的时间间隔,让学习率逐渐上升到预设点再开始衰减。因为参数初始化时的选点一般是未知的,梯度很不稳定,如果一开始就给一个大的学习率,是不利于稳定的优化的
自适应学习率
Adagrad:Gt是所有t的每一维度上的学习率的平方和,Gt随着训练次数增加而增加,学习率随之减小
RMSprop:把Gt从绝对的累计改成移动平均,β是超参数。移动平均的好处是:它不是历史上所有梯度的平方和,不会像Adagrad的Gt一样一直递增导致学习率过小
Adadelta:把分子也变成动态调整的,由上上次的ΔX的平方+上次参数更新方向的平方构成。好处是:例如某点梯度比较大,那么你可以试着学习率变大一点,多走一下,可以帮助更好的收敛
梯度方向优化
Momentum动量
图1是每次更新的轨迹,图2是加了动量后的轨迹,可以看到像图1这样在垂直方向上无意义的抖动,加上动量后上下抵消,有利于梯度的下降
Nesterov加速梯度
动量法的缺陷:动量法可以看作是两步走,第一步走历史的一小段,第二步走θt-1的梯度。把连接点看作θ’,那么第二步直接求θ‘处的梯度而不是θt-1的梯度,有利于梯度估计
Adam算法
移动平均和真正的平均是有差异的,所以需要偏差修正
例如在t=1时的移动平均如图所示,M0=0,则
但实际上M1是=g1的,所以需要偏差修正
梯度截断
当梯度过大时,就算是小的学习率也会走出很远,极可能错过最优解
参数初始化
对称权重问题
因为权重都为0,那么计算出来的两个激活值a1和a2也相等,所以误差也相等。进而导致,代价函数对两个参数的偏导数也相等,所以用梯度下降更新后的参数值也会相等,只是可能不为0,但还是一直保持相等,后续也都会这样,一直相等。所以这样的话,两条蓝色的线的权重会相等,红色的会相等,绿色的也会相等,所以这个神经网络计算不出什么有趣的函数,每一层的神经元都在进行着相同的计算,这是一种高度冗余的情况
预训练初始化
在大量数据上训练骨干网络(backbone),再到固定的数据集上做微调
固定值初始化
bias通常初始化为0;在forget gate中的bias需要设大一点,让门一直打开,这样梯度比较好计算
随机初始化
Gaussian分布与均匀分布
如何确定均值、方差、r取多少合适:
例如上图中,x∈(0, 1),将wx+b经过sigmoid后我们希望它落在左图蓝色的梯度较大的部分,通过这种方式取反推均值、方差、r应该取多少
范数保持性
因为 δ(l-1) = W(l).T * δ(l),而我们希望 δ(l-1) = δ(l),所以希望W * W.T为单位矩阵,从而引出两种方法:基于方差缩放的参数初始化与正交初始化
基于方差缩放的参数初始化
将参数优化到一个区间后,使整个网络的神经元的活性值的方差保持一致,可以使梯度在计算中不出现爆炸或消失
为了方便,我们将这一层网络的非线性去掉
假设a是从tanh激活函数得出来的,tanh函数是0中心化的,因此a(l-1)的期望为0。若随机取的w的期望也为0,那么a(l)的期望也为0(a与w独立)。此时a(l)的方差就等于l-1层的神经元个数×w(l)的方差×a(l-1)的方差。因为希望a(l)的方差与a(l-1)的方差相等,所以初始化w(l)的方差为1/M(l-1)。此时计算出的是前向传播的,如果加上反向传播,则w(l)的方差应初始化为2/M(l)+M(l-1),对应着表中Xavier初始化用tanh作为激活函数使的初始化结果
正交初始化
通常用于RNN的hidden state到hidden state的地方,因为很容易梯度爆炸或消失
数据预处理
尺度不变性
但是例如KNN这种模型就不具有尺度不变性
Q:不同输入特征的尺度差异较大时会有哪些问题?
A:例如y = w1x1 + w2x2 +b,当x1∈(0,1),x2∈(0,1000)时,由于x2的尺度较大,导致w2初始化时较小,导致w1与w2无法服从同一个分布
数据规范化对梯度的影响
数据规范化
从图中可以看到,标准归一化后不同的特征之间还是有相关性的,如果需要更加标准的规范化,可以用PCA做一个whitening(白化),把不同维度之间的相关性也给去掉
但是因为PCA的计算复杂度比较高,所以在实际应用中使用标准化就够了
Q:为什么不考虑标准化时某一维方差为0的情况?
A:若某一维方差为0,则代表这一维上的数据都相等,没有区分度,直接删去这个特征即可
逐层规范化
在两层神经网络之间,前一层可以作为feature输入给后一层,如果这个时候可以对前一层的输出做一个规范化,则可以改善参数的优化过程
内部协变量偏移
由于经过反向传播后的参数变了,从而导致两个层之间,前一层的输出数据分布改变了,也就是后一层的输入数据分布改变了,对于机器学习来说,不满足输入独立同分布,是一个无法解决的问题。这个数据分布变化就叫内部协变量偏移
解决外部协变量偏移则是迁移学习的目标
批量规范化(BatchNorm)
最后一个式子中的γ和β都是可学习的参数,表面规范化后还要经历一个缩放与平移
层规范化(LayerNorm)
看整层的神经元的均值与方差
BatchNorm VS LayerNorm
在CNN中BatchNorm用的多一些,在RNN中LayerNorm用的多一些
更多的规范化
以图像为例
Q:BatchNorm在训练时可以计算出均值和方差,但是在推理时的均值和方差如何得到呢?
A:由于在优化网络的时候,我们一般采用的是batch梯度下降。所以在训练过程中,只能计算当前batch样本上的mean和var。但是我们做的normalization是对于整个输入样本空间,因此需要对每个batch的mean, var做指数加权平均来将batch上的mean和var近似成整个样本空间上的mean和var.
而在测试Inference过程中,一般不必要也不合适去计算测试时的batch的mean和var,比如测试仅对单样本输入进行测试时,这时去计算单样本输入的mean和var是完全没有意义的。因此会直接拿训练过程中对整个样本空间估算的mean和var直接来用。此时对于inference来说,BN就是一个线性变换。
(29 封私信 / 81 条消息) 为什么batch normalization在训练和测试时使用的均值和方差的计算方式不同? - 知乎 (zhihu.com)
超参数优化
网格搜索
找一些根据经验判断,效果可能会比较好的参数进行一个个的组合试错
随机搜索
左边黄色的曲线与上边绿色的曲线可以代表超参数的取值对损失的影响
网格搜索在这里很容易错过效果比较好的超参取值,就像绿色的最高点对应的一列没有被点取到
而同样是取九个点,随机搜索在超参数的取值对损失影响较大的情况下往往会得到更好的结果
网络正则化
重新思考泛化性
神经网络往往是过度参数化的,也就是参数量大于数据量,在机器学习中,这种情况往往对应着你的模型泛化性极差,但是在神经网络中的泛化性却还算可以,这是为什么呢?
在传统机器学习中,泛化性与模型复杂度相关,但是这一套理论并不能直接照搬到神经网络上
实验证明,神经网络的泛化性可能不止来源于它本身,也有可能与优化方法(SGD等)有关;神经网络的能力非常强,可以记住足量的任何的单样本。但是它通常还是先去记一些更具一般性的规则或者模式,然后再去记一些更难的样本。也就是先总结规律而不是先记住数据
正则化
早停法
权重衰减
暂退法(Dropout)
当神经元数量足够多的时候会产生协同效应:两个神经元的行为可能是一致的,一起增大一起减小。这样会降低模型的能力,模型也会更脆弱
但是会出现一个问题:训练和测试时网络的输出不一致
解决办法:在测试时把x变成px,把每个神经元的活性降为p倍,相当于训练时的减少神经元数量
在RNN上
你在某一时刻丢掉这个,那么每个时刻都得要丢掉这个
l1和l2正则化
红框圈出的是经验风险:所有训练集上样本的损失的平均
若把式子写成下面这样,把范数函数看作约束条件,则可以通过拉格朗日法把约束写进优化函数中,就得到了上面的式子
l1与l2范数的意义如图
对优化产生的影响
F是经验风险
右图是l2正则化,图中画出的红色圈圈代表原始优化目标点周围的等高线,我们希望F也在虚线的约束范围之内,所以θ*一定是在它们相切的地方,这个点在F上的梯度与圆上的梯度正好相反
左图是l1正则化,很难找到一个点使在F上的梯度与边界线上的梯度正好相反,所以对于l1范数的θ*一般是落在坐标轴上
对网络产生的影响
正则化项系数越来越大,对模型的约束越强,模型泛化能力越强
与权重衰减的关系
数据增强
回译:英文先翻成中文再翻回英文
标签平滑
除了对x进行增强外,我们还可以对y进行增强
我们不需要正确的类别为1,我们只需要正确的类别比错误的类别大就行了,因此可以把正确类别扣去一个ε分给错误类别,让模型的预测结果逼近平滑后的y