Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

学习率调度器

上一章,Adam 帮我们给每个参数单独地调整有效步幅。与步幅相关的还有一个超参数:学习率,我们仍旧是手动调参。

目前的学习率,在开始训练后是固定的。训练开始时是多少,一直到结束还是多少。但是这并不合理:

  • 训练初期:参数还是随机初始化的,梯度方向不可靠。如果一上来就用大学习率猛冲,容易直接跑偏;

  • 训练后期:模型已经接近最优解,需要小心微调,而不是继续大步走,否则会在最优点附近来回震荡,甚至跳脱。

这一章,我们将引入自动调参:用学习率调度器(Learning Rate Scheduler)在训练过程中动态地改变学习率。我们将采用大模型训练最常用的方案:预热(Warmup)和余弦退火(Cosine Annealing)。

  • 预热:训练初期,学习率从 0 开始,逐步爬升到最大值;

  • 余弦退火:预热结束后,学习率沿着余弦曲线,从最大值平滑地下降到最小值。

张量

数据集

抽象类

字符编码数据集

模型

抽象层

线性层

组合抽象层

顺序层

嵌入层

激活函数

双曲正切函数(Tanh)

损失函数

抽象类

交叉熵损失函数

优化器

抽象类

自适应矩估计优化器

权重衰减自适应矩估计优化器

学习率调度器(预热余弦退火)

创建一个学习率调度器,我们需要提供 4 个初始化参数:

  • lr(学习率):这就是我们一直使用的学习率,也是预热后达到的最大学习率;

  • total_steps(总步数):整个训练过程的全部步数;

  • warmup_steps(预热步数):预热阶段的步数;

  • min_lr(最小学习率):训练后期学习率降到的最小值。

预热

训练的最开始 warmup_steps 步,学习率从 0 线性爬升到最大值 lr:

lrt=lr⋅twarmup_stepslr_t = lr \cdot \frac{t}{warmup\_steps}

这里:

  • lrtlr_t:当前学习率;

  • tt:当前步数(从 1 开始计数,对应代码里的 current_step + 1)。

余弦退火

预热结束后,学习率达到最大值,然后沿着余弦曲线,从最大值平滑地下降到最小值 min_lrmin\_lr:

lrt=min_lr+(lr−min_lr)⋅1+cos⁡(π⋅t−warmup_stepstotal_steps−warmup_steps)2lr_t = min\_lr + (lr - min\_lr) \cdot \frac{1 + \cos(\pi \cdot \frac{t - warmup\_steps}{total\_steps - warmup\_steps})}{2}

这里:

  • lrtlr_t:当前学习率;

  • tt:当前步数(对应代码里的 current_step)。

选用余弦曲线来退火的好处是:步幅先慢、后快、再慢。所以整个训练周期,学习率就像开车:慢慢起步(预热),之后中段加速巡航,快到终点时平稳减速(余弦退火)。这是 GPT 这类大模型的标准训练节奏。


学习率调度器只提供一个函数:

  • step(步进函数):根据当前步数计算出新的学习率。

循环神经网络

循环单元

循环神经网络模型

训练器

抽象类

循环神经网络训练器

训练器中每一步都先调用学习率调度器的步进函数 step,获得最新的学习率。

超参数

学习率

使用学习率调度器后,LEARNING_RATE 实际上用作最大学习率。学习率调度器降低平均学习率,所以我们可以适当调大一些,而最小学习率设为最大学习率的 1/10。

批大小

轮数

上下文尺寸

嵌入尺寸

建模

训练

开始模型训练前,我们要先创建一个学习率调度器的实例,并把它传给训练函数。这里几个初始化参数的含义是:

  • LEARNING_RATE:最大学习率;

  • EPOCHS * len(dataset):全部训练步数;

  • 100:预热步数;

  • LEARNING_RATE / 10:最小学习率。

评估

prediction:	32 steps, each (6970, 65)
total loss:	Tensor(64.7635956614507)

推理

ROMEO:
Hat that, he you!
You spelr gexssigean I'red
ho,
That his whirovellm to waind:
Ye Gosis
The rest patiet,
Pervunded mantlacem! But do stay,
Hath muthood;
I wore not hanted gaing, you knes is not thought be but what you a you geeden Hartion as bearter a Pro

这一章,我们实现了学习率的自动调参:预热让训练平稳起步,余弦退火让训练收尾精细收敛。至此,模型训练的三大实战神器:Adam 优化器、梯度裁剪、学习率调度,都配齐了,这也是训练大模型的标准配置。

回顾第二部分,我们从数字化文字信息开始,实现了 RNN,创建了一个可以读懂文字的模型。

但是必须指出的是:RNN 存在着记忆有限、无法并行的先天缺陷,无法承担构建真正大语言模型的重担。下一部分,我们将换一种全新的思路:注意力机制(Attention),并一步步搭建出真正的 GPT 模型。

课后练习

  1. 试着调整学习率调度器的初始化参数,比如把预热步数改成 0(不要预热),或者很大;或者把最小学习率改成 0,让学习率最终降到 0。观察训练速度和效果变好还是变差?