神经网络中的优化方法(一)
目录
- 1. 与纯优化的区别
- 1.1 经验风险最小化
- 1.2 代理损失函数
- 1.3 批量算法和小批量算法
- 2. 神经网络中优化的挑战
- 2.1 病态
- 2.2 局部极小值
- 2.3 高原、鞍点和其他平坦区域
- 2.4 悬崖和梯度爆炸
- 2.5 长期依赖
- 2.6 非精确梯度
- 2.7 局部和全局结构间的弱对应
- 3. 基本算法
- 3.1 随机梯度下降(小批量算法)
- 3.2 动量
- 3.3 Nesterov动量
- 4. 参数初始化
- 参考
1. 与纯优化的区别
在大多数机器学习问题中,我们关注的某些性能度量 P P P,其定义在测试集上可能是不可解的,因此我们只能间接优化 P P P,希望通过降低代价函数 J ( θ ) J(\theta) J(θ)来提高 P P P。这一点与纯优化不同,纯优化直接最小化目标 J J J本身。训练深度模型的优化算法通常也会包括一些针对机器学习目标函数的特定结构进行的特化。
1.1 经验风险最小化
机器学习算法的目标是降低 J ( θ ) = E ( x , y ) ∼ p d a t a L ( f ( x ; θ ) , y ) \displaystyle \Large J(\theta)=E_{(x,y)\sim p_{data}}L(f(x;\theta),y) J(θ)=E(x,y)∼pdataL(f(x;θ),y)( p d a t a p_{data} pdata是真实分布)这个式子表示的期望泛化误差。但是由于不知道数据的真实分布,只知道训练集中的样本,因此将机器学习问题转化为一个优化问题的最简单方法是最小化训练集上的期望损失,即把上面式子中的真实分布 p d a t a p_{data} pdata替换为训练集上的经验分布 p ^ d a t a \hat{p}_{data} p^data。
经验风险最小化的公式为
E ( x , y ) ∼ p ^ d a t a [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ ) , y ( i ) ) . \displaystyle \Large E_{(x,y)\sim\hat{p}_{data}}[L(f(x;\theta),y)]=\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta),y^{(i)}). E(x,y)∼p^data[L(f(x;θ),y)]=m1i=1∑mL(f(x(i);θ),y(i)).
在一系列不同理论构造的条件下,最优化经验风险也能使真实风险的期望下降。然而经验风险最小化很容易导致过拟合,并且在很多情况下经验风险最小化并非真的可行。最有效的现代优化算法是基于梯度下降的,但是很多有用的损失函数如0-1损失没有有效的导数,因此在深度学习上很少使用经验风险最小化。
1.2 代理损失函数
有时,损失函数并不能被高效地优化,比如对于线性分类器来说,精确地最小化0-1损失通常是不可解的。在这种情况下,通常会优化代理损失函数,代理损失函数作为原目标的代理,还具备一些优点。比如正确类别的负对数似然通常替代0-1损失函数,负对数似然允许模型估计给定样本类别的条件概率,如果该模型效果好,那么它能够输出期望最小分类误差所对应的类别。
在某些情况下,代理损失函数比原函数学到的更多。比如,使用对数似然替代函数时,在训练集上的0-1损失达到0之后,测试集上的0-1损失还能持续下降很长一段时间。这是因为即使0-1损失期望为0时,还能拉开不同类别的距离以改进分类器的泛化能力,获得一个更强壮的,更值得信赖的分类器。相较于简单地最小化训练集上的平均0-1损失,它能够从训练数据中抽取更多的信息。
1.3 批量算法和小批量算法
机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。
比如最大似然估计问题可以在对数空间中分解成各个样本的总和:
θ M L = arg max θ ∑ i = 1 m l o g p m o d e l ( x ( i ) , y ( i ) ; θ ) . \displaystyle\Large \theta_{ML}=\argmax_{\theta}\sum_{i=1}^mlogp_{model}(x^{(i)},y^{(i)};\theta). θML=θargmaxi=1∑mlogpmodel(x(i),y(i);θ).
最大化这个总和等于最大化训练集在经验分布上的期望:
J ( θ ) = E ( x , y ) ∼ p ^ d a t a l o g p m o d e l ( x , y ; θ ) . \Large J(\theta)=E_{(x,y)\sim \hat{p}_{data}}logp_{model}(x,y;\theta). J(θ)=E(x,y)∼p^datalogpmodel(x,y;θ).
优化算法用到的目标函数 J J J中的大多数属性也是训练集上的期望,比如梯度:
▽ θ J ( θ ) = E ( x , y ) ∼ p ^ d a t a ▽ θ l o g p m o d e l ( x , y ; θ ) . \Large \triangledown_{\theta}J(\theta)=E_{(x,y)\sim\hat{p}_{data}}\triangledown_{\theta}logp_{model}(x,y;\theta). ▽θJ(θ)=E(x,y)∼p^data▽θlogpmodel(x,y;θ).
精确计算这个期望的代价很大,因为需要在整个数据集上的每个样本上评估模型。在实践中,可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。
n n n个样本均值的标准差为 σ n \displaystyle\frac{\sigma}{\sqrt{n}} nσ,其中 σ \sigma σ是样本值真实的标准差。分母 n \sqrt{n} n表明使用更多的样本来估计梯度的方法的回报是低于线性的。如果能够快速地计算出梯度的估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快。
在最坏的情况下,训练集中所有的 m m m个样本都是彼此相同的拷贝。基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来的做法少花了 m m m倍的时间。在实践中可以发现大量样本都对梯度做出了非常相似的贡献。
使用整个训练集的优化算法被称为批量梯度算法;每次只使用单个样本的算法称为随机算法或者在线算法;大多数用于深度学习的算法使用一个以上又不是全部的训练样本,这些算法被称为小批量算法或者小批量随机算法。
小批量算法的典型示例是小批量随机梯度下降。只要没有重复使用样本,小批量梯度下降算法将遵循着真实泛化误差的梯度。很多小批量梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。
2. 神经网络中优化的挑战
优化通常是一个极其困难的任务。传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度。在训练神经网络时,我们肯定会遇到一般的非凸情况。即使是凸优化,也并非没有问题。
2.1 病态
病态问题一般认为存在神经网络的训练过程中,具体体现在随机梯度下降会卡在某些情况,此时即使很小的更新步长也会增加代价函数。以代价函数的二级泰勒级数展开式来预测梯度下降中的 − ϵ g -\epsilon g −ϵg对代价函数产生的变化,代价函数会增加 1 2 ϵ 2 g T H g − ϵ g T g \displaystyle\frac{1}{2}\epsilon^2g^THg-\epsilon g^Tg 21ϵ2gTHg−ϵgTg这么多值。当 1 2 ϵ 2 g T H g \displaystyle \frac{1}{2}\epsilon^2g^THg 21ϵ2gTHg超过 ϵ g T g \epsilon g^Tg ϵgTg时,梯度的病态会成为问题。
在很多情况中,梯度范数 g T g g^Tg gTg和 g T H g g^THg gTHg不会在训练过程中显著缩小,但是 g T H g g^THg gTHg的增长会超过一个数量级,其结果就是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。
2.2 局部极小值
潜变量是模型用来隐式表示输入数据中的某些结构或关系的抽象特征。这些潜变量通常被认为是数据的低维表示或隐藏因子,能够有效地捕捉输入数据的核心信息,而无需直接建模所有显性变量。
如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型称为可辨认的。带有潜变量的模型通常是不可辨认的,因为通过相互交互潜变量就能得到等价的模型。对于神经网络而言,交换神经网络中某一层中单元 i i i和 j j j的传入权重向量和传出权重向量就可以得到等价的模型,这种不可辨认性称为权重空间对称性。除了权重空间对称性,神经网络还有其他导致不可辨认的原因。
神经网络的不可辨认性会导致神经网络的代价函数具有非常多甚至不可数无限多的局部极小值,并且这些局部极小值对应的代价函数值都相同。如果这些局部极小值相比全局最小值有很大的代价,那么这些局部极小值会使模型变得很糟糕。
对于实际网络,是否存在大量代价很高的局部极小值,优化算法是否会碰到这些局部极小值,都是尚未解决的公开问题。对于足够大的神经网络而言,大部分局部极小值都具有很小的代价函数,只需要在参数空间中找到一个代价很小的点。
2.3 高原、鞍点和其他平坦区域
对于高维非凸函数,局部极小值和局部极大值远少于另一类梯度为零的点——鞍点。鞍点附近的某些点可能比鞍点具有更大的代价,而其他点则具有更小的代价。尽管真实神经网络的损失函数中确实存在许多高代价的鞍点,梯度下降在许多情况下仍然能够有效地逃离这些鞍点,进而找到代价较小的区域,从而避免停留在高代价的鞍点附近。鞍点在高维非凸优化中是一个挑战。
2.4 悬崖和梯度爆炸
多层神经网络通常存在像悬崖一样的斜率较大区域,这是由于几个较大的权重相乘导致的。从上方接近斜率较大的悬崖结构时,梯度更新通常会很大程度地改变参数值,通常会完全跳过这类悬崖结构。从下方接近悬崖区域时,梯度会变得非常大,导致梯度爆炸,使得参数更新过于剧烈,进而使优化过程不稳定。
2.5 长期依赖
当计算图变得极深时,神经网络优化算法会面临另一个问题——长期依赖。由于变深的结构使得模型失去了学习到先前信息的能力,让优化变得困难。深层的计算图不仅存在于前馈神经网络,还存在于循环网络。因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图并且模型参数共享,这使得问题更加严重。
假设某个计算图中包含一条反复与矩阵 W W W相乘的路径,那么 t t t步后,相当于乘以 W t W^t Wt。假设 W W W有特征值分解 W = V d i a g ( λ ) V − 1 W=Vdiag(\lambda)V^{-1} W=Vdiag(λ)V−1,那么 W t = V d i a g ( λ ) t V − 1 W^t=Vdiag(\lambda)^tV^{-1} Wt=Vdiag(λ)tV−1。当特征值不在1附近时,若在量级上大于1则会梯度爆炸;若小于1则会梯度消失。
2.6 非精确梯度
大多数优化算法的先决条件都是知道精确的梯度或者Hessian矩阵,在实践中,通常这些量会有噪声,甚至有偏的估计。几乎每一个深度学习算法都需要基于采样的估计,至少使用训练样本的小批量来计算梯度。当目标函数不可解的时候,通常其梯度也是难以处理的,只能对梯度进行近似。
2.7 局部和全局结构间的弱对应
局部结构和全局结构的若对应问题在神经网络优化中影响深远,主要体现在优化路径的选择和最终解的质量上。局部结构指的是损失函数在小范围内的形态,例如局部最小值、鞍点或平坦区域,而全局结构则代表了损失函数在整个参数空间中的分布,包括全局最小值、局部极小值、鞍点和极大值。
局部结构的性质直接影响了优化过程:
1. 局部的梯度信息引导优化器的更新方向,若局部极小值或鞍点处的梯度信息不明显,可能导致优化器陷入这些不理想的区域,影响全局优化的搜索效率。
2. 在局部结构中,梯度爆炸或消失可能导致优化过程变得不稳定,尤其是在接近悬崖或鞍点时,局部的不平衡梯度变化会阻碍有效的全局探索。
3. 局部极小值可能与全局最小值相差很大,优化器如果停留在这些局部最小值,可能导致无法找到全局最优解。过参数化的神经网络通常通过局部极小值更容易接近全局极小值,但仍需通过优化算法有效避免不良局部极值。
3. 基本算法
3.1 随机梯度下降(小批量算法)
随机梯度下降在第 k 个训练迭代的更新 参数 : 学习率 ϵ , 初始参数 θ w h i l e 停止准则为满足 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 计算梯度更新 : g ^ ← 1 m ▽ θ ∑ i L ( f ( x ( i ) , θ ) , y ( i ) ) 应用更新 : θ ← θ − ϵ g ^ e n d w h i l e \begin{aligned} &随机梯度下降在第k个训练迭代的更新\\ &参数:学习率\epsilon, 初始参数\theta\\ &while \quad 停止准则为满足\quad do\\ &\quad 从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad计算梯度更新:\hat{g}\leftarrow\frac{1}{m}\triangledown_{\theta}\sum_iL(f(x^{(i)},\theta),y^{(i)})\\ &\quad应用更新:\theta\leftarrow\theta-\epsilon\hat{g}\\ &end \quad while \end{aligned} 随机梯度下降在第k个训练迭代的更新参数:学习率ϵ,初始参数θwhile停止准则为满足do从训练集中采集包含m个样本{x(1),⋯,x(m)}的小批量,其中x(i)对应的目标为y(i)计算梯度更新:g^←m1▽θi∑L(f(x(i),θ),y(i))应用更新:θ←θ−ϵg^endwhile
SGD算法中一个关键参数是学习率。尽管SGD梯度估计中会引入噪声,多个小批量的平均效果会逐渐减少噪声,使得固定学习率仍能有效收敛。在实践中有必要随着时间的推移逐渐降低学习率,一般会线性衰减学习率直到第 τ \tau τ次,在 τ \tau τ步迭代之后,学习率会保持常数:
ϵ k = ( 1 − k τ ) ϵ 0 + k τ ϵ τ . \displaystyle\Large \epsilon_k=(1-\frac{k}{\tau})\epsilon_0+\frac{k}{\tau}\epsilon_{\tau}. ϵk=(1−τk)ϵ0+τkϵτ.
上面是一种学习率衰减的方法,PyTorch中也实现了很多学习率衰减的方法,可以在How to adjust learning rate找到具体使用方法。
3.2 动量
随机梯度下降的学习过程有时候会很慢,而动量方法旨在加速学习,特别是处理高曲率,小但一致的梯度,或者是带噪声的梯度。动量算法累积了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。在梯度较小的区域,动量能帮助优化器更快地前进;动量平滑梯度,减少在陡峭区域或鞍点附近的震荡;动量有助于跳过鞍点,避免优化停滞;通过累积历史梯度,动量帮助优化器选择更合适的更新方向。
使用动量的随机梯度下降 参数 : 学习率 ϵ , 动量参数 α , 初始参数 θ , 初始速度 v w h i l e 没有达到停止准则 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 计算梯度估计 : g ← 1 m ▽ θ ∑ i L ( f ( x ( i ) , θ ) , y ( i ) ) 计算速度更新 : v ← α v − ϵ g 应用更新 : θ ← θ + v e n d w h i l e \begin{aligned} &使用动量的随机梯度下降\\ &参数:学习率\epsilon,动量参数\alpha,初始参数\theta,初始速度v\\ &while \quad 没有达到停止准则\quad do\\ &\quad 从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad计算梯度估计:g\leftarrow\frac{1}{m}\triangledown_{\theta}\sum_iL(f(x^{(i)},\theta),y^{(i)})\\ &\quad计算速度更新:v\leftarrow\alpha v-\epsilon g\\ &\quad应用更新:\theta\leftarrow\theta+v\\ &end\quad while \end{aligned} 使用动量的随机梯度下降参数:学习率ϵ,动量参数α,初始参数θ,初始速度vwhile没有达到停止准则do从训练集中采集包含m个样本{x(1),⋯,x(m)}的小批量,其中x(i)对应的目标为y(i)计算梯度估计:g←m1▽θi∑L(f(x(i),θ),y(i))计算速度更新:v←αv−ϵg应用更新:θ←θ+vendwhile
3.3 Nesterov动量
Nesterov动量中,梯度计算在施加当前速度之后,因此Nesterov动量可解释为往标准动量方法中添加了一个校正因子。
使用 N e s t e r o v 动量的随机梯度下降 参数 : 学习率 ϵ , 动量参数 α , 初始参数 θ , 初始速度 v w h i l e 没有达到停止准则 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 应用临时更新 : θ ˜ ← θ + α v 计算临时点的梯度 : g ← 1 m ▽ θ ˜ ∑ i L ( f ( x ( i ) , θ ˜ ) , y ( i ) ) 计算速度更新 : v ← α v − ϵ g 应用更新 : θ ← θ + v e n d w h i l e \begin{aligned} &使用Nesterov动量的随机梯度下降\\ &参数:学习率\epsilon,动量参数\alpha,初始参数\theta,初始速度v\\ &while \quad 没有达到停止准则 \quad do\\ &\quad从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad应用临时更新:\~\theta\leftarrow\theta+\alpha v\\ &\quad计算临时点的梯度:g\leftarrow\frac{1}{m}\triangledown_{\~\theta}\sum_iL(f(x^{(i)},\~\theta),y^{(i)})\\ &\quad计算速度更新:v\leftarrow\alpha v-\epsilon g\\ &\quad应用更新:\theta\leftarrow\theta+v\\ &end\quad while \end{aligned} 使用Nesterov动量的随机梯度下降参数:学习率ϵ,动量参数α,初始参数θ,初始速度vwhile没有达到停止准则do从训练集中采集包含m个样本{x(1),⋯,x(m)}的小批量,其中x(i)对应的目标为y(i)应用临时更新:θ˜←θ+αv计算临时点的梯度:g←m1▽θ˜i∑L(f(x(i),θ˜),y(i))计算速度更新:v←αv−ϵg应用更新:θ←θ+vendwhile
4. 参数初始化
深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。大多数算法都很大程度地受到初始化选择的影响,初始点能决定算法是否收敛,当学习收敛时,初始点能决定学习收敛得多快,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也影响泛化。
现代的初始化策略是简单的,启发式的,因为初始化策略中哪些好的性质会在哪些情况下保持是未知的,以及无法判断初始化点是否对泛化有利。初始化策略唯一要做到的是初始参数需要在不同单元间破坏对称性,初始化每个单元使其和其他单元计算不同的函数值。这有助于确保输入模式没有丢失在前向传播空间中,没有梯度模式丢失在反向传播的零空间中。在高维空间上使用高熵分布来初始化,计算代价小并且保证不会分配单元计算彼此相同的函数。
通常情况下,可以为每个单元的偏置和额外的参数设置启发式挑选的常数,仅随机初始化权重。初始化模型的权重为高斯或者均匀分布中随机抽取的值。
更大的初始化权重具有更强的破坏对称性的作用,有助于避免冗余单元,也有助于避免在每层线性成分的前向或反向传播中丢失信号。如果初始权重太大,那么会在前向传播和反向传播中产生爆炸的值。较大的权重使得产生使激活函数饱和的值,导致饱和单元的梯度完全丢失。这些因素决定了权重的理想初始大小。此外,优化观点认为权重应该足够大以成功传播信息,但正则化希望小一点。
设置偏置的方法必须和设置权重的方法相协调,在大多数情况下偏置设置为0是可行的。但也存在可能需要设置偏置为非零值的情况:
1.如果是输出单元的偏置,初始化偏置以获得正确的输出边缘统计是有利的,将偏置设置为应用于训练集上输出边缘统计的激活函数的逆。
2.选择偏置以避免初始化引起太大饱和,比如ReLU的隐藏单元偏置设为0.1。
3.一个单元会控制其他单元是否参与到计算中,比如有一个单元输出 u u u,另一个单元 h ∈ [ 0 , 1 ] h\in[0,1] h∈[0,1],将h视作门控制u是否参与学习,在这种情况h应初始化为1,否则u没有机会学习。
参考
[美]伊恩·古德费洛(lan Goodfellow)[加]约书亚·本吉奥(Yoshua Bengio)[加]亚伦·库维尔(Aaron Courville) 深度学习(中文翻译版)