如何深入理解大模型架构中encoder-decoder的复杂训练与推理计算全过程?
摘要:看一遍就懂-大模型架构及encoder-decoder详细训练和推理计算过程 一、特殊Token的意思 不同模型架构的特殊token体系 BERT(Encoder-only,用于理解任务): <CLS&
看一遍就懂-大模型架构及encoder-decoder详细训练和推理计算过程
一、特殊Token的意思
不同模型架构的特殊token体系
BERT(Encoder-only,用于理解任务):
<CLS>:放在句首,用于分类任务,其输出向量代表整句语义
<SEP>:分隔符,用于句对任务(如问答、文本蕴含)
<PAD>:填充符,用于batch内长度对齐
<MASK>:掩码符,用于预训练的完形填空任务
GPT(Decoder-only,用于生成任务):
<|endoftext|>:既是文档结束符,也用作句子间分隔符
<PAD>:填充符(但GPT很少用,因为生成任务不需要严格对齐)
T5(Encoder-Decoder,统一框架):
<pad>:填充
<eos>:句子结束符
<unk>:未知词
没有专门的<bos>,因为T5用任务前缀(如"translate English to German:")
现代Encoder-Decoder(如BART、mBART、mT5):
<s>:句子开始符(相当于<bos>)
</s>:句子结束符(相当于<eos>)
<pad>:填充符
我们的例子将使用经典的Seq2Seq符号体系
为了讲解清晰,我采用最经典、最直观的设定:
<bos>:Begin of Sequence,告诉decoder"我要开始生成了"
<eos>:End of Sequence,告诉decoder"我生成完了,该停了"
<pad>:Padding,在batch训练中让所有序列等长
二、完整训练流程的剧本(从数据准备到参数更新)
让我们以"今天天气很好"这个训练样本为主线,完整演绎一遍训练的全过程。
第一幕:数据预处理(演员准备上场)
原始训练样本
源语言(中文):今天天气很好
目标语言(中文):今天天气很好 # 这是个复述任务的例子
Token化(切词)
源序列:[今, 天, 天, 气, 很, 好]
目标序列:[今, 天, 天, 气, 很, 好]
添加特殊token(关键步骤!)
Encoder输入(源序列加结束符):
[今, 天, 天, 气, 很, 好, <eos>]
长度 = 7
为什么Encoder要加<eos>?因为这告诉模型"源句子到此结束了,没有更多信息了"。在翻译任务中,这个信号很重要,它让模型知道不要再期待更多源语言词汇。
Decoder输入(目标序列加开始符):
[<bos>, 今, 天, 天, 气, 很, 好]
长度 = 7
为什么Decoder输入要加<bos>?这是生成的"起始信号",就像告诉一个作家"请开始写作"。第一个词的生成需要一个初始上下文,<bos>就扮演这个角色。
训练标签(目标序列加结束符):
[今, 天, 天, 气, 很, 好, <eos>]
长度 = 7
为什么标签要加<eos>?因为我们要训练模型学会"什么时候停止生成"。最后一个时间步,模型应该预测<eos>而不是继续生成新词。
转换为ID(查词表)
假设我们的词表(10个词)是:
词表 = {
<pad>: 0,
<bos>: 1,
<eos>: 2,
今: 3,
天: 4,
气: 5,
很: 6,
好: 7,
的: 8,
是: 9
}
转换后:
Encoder输入 ID: [3, 4, 4, 5, 6, 7, 2]
Decoder输入 ID: [1, 3, 4, 4, 5, 6, 7]
标签 ID: [3, 4, 4, 5, 6, 7, 2]
注意Decoder输入和标签的错位关系,这就是Teacher Forcing:输入是"已知的正确答案",让模型在每一步都基于正确历史来预测下一个词。
