跳到主要内容
5969 字
30 分钟
30 分钟读完

ARTICLE NOTE

Transformer Training Experiments —— 完整训练实战与消融实验
浏览 0
热度 0

Transformer Training Experiments —— 完整训练实战与消融实验

引言

经过前五篇博客的积累,我们已经完成了从分词、基础算子、注意力机制、模型组装到训练系统的全部构建工作。现在,我们将进入最终阶段 —— 实际训练模型,并通过严谨的消融实验验证每一项设计决策的科学性

在深度学习研究中,消融实验(Ablation Study) 是评估不同组件贡献度的黄金标准。它的核心思想是通过系统地移除或替换模型中的某个组件,观察性能变化,从而量化该组件的重要性。这不仅帮助我们验证理论假设,更能指导我们在资源有限的情况下做出最优的设计取舍。

本文将围绕一个完整的训练框架展开,涵盖:

  • 一个功能完备的命令行训练脚本(支持模型配置、优化器超参数、消融开关等)
  • 标准化的训练循环与评估流程
  • 五组精心设计的消融实验(Baseline vs 无RMSNorm vs Post-Norm vs 无RoPE vs SiLU替换SwiGLU)
  • 基于可视化结果的深度解读与科学结论

一、训练脚本

1.1 命令行参数系统的设计哲学

训练大语言模型涉及大量超参数 —— 模型架构(层数、维度、头数)、训练配置(批次大小、步数)、优化器参数(学习率、衰减率)、数据路径等等。将这些参数硬编码在脚本中会导致代码僵化,无法进行系统性的消融实验。

我们的训练脚本U_Trainer.py采用命令行参数(argparse) 的方式,将所有可调参数暴露为命令行选项,使得我们可以通过简单的shell脚本或命令行轻松切换不同配置,实现自动化的批量实验

1.2 参数体系分类

整个参数体系可划分为五大类别,每类对应训练中的一个关键决策维度:

模型架构参数(决定模型容量与结构):

  • --d_model模型宽度,典型值512~768
  • --num_layers模型深度,典型值4~12
  • --num_heads注意力头数,需满足d_model % num_heads == 0
  • --d_ff前馈网络隐藏维度,SwiGLU下约8/3*d_model,SiLU下约4*d_model
  • --context_len最大序列长度,影响内存和计算复杂度

消融实验开关(设计决策的“阀门”):

  • --use_rmsnorm / --no_rmsnorm:是否启用RMSNorm
  • --norm_positionprepost,控制归一化位置
  • --use_rope / --no_rope:是否使用RoPE位置编码
  • --use_swiglu / --use_silu:切换SwiGLU或FFNSiLU

这些开关的设计使得我们可以在不修改任何模型代码的前提下,通过命令行参数快速生成不同的模型变体。

优化器参数(控制学习动态):

  • --max_lr--min_lr学习率上下界
  • --warm_up_it--cosine_it预热步数和余弦周期
  • --weight_decayAdamW的权重衰减系数
  • --betas--epsAdam的超参数

训练与数据参数

  • --batch_size:批处理大小
  • --train_steps:训练循环轮数
  • --val_interval--val_batches
  • --data_dir:数据路径,指向预处理好的.dat文件

基础设施参数

  • --device:自动选择CPU/CUDA/MPS
  • --wandb_project:实验追踪与可视化
  • --is_base_experiment:标记是否为基础实验(控制检查点保存行为)

这种高度参数化的设计使得我们可以一次性运行所有消融实验,而无需多次修改源码,极大地提高了实验效率。

1.3 实验命名与组织

在训练脚本中,get_experiment_name函数根据消融配置自动生成具有描述性的实验名称:

norm_str = "rmsnorm" if args.use_rmsnorm else "no_rmsnorm"
pos_str = f"{args.norm_position}_norm"
rope_str = "rope" if args.use_rope else "nope"
ffn_str = "swiglu" if args.use_swiglu else "silu"
return f"{norm_str}-{pos_str}-{rope_str}-{ffn_str}"

例如,完整基线模型的实验名为rmsnorm-pre_norm-rope-swiglu,而无RoPE的消融实验名为rmsnorm-pre_norm-nope-swiglu。这种命名方式使得实验结果一目了然,便于后续分析和可视化。

对于基础模型(--is_base_experiment),脚本会在checkpoints/下创建以实验名命名的子目录,保存检查点、配置文件(config.json)和实验摘要(summary.json);而消融实验默认不保存检查点,只记录wandb日志和生成图表,以节省存储空间。


二、训练循环的实现

训练循环是模型学习的核心引擎。代码实现遵循了现代LLM训练的标准流程,并加入了丰富的监控与恢复机制。

2.1 训练循环的完整流程

main()函数的训练循环中,每一步都严格按照“前向-损失-反向-裁剪-优化-调度-日志”的顺序执行,关键代码如下:

for iter_num in range(start_iter, args.train_steps):
# 1. 更新学习率(余弦调度)
lr = cosine_schedule(iter_num, max_lr, min_lr, warm_up_it, cosine_it)
for param_group in optimizer.param_groups:
param_group['lr'] = lr
# 2. 加载批次数据
input_ids, target_ids = data_loading(train_data, batch_size, context_len, device)
input_ids = input_ids.long().to(device)
target_ids = target_ids.long().to(device)
# 3. 前向传播与损失计算
optimizer.zero_grad()
logits = model(input_ids)
loss = cross_entropy_loss(logits.view(-1, vocab_size), target_ids.view(-1))
# 4. 反向传播
loss.backward()
# 5. 梯度裁剪(防止爆炸)
gradient_clipping(model.parameters(), args.clip_grad_norm)
grad_norm = compute_gradient_norm(model) # 监控用
# 6. 优化器更新
optimizer.step()
# 7. 记录与验证
# ...

2.2 学习率调度的动态更新

与很多框架在optimizer.step()外部修改学习率不同,我们在每次迭代开始时根据当前步数计算学习率,然后直接修改优化器参数组中的lr值。

这种做法确保了调度器与优化器状态完全同步,并且支持从检查点恢复时继续正确的调度(因为调度器是基于迭代次数计算的,而非基于存储的lr值)。

余弦调度函数cosine_schedule 实现了三段式策略:预热(线性增长)→ 余弦衰减(平滑下降)→ 保持最小学习率。这种设计已被GPT-3、Llama等模型验证为高效稳定。

2.3 梯度范数监控与裁剪的协同

计算梯度范数(compute_gradient_norm 不仅用于裁剪判断,更是一个重要的训练健康指标

在训练过程中记录梯度范数的变化趋势,如果发现范数持续异常增大(比如超过阈值数倍),说明模型可能处于不稳定的学习状态,此时需要调整学习率或检查数据质量

梯度裁剪的阈值--clip_grad_norm默认为1.0,这个值在GPT-2论文中被采用,并在实践中被证明适用于多种规模的模型。裁剪操作原地缩放所有梯度,保证了后续优化器更新所使用的梯度范数不超过阈值

2.4 验证与检查点的设计

验证逻辑封装在validate_model函数中,它在验证集上运行若干个批次--val_batches,默认10个),计算平均损失和困惑度(Perplexity)。验证不进行梯度计算torch.no_grad()),且模型被设置为eval模式,以确保验证过程的确定性

检查点保存仅针对基础实验--is_base_experiment),且具备以下特点:

  • 定期保存:每--save_intervals步(默认1000)保存一个带有步数标记的检查点
  • 最佳模型保存:当验证损失达到历史最低时,额外保存为 best_model.pt
  • 最终模型保存:训练结束时保存 checkpoint_final.pt

所有检查点包含模型状态字典、优化器状态字典和当前迭代次数,这使得断点续训--resume_ckp)成为可能。

2.5 进度条与日志记录

我们使用tqdm创建进度条,实时显示当前损失、平均损失、困惑度和学习率。同时,所有关键指标(训练损失、验证损失、困惑度、梯度范数、学习率等)通过wandb记录,便于后期可视化与对比分析


三、消融实验设计

消融实验的目的是量化每个设计决策对模型性能的贡献。我们设计了五组实验,其中一组为基线(完整模型),其余四组分别移除或替换一个关键组件

3.1 实验配置总览

所有实验共享相同的超参数基准:

  • 架构d_model=512, num_layers=4, num_heads=16, context_len=256
  • 数据:TinyStories验证集(约4.5MB文本)
  • 训练batch_size=32, train_steps=5000
  • 优化max_lr=1e-3, min_lr=1e-4, warmup=500, cosine=10000, weight_decay=1e-2, beta1=0.9, beta2=0.95, eps=1e-8
  • 梯度裁剪max_l2_norm=1.0

3.2 五组实验的具体设计

实验编号名称RMSNorm归一化位置RoPEFFN类型
1Baseline✅ (RMSNorm)Pre-NormSwiGLU
2No RMSNorm❌ (恒等映射)Pre-NormSwiGLU
3Post-Norm✅ (RMSNorm)Post-NormSwiGLU
4No RoPE✅ (RMSNorm)Pre-Norm❌(无位置编码)SwiGLU
5SiLU代替SwiGLU✅ (RMSNorm)Pre-NormFFNSiLU (2个权重)

在实验5中,为保持参数量可比,我们设置 d_ff=4*d_model=2048(而SwiGLU实验中使用 d_ff=8/3*d_model≈1365,实际取1344以保证能被64整除)。这样两种FFN的参数量大致相同

3.3 实验的科学假设

  • Baseline:作为参照,预期表现最佳。
  • No RMSNorm:验证归一化层的必要性。预期训练不稳定,损失下降缓慢甚至发散
  • Post-Norm:验证归一化位置的影响。预期收敛速度慢于Pre-Norm,最终性能可能略差
  • No RoPE:验证位置编码的必要性。预期模型无法有效利用位置信息,性能显著下降
  • SiLU代替SwiGLU:验证门控机制的优势。预期SwiGLU优于简单SiLU,但差距可能不如前几项显著。

四、实验结果解读

基于消融实验的可视化图表(figures/ablation_experiment_charts/),完整覆盖5组消融曲线(01_base_model-红色[Baseline]、02_ablation_no_rmsnorm-黄色、03_ablation_post_norm-绿色、04_ablation_no_rope-蓝色、05_ablation_silu-紫色),逐项结合每一张图、每一条曲线走势对比Baseline完成深度分析。

4.1 训练损失指标

两张训练损失图表分别为原始逐步波动损失train/loss平滑平均损失train/avg_loss,曲线趋势完全同步,平滑图可消除噪声直观对比收敛速度与最终收敛值。

Ablation_train_loss 图1:train/loss(原始波动训练损失)

本图为未平滑的原始逐步损失,曲线外围浅色阴影代表单步损失波动区间,可直观观察各组训练稳定性:

  1. 01_base_model(红色Baseline):阴影波动宽度最小,单步损失起伏微弱,训练全程稳定无剧烈跳变
  2. 02_ablation_no_rmsnorm(黄色):阴影宽度是所有曲线中最大的,存在单步损失剧烈上下震荡,搭配1000、3000步的断崖跳增,直观印证移除RMSNorm后训练极度不稳定
  3. 03_ablation_post_norm(绿色):阴影波动宽度略大于Baseline,但无极端跳变,训练稳定性小幅弱于Pre-Norm基线。
  4. 04_ablation_no_rope(蓝色):阴影波动区间略宽于Baseline,单步震荡幅度较小,说明移除RoPE不会破坏训练稳定性,仅降低建模能力。
  5. 05_ablation_silu(紫色):阴影波动宽度与Baseline几乎完全重合激活函数替换对训练稳定度几乎无影响。

Ablation_train_avg_loss 图2:train/avg_loss(平滑训练损失)

  1. 01_base_model(红色Baseline)全局收敛最优。训练0~1000步快速陡峭下降,1000步后进入平缓收敛区间,全程无异常震荡与损失反弹,5000步最终收敛至所有曲线最低值,稳定在1.2附近。是所有消融组的性能参照标杆。
  2. 02_ablation_no_rmsnorm(黄色,移除RMSNorm):全局最差曲线。01000步下降速率显著慢于Baseline,在1000步1200步之间、3000步两处出现断崖式损失跳增反弹,存在严重训练震荡;全程损失始终高于其余4组,5000步收敛至1.7左右,比Baseline高出0.5,差距极大。证明RMSNorm对损失收敛起到决定性作用
  3. 03_ablation_post_norm(绿色,替换Pre-Norm为Post-Norm):收敛速度小幅弱于Baseline。0~1000步下降斜率略缓于红线,全程曲线紧贴Baseline上方,无大幅反弹震荡;最终收敛值仅比Baseline高0.05,差距微小。说明Pre-Norm相比Post-Norm仅带来小幅稳定收敛增益,二者差距远小于RMSNorm缺失的负面影响。
  4. 04_ablation_no_rope(蓝色,移除RoPE位置编码):最开始曲线走势与Baseline接近,中后期差距持续拉开。0~200步下降曲线几乎与红线重合;200步后模型开始学习长距离文本依赖,蓝色曲线下降放缓,与Baseline持续分离;5000步最终收敛至1.5,比Baseline高0.3。验证RoPE位置编码在长序列建模中后期会持续提供性能增益
  5. 05_ablation_silu(紫色,SwiGLU替换为SiLU):曲线与Baseline高度贴合,差异极小。全程下降斜率、震荡幅度均与红线几乎一致,仅全程略微高于Baseline;5000步最终收敛至1.35,比Baseline高0.15。说明SwiGLU门控激活相比SiLU有性能提升但较微弱,是所有组件中影响程度最低的模块。

4.2 困惑度Perplexity指标

困惑度为语言建模核心评价指标,数值越低代表模型文本预测精度越高;两张图表分别为原始波动train/perplexity与平滑train/avg_perplexity,趋势对应损失曲线。

Ablation_train_avg_perplexity 图3:train/perplexity(原始波动训练困惑度)

浅色阴影代表单步困惑度波动区间,用于判断预测稳定性:

  1. 01_base_model(红色Baseline):阴影宽度最小,单步预测波动极小,预测输出稳定
  2. 02_ablation_no_rmsnorm(黄色):阴影宽度最大单步困惑度剧烈震荡,搭配700轮和3000轮两处断崖跳增,模型预测输出极不稳定
  3. 03_ablation_post_norm(绿色):阴影轻微宽于Baseline,预测稳定性轻微下降
  4. 04_ablation_no_rope(蓝色):阴影宽于Baseline,前期300轮~1300轮之间下降幅度较缓慢,与baseline的差距较大,中后期逐渐趋于稳定,但最终困惑度高于Baseline,预测稳定性仍有下降
  5. 05_ablation_silu(紫色):阴影曲线与Baseline走势高度类似,仅全程略微偏高,预测稳定性略有下降

Ablation_train_avg_perplexity 图4:train/avg_perplexity(平滑训练困惑度)

  1. 01_base_model(红色Baseline):全程困惑度最低,0~1000步快速下降,无反弹,5000步收敛至全局最低值,文本预测能力最优
  2. 02_ablation_no_rmsnorm(黄色):全局最高困惑度,0~1000步下降极缓慢,1000、3000步出现两次断崖式困惑度飙升,全程数值大幅高于其余组别,证明缺失归一化层后模型token预测能力严重受损
  3. 03_ablation_post_norm(绿色):曲线紧贴Baseline上方,下降速率小幅滞后,最终困惑度略高于基线Pre-Norm对文本预测精度存在小幅正向增益
  4. 04_ablation_no_rope(蓝色):前期与Baseline重合,500步后差距持续扩大,最终困惑度高于基线,说明缺失位置编码后,模型无法精准捕捉文本时序依赖,预测精度持续下降
  5. 05_ablation_silu(紫色):曲线与Baseline走势高度类似,仅全程略微偏高SiLU相比SwiGLU仅造成较小幅的预测精度损失

4.3 梯度范数指标

梯度范数直接反映反向传播梯度流稳定性,数值越高、波动越大代表梯度爆炸/震荡风险越高,是判断训练稳定性的核心中间指标。

Ablation_train_gradient_norm 图5:train/gradient_norm(训练梯度范数)

  1. 01_base_model(红色Baseline):梯度范数变化规律健康。0~500步训练初期梯度快速上升至峰值后持续平滑衰减,全程曲线波动平缓无异常峰值,5000步稳定收敛至0.5附近,梯度流稳定无爆炸风险
  2. 02_ablation_no_rmsnorm(黄色):训练初期梯度范数直接飙升至极高值全程剧烈上下锯齿状波动,梯度震荡极其严重,是典型梯度不稳定特征,与损失、困惑度的剧烈反弹完全对应,证明RMSNorm通过标准化输入稳定梯度流
  3. 03_ablation_post_norm(绿色):梯度范数后半程显著高于所有其余曲线,且随步数推移持续缓慢抬升梯度流随训练进行逐渐失稳;但无黄色曲线的极端剧烈震荡,仅存在缓慢累积的梯度偏移,表明Post-Norm梯度流稳定性弱于Pre-Norm基线
  4. 04_ablation_no_rope(蓝色):梯度范数曲线与Baseline大体趋势类似,峰值和最终稳定值均略高于红线,前期衰减速率显著低于红线,波动幅度无明显差异,说明移除RoPE位置编码对反向传播梯度流影响较小,削弱文本建模能力。
  5. 05_ablation_silu(紫色):梯度范数全程略高于Baseline曲线,波动幅度、峰值、收敛值略高于基线,差距极小,激活函数的替换对梯度流无明显影响

4.4 学习率调度曲线

Ablation_train_learning_rate 图6:train/learning_rate(训练学习率调度)

本图为全部5组消融实验共用的学习率调度策略,5条曲线完全重合,不存在学习率调度差异:

  1. 调度逻辑统一:0~500步线性预热,学习率从0上升至最大值1e-3;500~5000步执行余弦衰减,学习率平滑下降至约6e-4
  2. 对照消融组差异分析:所有实验的学习率更新规则、最大/最小学习率、预热步数完全一致,排除了学习率调度作为各组性能差异的干扰变量
  3. 关键推论:No RMSNorm组出现的训练震荡、损失反弹,并非学习率调度不合适导致;而是模型自身缺失RMSNorm归一化层,梯度流先天不稳定,即便使用完全一致的学习率,也无法缓解训练失稳问题。

4.5 验证集泛化性能

验证集指标用于评估模型泛化能力,曲线差距相比训练集会进一步放大,可清晰区分各组件对泛化性能的影响程度。

Ablation_validate_loss 图7:val/loss(验证损失)

  1. 01_base_model(红色Baseline):验证损失全局最低,全程下降平滑,后期无明显上升泛化能力最优
  2. 02_ablation_no_rmsnorm(黄色):验证损失全程大幅高于其余所有组别,下降速率最慢泛化能力严重受损;是所有消融组中泛化性能最差的一组。
  3. 03_ablation_post_norm(绿色):验证损失略微高于Baseline,且4000步后出现略微抬升过拟合程度高于基线;证明Pre-Norm不仅优化训练收敛,还能有效抑制过拟合、提升泛化能力
  4. 04_ablation_no_rope(蓝色):验证损失下降趋势与Baseline接近,且验证损失始终高于Baseline,最终验证损失高于基线;说明缺失RoPE后,模型对未见过的测试文本时序依赖泛化能力下降
  5. 05_ablation_silu(紫色):验证损失曲线紧贴Baseline,全程差距较小,后期验证损失与Baseline差距略大;SwiGLU相比SiLU对泛化性能带来微弱正向增益

Ablation_validate_perplexity 图8:val/perplexity(验证困惑度)

验证困惑度与验证损失趋势完全同步,数值差距进一步放大,直观体现泛化预测精度:

  1. 01_base_model(红色Baseline):全程验证困惑度最低,对未知文本token预测精度最高,泛化能力最优
  2. 02_ablation_no_rmsnorm(黄色):全局最高验证困惑度,数值远超其余组别,对未见过文本的预测能力大幅衰退
  3. 03_ablation_post_norm(绿色):验证困惑度略微高于Baseline,后期曲线抬升,未知文本预测精度下降,泛化弱于Pre-Norm基线
  4. 04_ablation_no_rope(蓝色):前期验证困惑度与基线差距较大,全程验证困惑度显著高于Baseline,缺失时序位置编码导致长文本泛化预测精度下降
  5. 05_ablation_silu(紫色):验证困惑度与Baseline走势几乎一致,仅小幅偏高,激活函数替换对泛化预测精度影响最小

4.6 综合指标排序

各组综合性能排序(从最优至最差)—— 01_base_model(Baseline) > 05_ablation_silu > 03_ablation_post_norm > 04_ablation_no_rope > 02_ablation_no_rmsnorm

  1. 第一层级(核心必需:RMSNorm归一化层) 移除RMSNorm后,梯度流剧烈震荡、训练损失/困惑度多次断崖反弹,训练与验证集收敛、泛化能力全部大幅衰退,是对模型性能影响最大的核心组件;现代深层Transformer模型必须配置RMSNorm稳定梯度流
  2. 第二层级(时序建模:RoPE位置编码) 移除RoPE后,模型前期训练收敛无明显缺陷,但中后期长序列建模能力持续衰退,训练、验证损失与困惑度同步上升;位置编码是捕捉文本时序依赖的关键模块,对长文本泛化能力起到不可替代作用。
  3. 第二层级(关键结构:Pre-Norm归一化位置) 替换为Post-Norm后,梯度流随训练逐步失稳,验证集过拟合加重,泛化性能明显下降;Pre-Norm相比Post-Norm在训练稳定度、泛化能力上具备稳定正向增益,是LLM主流结构选择的合理设计。
  4. 第三层级(次要优化:SwiGLU门控激活) 将SwiGLU替换为SiLU后,梯度流、训练稳定度几乎无变化,训练与验证指标仅存在微小幅度衰退;SwiGLU仅带来小幅性能增益,是优先级最低的优化组件。
结论
  1. 归一化相关设计(RMSNorm、Pre-Norm)是深层语言模型训练稳定、泛化能力达标的核心基础,缺失或替换后会造成不可逆的性能衰退
  2. RoPE位置编码保障模型时序建模能力,尤其对长文本未知样本的泛化预测精度至关重要;
  3. SwiGLU门控激活属于小幅增益优化,在算力、参数量受限场景下,可权衡性能损失替换为轻量化SiLU激活
  4. 全部消融实验学习率调度完全统一,各组性能差异完全来自模型内部组件设计,排除了学习率带来的实验干扰,消融实验结论具备严谨有效性。

五、实验代码的工程价值

5.1 自动化批量实验

通过命令行参数和实验命名机制,我们可以编写脚本一次性运行所有消融实验,并将结果自动记录到wandb的不同项目中。例如:

Terminal window
# Baseline
python cs336_basics/U_Trainer.py --data_dir ./data --is_base_experiment --experiment_name baseline
# No RMSNorm
python cs336_basics/U_Trainer.py --data_dir ./data --no_rmsnorm --experiment_name no_rmsnorm
# Post-Norm
python cs336_basics/U_Trainer.py --data_dir ./data --norm_position post --experiment_name post_norm
# No RoPE
python cs336_basics/U_Trainer.py --data_dir ./data --no_rope --experiment_name no_rope
# SiLU
python cs336_basics/U_Trainer.py --data_dir ./data --use_silu --d_ff 2048 --experiment_name silu

5.2 可复现性与透明度

所有实验配置(包括每个开关的状态)都被记录在wandb配置和本地config.json文件中。每个检查点都包含了模型架构和优化器状态,确保了完全的可复现性——任何人都可以通过相同的命令行参数和检查点,复现出完全相同的结果。

5.3 文本生成验证

除了数值指标,我们还可以使用 T_Generate_text.py 脚本对训练好的模型进行定性评估。通过给定提示词(如“Once upon a time”),观察模型生成的文本质量,辅助验证消融实验的结论

总结

本篇博客将系列的前五篇成果汇聚于一个统一的实验框架,通过严谨的消融实验,用数据回答了“哪些设计选择真正重要”这一核心问题。我们不仅学会如何训练一个模型,更学会了如何科学地评估设计决策。

核心收获如下:

  • 训练框架:一个高度参数化的命令行工具,支持模型配置、消融开关、优化器超参数、数据加载、验证、检查点保存和wandb日志的全流程。
  • 实验方法:通过基线对照和系统性地移除/替换组件,量化每个设计点的贡献。
  • 实验结论:在现代LLM架构中,归一化层及其位置是最关键的设计因素,位置编码次之,激活函数的门控机制再次之。

至此,我们完成了从零构建、训练并系统验证一个Transformer语言模型的完整闭环。这个系列不仅是对技术的深入剖析,更是一次对深度学习科研方法论的全景演示。

分享:

学习路径

按顺序完成这组文章,循序渐进地掌握主题

学习进度6 / 7
  1. 1BPE(Byte-Pair Encoding) Tokenizer —— 从零构建BPE分词器
  2. 2Transformer Core Modules —— 从线性层到位置编码
  3. 3Attention Mechanism —— 从缩放点积到因果多头注意力
  4. 4TransformerBlock & TransformerLM —— 完整语言模型
  5. 5Transformer Training System —— 完整训练系统
  6. 6Transformer Training Experiments —— 完整训练实战与消融实验
  7. 7Transformer Inference Generation —— 推理生成式语言模型