人工智能的问题在于他实在让人捉摸不透。——文森特
非凸优化问题
数学中,如二维曲线 y = x 2 y=x^2 y=x2,当 x = 0 x=0 x=0时, y y y存在极小值 y m i n = 0 y_{min}=0 ymin=0。而求解该最小值,利用导数 y ′ = 2 x y^{'}=2x y′=2x,令 y = 0 y=0 y=0,有 x = 0 x=0 x=0即可。
对于高维空间变量,求解难度有所增加,如非凸优化问题中,高维变量(如三维变量)
如上图中三个变量,假设红色为 x x x轴,绿色为 y y y轴,蓝色为 z z z轴。此时,已经处于 x x x方向的最低点,但是 y y y方向不是最低点,而我们优化的目的在于寻找局部最小值(每一维度熵都需要处于最低点),那么上图很明显不满足要求。但是每一维度都处于最低点也是以概率 p p p发生的极低事件,假设100个变量,那么全部处于最低点概率为 p 100 p^{100} p100。
针对该问题的可解决方式有周期性调整学习率——循环学习率和带热重启的随机梯度下降。
-
循环学习率
将学习率在一个区间内周期性先增大、再缩小。
设每一个周期迭代次数为 2 Δ T 2\Delta T 2ΔT,即增大时间占前 Δ T \Delta T ΔT,缩小时间占前 Δ T \Delta T ΔT.对于第 t t t次迭代,循环周期次数 m = ⌊ 1 + t 2 Δ T ⌋ m=⌊1+\frac{t}{2\Delta T}⌋ m=⌊1+2ΔTt⌋,学习率为 α t = α m i n m + ( α m a x m − α m i n m ) ( 1 − m a x ( 0 , 1 − b ) ) \alpha_t = \alpha_{min}^m + (\alpha_{max}^m-\alpha_{min}^m)(1-max(0,1-b)) αt=αminm+(αmaxm−αminm)(1−max(0,1−b)),其中 α m i n m \alpha_{min}^m αminm和 α m a x m \alpha_{max}^m αmaxm为第 m m m个周期的学习率下界限与上界限, b = ∣ t Δ T − 2 m + 1 ∣ b=|\frac{t}{\Delta T} - 2m+1| b=∣ΔTt−2m+1∣。
α t = α m i n m + ( α m a x m − α m i n m ) ( 1 − m a x ( 0 , 1 − b ) ) \alpha_t = \alpha_{min}^m + (\alpha_{max}^m-\alpha_{min}^m)(1-max(0,1-b)) αt=αminm+(αmaxm−αminm)(1−max(0,1−b))该公式,从不精确的角度来讲,当 t Δ T \frac{t}{\Delta T} ΔTt为偶数时,学习率取下界,当 t Δ T \frac{t}{\Delta T} ΔTt为奇数时,学习率取上界。 -
带热重启的随机梯度下降
该方法的原理为将学习率每隔一定周期后重新设值,再进行学习率衰减。
其中 T c u r T_{cur} Tcur为上一次重启之后的epoch数量, T m = T m − 1 × 放大因子 T_m= T_{m−1} × 放大因子 Tm=Tm−1×放大因子
此外,还有AdaGrad算法、RMSprop算法、AdaDelta算法等用于调整学习率。
优化算法
小批量梯度下降
为了减轻对计算资源的压力,一般不采取同时将所有训练集进行训练,而是分批次进行。
若神经网络函数为 f ( x ; θ ) f(x;\theta) f(x;θ), θ \theta θ为网络参数,小批量的意思为每次选取训练集中的部分数据进行训练,如训练集用 s s s表示,那么选取 n n n个样本表示为 s n = { x t , y t } t = 1 n s_n=\{x^t,y^t\}_{t=1}^n sn={
xt,yt}t=1n,则每次迭代时,损失函数关于参数 θ \theta θ的偏导数为
ϑ ( L θ ) = 1 n ∑ ( x , y ) ∈ s n ϑ L ( y , f ( x ; θ ) ) ϑ θ ϑ(Lθ)=1n∑(x,y)∈snϑL(y,f(x;θ))ϑθ ϑ(Lθ)=n1(x,y)∈sn∑ϑθϑL(y,f(x;θ))
更新参数 θ \theta θ为( t t t为迭代次数, α 为学习率参数 \alpha为学习率参数 α为学习率参数)
θ t = θ t − 1 − α ϑ ( L θ ) θt=θt−1−αϑ(Lθ) θt=θt−1−αϑ(Lθ)
PS:
批量大小对网络参数优化影响较大,批量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以设置较大的学习率.而批量大小较小时,需要设置较小的学习率,否则模型会不收敛。——邱锡鹏《神经网络与深度学习》
"随机梯度的方差越小"这句话可以浅理解为每次训练的样本数量越多,越接近每轮训练整个训练集的真实梯度,所以偏离的方差值更小。
学习率通常要随着批量大小的增大而相应地增大。线性缩放规则:批量增加n倍,学习率相应增加n倍。
确定的批次大小,决定了每次的 e p o c h epoch epoch值
1 e p o c h = t o t a l _ d a t a b a t c h _ s i z e I t e r a t i o n 1 \space epoch=\frac{total\_data}{batch\_size}Iteration 1 epoch=batch_sizetotal_dataIteration
Keskar N S, Mudigere D, Nocedal J, et al., 2016. On large-batch training for deep learning: Generalization gap and sharp minima[J]. arXiv preprint arXiv:1609.04836.
该论文指出批量越大,越有可能收敛到尖锐最小值;批量越小,越有可能收敛到
平坦最小值.
(该图来自——邱锡鹏《神经网络与深度学习》)
学习率调优
学习率在训练过程中并非一成不变,在训练后期接近收敛时,需要将学习率调小,以防止振荡发生,如
若处于上图中的 ( − 3.88 , 15.03 ) (-3.88,15.03) (−3.88,15.03),学习率过大,可能导致下图情形(紫色为更新过程,可以看见,难以回到最低点,左右振荡严重):
常见的调优的方法较多,有分段常数衰减、逆时衰减、指数衰减、自然指数衰减、余弦衰减等。
(不同学习率衰减方法的比较——该图来自邱锡鹏《神经网络与深度学习》)
训练初期不稳定的问题
网络模型在最初训练时,参数的初值由随机值设定,那么容易出现训练开始阶段不稳定,那么为了解决该问题,常用的方法——学习率预热。
学习率预热的原理为:
在训练阶段,将最初的几个epoch的学习率使用较小值,待训练较为稳定时,再使用最初设定的学习率,数学表达式为 α t ′ = m n α 0 , n ≥ m ≥ 1 \alpha_t^{'}=\frac{m}{n}\alpha_0,\space n \ge m \ge 1 αt′=nmα0, n≥m≥1,其中 n n n为最初的几个epoch数量, m m m为当前epoch次数。
转载:https://blog.csdn.net/qq_44116998/article/details/128885386