步长(学习率learning rate)

本文探讨了在梯度下降法中如何调整学习率η以优化参数更新过程,避免过快或过慢收敛,介绍了Adagrad和RMSProp两种自动调试学习率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步长(学习率)

在进行梯度下降法的过程中,我们需要通过调整 η \eta η学习率的值来调整参数每次要走的距离。适当的调整 η \eta η可以更准确的找到 L L L的最小值以及参数值。
下面需要注意调整步长 η \eta η(往下一步要走的距离)的大小:
不同大小的 η \eta η可能会造成下面图中的情况
在这里插入图片描述
一种方法是将参数的变化与函数 L L L的改变的情况可视化

  • η \eta η太小,则L变化缓慢,对应下图中绿色线条
  • η \eta η比较大,则可能上面图中跳出极小值点,找不到该点(相当于步子迈大了从坑上跨过去)
  • η \eta η过大时,L将会越变越大,需要重新调整(此时相当于不仅跨过了坑还跨到山上去了)

在这里插入图片描述

自动调试 η \eta η的方法

通常情况下,随着参数的更新会越来越小。(越来越接近目标,要调小步长)

Adagrad

一般情况:
w k + 1 ← w k − η k g k , 其 中 g k 表 示 第 k 个 值 的 梯 度 。 w^{k+1} \leftarrow w^{k}-\eta^{k} g^{k},\\其中g^k表示第k个值的梯度。 wk+1wkηkgk,gkk
现做调整: w k + 1 ← w k − η k σ k g k w^{k+1} \leftarrow w^{k}-\frac{\eta^{k}}{\sigma^{k}} g^{k} wk+1wkσkηkgk
这里, η k σ k \frac{\eta^{k}}{\sigma^{k}} σkηk就是这次的步长(学习率), σ k \sigma^k σk表示过去求过的梯度值的平方和求均值然后开根号,
即第 k + 1 k+1 k+1次的 η t = η k + 1 ; σ k = 1 k + 1 [ ( g 0 ) 2 + ( g 1 ) 2 + . . . + ( g k ) 2 ] = 1 k + 1 ∑ i = 0 k ( g i ) 2 , 因 为 0 到 k 一 共 k + 1 个 值 , 所 以 乘 1 k + 1 ; \eta^{t}=\frac{\eta}{\sqrt{k+1}};\\\sigma^k=\sqrt{\frac{1}{k+1}[(g^0)^2+(g^1)^2+...+(g^k)^2]}=\sqrt{\frac{1}{k+1} \sum_{i=0}^{k}\left(g^{i}\right)^{2}},\\因为0到k一共k+1个值,所以乘\frac{1}{k+1}; ηt=k+1 ησk=k+11[(g0)2+(g1)2+...+(gk)2] =k+11i=0k(gi)2 0kk+1k+11
举例:
w 1 ← w 0 − η 0 σ 0 g 0 , σ 0 = ( g 0 ) 2 w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} \quad ,\sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} w1w0σ0η0g0,σ0=(g0)2
w 2 ← w 1 − η 1 σ 1 g 1 , σ 1 = 1 2 [ ( g 0 ) 2 + ( g 1 ) 2 ] w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} ,\quad \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} w2w1σ1η1g1,σ1=21[(g0)2+(g1)2]
w 3 ← w 2 − η 2 σ 2 g 2 , σ 2 = 1 3 [ ( g 0 ) 2 + ( g 1 ) 2 + ( g 2 ) 2 ] w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} ,\quad \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} w3w2σ2η2g2,σ2=31[(g0)2+(g1)2+(g2)2]
w k + 1 ← w k − η k σ k g k , σ k = 1 k + 1 ∑ i = 0 k ( g i ) 2 w^{k+1} \leftarrow w^{k}-\frac{\eta^{k}}{\sigma^{k}} g^{k} ,\quad \sigma^{k}=\sqrt{\frac{1}{k+1} \sum_{i=0}^{k}\left(g^{i}\right)^{2}} wk+1wkσkηkgk,σk=k+11i=0k(gi)2
观察上面 η k , σ k \eta^k,\sigma^k ηk,σk两式,发现有可约分项 1 k + 1 \sqrt{\frac{1}{k+1}} k+11 ,于是可得到:
w k + 1 ← w k − η ∑ i = 0 k ( g i ) 2 g k w^{k+1} \leftarrow w^{k}-\frac{\eta}{\sqrt{\sum_{i=0}^{k}\left(g^{i}\right)^{2}}} g^{k} wk+1wki=0k(gi)2 ηgk

RMSProp

Adagrad适用与二次微分值固定(用一次微分估测二次微分),那么二次微分不固定时,可以使用RMSProp。
在这里插入图片描述
w 1 ← w 0 − η σ 0 g 0 σ 0 = g 0 w 2 ← w 1 − η σ 1 g 1 σ 1 = α ( σ 0 ) 2 + ( 1 − α ) ( g 1 ) 2 w 3 ← w 2 − η σ 2 g 2 σ 2 = α ( σ 1 ) 2 + ( 1 − α ) ( g 2 ) 2 \begin{array}{ll}{w^{1} \leftarrow w^{0}-\frac{\eta}{\sigma^{0}} g^{0}} & {\sigma^{0}=g^{0}} \\ {w^{2} \leftarrow w^{1}-\frac{\eta}{\sigma^{1}} g^{1}} & {\sigma^{1}=\sqrt{\alpha\left(\sigma^{0}\right)^{2}+(1-\alpha)\left(g^{1}\right)^{2}}} \\ {w^{3} \leftarrow w^{2}-\frac{\eta}{\sigma^{2}} g^{2}} & {\sigma^{2}=\sqrt{\alpha\left(\sigma^{1}\right)^{2}+(1-\alpha)\left(g^{2}\right)^{2}}}\end{array} w1w0σ0ηg0w2w1σ1ηg1w3w2σ2ηg2σ0=g0σ1=α(σ0)2+(1α)(g1)2 σ2=α(σ1)2+(1α)(g2)2
w t + 1 ← w t − η σ t g t σ t = α ( σ t − 1 ) 2 + ( 1 − α ) ( g t ) 2 w^{t+1} \leftarrow w^{t}-\frac{\eta}{\sigma^{t}} g^{t} \quad \sigma^{t}=\sqrt{\alpha\left(\sigma^{t-1}\right)^{2}+(1-\alpha)\left(g^{t}\right)^{2}} wt+1wtσtηgtσt=α(σt1)2+(1α)(gt)2 其中这里的 σ 与 A d g r a d 中 σ \sigma与Adgrad中\sigma σAdgradσ的计算方式不太一样。
此外,还有很多调整 η \eta η的方法。

### 变步长学习率的概念与实现方法 #### 时间衰减策略 时间衰减策略是一种常见的变步长学习率调整方式,其核心思想在于随着训练迭代次数的增加逐步降低学习率。这种方法能够使模型在初期快速收敛,在后期更精细地优化权重[^1]。具体公式可以表示为: \[ \eta_t = \frac{\eta_0}{1 + t / d} \] 其中,\(\eta_t\) 表示第 \(t\) 步的学习率,\(\eta_0\) 是初始学习率,\(d\) 控制衰减速率。 #### Step Decay Step Decay 是另一种广泛使用的变步长学习率调度方法。它按照预设的时间间隔(epoch 或 iteration),以固定的比例减少学习率。例如,每经过一定数量的 epoch 后将学习率乘以一个小于 1 的因子(如 0.1)。这种方式简单有效,尤其适合那些需要长时间训练的任务[^2]。 以下是基于 PyTorch 的 Step Decay 实现代码: ```python import torch.optim as optim optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1) for epoch in range(num_epochs): train(...) scheduler.step() ``` #### Cyclical Learning Rates 不同于传统的单调递减模式,Cyclical Learning Rates 提倡让学习率在一个范围内周期性波动。这种策略有助于探索不同区域的损失函数表面,并可能找到更好的局部最优解[^3]。其实现有多种形式,比如三角形波或余弦退火。 下面是一个简单的 CLR 实现例子: ```python from clr import CyclicLR # 假设有第三方库提供此功能 clr = CyclicLR(base_lr=0.001, max_lr=0.01, mode='triangular') for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() clr.on_batch_end(batch_idx=batch_idx) ``` #### AdaGrad 自适应学习率 AdaGrad 方法针对每个参数单独调整学习率,利用过去所有梯度平方作为缩放系数。尽管这一特性使其非常适合处理稀疏特征的数据集,但它也可能导致后期学习率变得极小从而停止进一步改进[^4]。 下面是 TensorFlow 中应用 Adagrad 的实例: ```python optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.01) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) history = model.fit(x_train, y_train, epochs=num_epochs) ``` #### 动量法及其扩展 Nesterov 加速梯度 动量法通过引入历史梯度信息改善标准随机梯度下降的表现,使得算法能够在平坦的方向上加速而在陡峭方向保持稳定[^5]。Nesterov 则是对传统动量的一个改良版本,提前计算未来位置处的梯度再做修正,通常能带来更高的效率。 PyTorch 下启用 Nesterov 动量如下所示: ```python optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值