# 无约束优化基础
无约束优化旨在找到使得目标函数值最小的参数。下降方法是解决这类问题的核心思想,其通用迭代公式如下:
x(k+1)=x(k)+t(k)Δx(k)
其中,x(k) 是第 k 次迭代的参数,t(k) 是学习步长,Δx(k) 是搜索方向。
# 线搜索(确定学习步长 t)
线搜索是确定最优学习步长 t 的方法。
-
精准线搜索(Exact Line Search):通过求解一个一维优化问题,找到使函数值下降最多的最优步长。
t(k)=argt≥0minf(x(k)+tΔx(k))
-
回溯线搜索(Backtracking Line Search):一种非精确线搜索方法,通过从一个较大的初始值开始,逐步减小步长,直到满足 Armijo-Goldstein 条件。
初始化: t=1,β∈(0,1),α∈(0,0.5)当 f(x(k)+tΔx(k))>f(x(k))+αt∇f(x(k))TΔx(k) 时:t=βt
# 搜索方向(确定 Δx)
-
梯度下降法(Gradient Descent):最常用的下降方法之一,其搜索方向与梯度的负方向一致,以保证函数值下降最快。当梯度的范数平方 ∣∣∇f(x)∣∣2 小于某个阈值 ϵ 时停止。该方法收敛速度通常较慢。
我们通过对函数进行一阶泰勒展开来理解其搜索方向:
f^(x+v)=f(x)+∇f(x)Tv,∣∣v∣∣=1
要使 f^(x+v) 最小,需要使 ∇f(x)Tv 最小。根据柯西-施瓦茨不等式,当 v 与 −∇f(x) 方向相同时,内积取得最小值。
vminf^(x+v)=vminf(x)+∇f(x)Tv=f(x)−∣∣∇f(x)T∣∣2
因此,梯度下降的搜索方向为:
Δx=−∇f(x)
-
牛顿法(Newton's Method):一种二阶优化方法,利用海森矩阵来确定搜索方向。其收敛速度是二阶的,通常比梯度下降快得多,但计算和存储海森矩阵的逆的成本很高。
牛顿法基于函数的二阶泰勒展开:
f^(x+v)=f(x)+∇f(x)Tv+21vT∇2f(x)v,∣∣v∣∣=1
对 v 求导并令其为 0,得到最优搜索方向:
∇vf^(x+v)=∇f(x)+∇2f(x)v=0
因此,牛顿法的搜索方向为:
Δx=−(∇2f(x))−1∇f(x)
# 牛顿法的完整步骤
- 计算当前点的梯度 ∇f(x) 和海森矩阵 ∇2f(x)。
- 计算搜索方向 Δx=−(∇2f(x))−1∇f(x)。
- 计算牛顿衰减(Newton decrement)λ(x)=(∇f(x)T(∇2f(x))−1∇f(x))1/2。
- 若 λ2/2≤ϵ,则停止迭代。这个停止条件意味着一阶导数很小,同时海森矩阵的特征值都很大,表明已经接近极小值。
- 使用回溯线搜索确定步长 t。
- 更新参数 x=x+tΔx。
# 梯度下降算法变种
神经网络通常使用梯度下降的变种来处理大规模数据集。
-
全批量梯度下降(BGD, Batch Gradient Descent):每次迭代都使用整个训练集计算梯度。
x(k+1)=x(k)−η(k+1)m1i=1∑m∇fi(x(k))
优点:每次更新方向都是全局最优的,收敛平稳。
缺点:计算成本高,当数据量大时,模型可能无法感知到具体样本的出错部分,导致收敛慢或不收敛。
-
随机梯度下降(SGD, Stochastic Gradient Descent):每次迭代只随机或循环选取一个样本来计算梯度。
x(k+1)=x(k)−η(k+1)∇fik+1(x(k))
优点:迭代成本与批次数无关,可以很快得到一次更新。
缺点:更新方向波动性大,可能导致收敛不稳定。
-
小批量梯度下降(MBGD, Mini-Batch Gradient Descent):在 BGD 和 SGD 之间取得平衡,每次迭代选取一个随机子集 Ik 来计算梯度,通常 ∣Ik∣=b≪m。
x(k+1)=x(k)−η(k+1)b1i∈Ik∑∇fi(x(k))
优点:结合了 SGD 和 BGD 的优点,计算成本适中,且更新方向比 SGD 稳定。梯度的无偏估计方差减小到 b1,但计算成本也相应增加 b 倍。
# 高级梯度优化算法
这些算法通过引入动量、自适应学习率等机制,来加速收敛、改善训练稳定性。
# 动量法(Momentum)
动量法为参数更新增加了一个“速度”或“惯性”,有助于缓解震荡,并可能克服鞍点导致的梯度消失问题。
v(k+1)=βv(k)+∇f(x(k))x(k+1)=x(k)−η(k+1)v(k+1)
其中 β 是动量系数。
# Nesterov 动量法(Nesterov Accelerated Gradient, NAG)
Nesterov 动量法通过“预见”未来位置的梯度,从而进行更有效的更新。
其更新公式为:
v(k+1)=βv(k)+η(k+1)∇f(x(k)−βv(k))x(k+1)=x(k)−v(k+1)
另一种等价形式:
x~(k)=x(k)−βv(k)v(k+1)=βv(k)+η(k+1)∇f(x~(k))x~(k+1)=x~(k)−v(k+1)+β(v(k)−v(k+1))
# Adagrad
Adagrad (Adaptive Gradient) 根据参数的历史梯度平方和来自适应地调整每个参数的学习率。
g(k)=∇f(x(k))s(k+1)=s(k)+g(k)⊙g(k)x(k+1)=x(k)−s(k+1)+ϵη⊙g(k)
优点:可以为稀疏特征分配更大的学习率。
缺点:累积的梯度平方和会持续增加,导致学习率随着迭代次数增加而趋于0,可能过早停止学习。
# RMSProp
RMSProp(Root Mean Square Propagation)通过引入衰减系数 β 来解决 Adagrad 学习率持续下降的问题,防止学习率过早降低。
g(k)=∇f(x(k))s(k+1)=βs(k)+(1−β)g(k)⊙g(k)x(k+1)=x(k)−s(k+1)+ϵη⊙g(k)
# Adam(Adaptive Moment Estimation)
Adam 算法结合了动量法的一阶矩估计和 RMSProp 的二阶矩估计,是目前最常用的优化算法之一。
-
一阶矩(动量):用于估计梯度的均值,通常 β1 取 0.9。
v(k+1)=β1v(k)+(1−β1)g(k)
-
二阶矩(RMSProp):用于估计梯度的未中心化方差,通常 β2 取 0.999。
s(k+1)=β2s(k)+(1−β2)g(k)⊙g(k)
-
偏差校正(Bias Correction):由于 v(0) 和 s(0) 初始化为 0,早期的矩估计值会偏向于 0,因此需要进行偏差校正。
v^(k+1)=1−β1k+1v(k+1),s^(k+1)=1−β2k+1s(k+1)
-
参数更新:
x(k+1)=x(k)−s^(k+1)+ϵη⊙v^(k+1)
# 学习率调整策略
在训练过程中动态调整学习率,可以提高模型的收敛速度和性能。
# 乘法衰减(Exponential Decay)
学习率以一个固定的乘法因子持续衰减。
ηt+1=max(ηmin,ηt⋅α)
其中 α 是衰减率,ηmin 是最小学习率。
# 分段学习率(Step Decay)
在预设的特定训练周期或步数后,将学习率乘以一个固定因子进行衰减。
# 余弦学习率(Cosine Decay)
学习率按照余弦函数的规律进行衰减,从最大值逐渐减小到最小值。
ηt+1=ηt+21(η0−ηT)(1+cos(Ttπ))
其中 η0 是初始学习率,ηT 是最小学习率, T 是总训练步数。
# WarmUp
在训练的最初阶段使用一个较小的学习率,并逐渐线性增加到预设的最大值,然后再按照其他策略进行衰减。这有助于稳定模型训练,避免初始阶段的参数震荡。