如何深入理解大模型架构中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:输入是"已知的正确答案",让模型在每一步都基于正确历史来预测下一个词。
阅读全文