本文是在DataWhale的开展下的BaseLLM课程的学习笔记, 课程项目链接是:
https://github.com/datawhalechina/base-llm
本文主要是关于BaseLLM的第四章节注意力机制与Transformer这部分;
1.对于注意力机制而言,需要提前了解的是Seq2Seq(Sequence-to-Sequence)序列到序列的架构
Seq2Seq在2014年提出的,当时基于RNN和LSTM已经将一对一、多对多(严格对齐)、多对一任务处理的比较出色了,但是对于多对多(非严格对齐)的任务RNN和LSTM难以胜任,从而Seq2Seq应运而生。
Seq2Seq的原理是基于Autoencoder的。对于Autoencoder(自动编码器)存在Encoder-Decoder两部分,编码器将输入数据压缩为高阶特征向量,解码器则将这些高阶特征向量重构为与输入相似的输出,从而实现数据的重构。
Seq2Seq相较于Autoencoder而言,存在不同,因为Autoencoder希望尽量得到的输出结果和输入相似,从而去噪、降维、升维的任务,无法处理变长序列的问题,而Seq2Seq能够做到,Autoencoder是一次就生成,而Seq2Seq是逐次生成。
传统Autoencoder: 文件 → 压缩包 → 原文件(必须完全一样)
Seq2Seq: 英文小说 → 语义摘要 → 中文小说(内容等价,形式不同)
↑_________________________|
跨语言语义传递
2.为什么Seq2Seq能做到处理变长序列?
虽然Seq2Seq的原理基本和Autoencoder相似,但是Seq2Seq不同在于Encoder将输入序列压缩为一个向量C,而Decoder将得到的上下文向量进行解码最终输出和Encoder得到的输入序列长度不同的输出序列。 这是对于Seq2Seq整体信息流动路径的简短介绍,以下是关于每个阶段的详细介绍:
2.1Encoder信息压缩与抽象
Encoder:
# 以LSTM Encoder为例
h_t, c_t = LSTM(x_t, h_{t-1}, c_{t-1})
# 信息流动细节:
x_t (输入token)
→ Embedding Layer (256维词向量)
→ LSTM Cell (遗忘门/输入门/输出门)
→ h_t (隐藏状态,256维)
→ c_t (细胞状态,256维)
Encoder关键的信息流向特征:
- **单向信息流:**t时刻状态仅依赖t-1时刻,无法看到未来信息
- **渐进式压缩:**每步将新token信息与历史状态融合,信息密度逐步提升
- **梯度瓶颈:**反向传播时,梯度需跨越整个序列,易出现梯度消失/爆炸
2.2Decoder信息解压与生成
Decoder
# Decoder每步生成过程
s_t = LSTM(y_{t-1}, s_{t-1}, Context Vector)
y_t = softmax(W * s_t) # 预测下一个token概率分布
双路输入:上一时刻输出(y_{t-1}) + 解码器状态(s_{t-1}) + 上下文信息
自回归特性:当前预测依赖于自身历史预测,误差会累积
2.3Context Vector
这个Context Vector就是encoder和decoder关联的重点,信息流动的临界点:
- 维度固定:无论输入序列多长,Context Vector维度恒定(如512维)
- 信息密度最大化:需将整个输入序列语义压缩到固定维度向量
- 单点故障风险:若h_T信息不足,整个模型性能崩溃
3.Seq2Seq的训练
Seq2Seq引入了教师机制,在教师强制模式下,解码器在计算第 t 步的输出时,它的输入不再是上一时刻的预测值 ,而是直接使用数据集中真实的标签值 ,构造方式就是我们前面描述的"解码器输入"序列。通过这种方式,解码器的每个时间步都能接收到正确的历史信息,避免了误差累积,能够显著提升收敛稳定性与速度。