从零开始讲LLM(大语言模型)原理-2.2Encoder-Decoder
1. 关于Encoder、Decoder
Attention 机制和 Transformer 的核心——Encoder、Decoder 结构
在《Attention is All You Need》中,作者摒弃传统的 RNN、CNN 架构,仅依靠注意力机制构建出 Transformer 模型,引发了 NLP 领域的重大变革。Transformer 的核心组件为编码器(Encoder)和解码器(Decoder),二者均运用了注意力机制。后续基于 Transformer 发展的预训练语言模型,多通过对 Encoder - Decoder 部分的改进来构建新架构,像仅采用编码器的 BERT、仅使用解码器的 GPT 等。基于此前介绍的注意力机制,从 Transformer 所面向的 Seq2Seq 任务入手,可对其 Encoder - Decoder 结构展开解析。
Transformer 最初是为解决序列到序列任务设计的。Encoder 对输入进行“消化理解”,Decoder 利用这个理解进行“创作生成”,这是序列转换任务(如翻译、摘要)最核心的逻辑流程。
2.Seq2Seq模型
Seq2Seq,即序列到序列,是一种经典 NLP 任务。
Seq2Seq 是 NLP 最经典的任务,几乎所有的 NLP 任务都可以视为 Seq2Seq 任务。例如文本分类任务,可以视为输出长度为 1 的目标序列;词性标注任务,可以视为输出与输入序列等长的目标序列。
机器翻译任务即是一个经典的 Seq2Seq 任务,例如,我们的输入可能是“今天天气真好”,输出是“Today is a good day.”。Transformer 是一个经典的 Seq2Seq 模型,即模型的输入为文本序列,输出为另一个文本序列。事实上,Transformer 一开始正是应用在机器翻译任务上的。
对于 Seq2Seq 任务,一般的思路是对自然语言序列进行编码再解码。所谓编码,就是将输入的自然语言序列通过隐藏层编码成能够表征语义的向量(或矩阵),可以简单理解为更复杂的词向量表示。而解码,就是对输入的自然语言序列编码得到的向量或矩阵通过隐藏层输出,再解码成对应的自然语言目标序列。通过编码再解码,就可以实现 Seq2Seq 任务。
Transformer 中的 Encoder,就是用于上述的编码过程;Decoder 则用于上述的解码过程。
Transformer 由 Encoder 和 Decoder 组成,每一个 Encoder(Decoder)又由 6个 Encoder(Decoder)Layer 组成。输入源序列会进入 Encoder 进行编码,到 Encoder Layer 的最顶层再将编码结果输出给 Decoder Layer 的每一层,通过 Decoder 解码后就可以得到输出目标序列了。

通过上述结构,实现“I like you”翻译为“我喜欢你”
接下来,我们将首先介绍 Encoder 和 Decoder 内部传统神经网络的经典结构——前馈神经网络(FNN)、层归一化(Layer Norm)和残差连接(Residual Connection),然后进一步分析 Encoder 和 Decoder 的内部结构。
2.1.前馈神经网络
Transformer 的每个 Encoder Layer 均包含注意力机制和前馈神经网络。其结构简单,由两层线性变换组成:第一层将输入维度映射至隐藏维度,经 RELU 激活函数处理后,通过第二层线性变换还原至输入维度,同时引入 Dropout 层防止过拟合。代码中通过nn.Linear定义线性层,前向传播过程为 “线性变换→RELU 激活→线性变换→Dropout” 的组合。
2.2.层归一化
作为深度学习中常用的归一化操作,层归一化旨在使网络各层输入的分布保持一致,缓解深度网络中因参数更新导致的输入分布偏移问题。
- 与批归一化(Batch Norm)不同,层归一化在单个样本的所有维度上计算均值和方差,而非跨样本统计。
- 批归一化存在缺陷:小批量时统计量不可靠、不适用于 RNN 时间维度、训练测试统计量不一致且计算耗时。层归一化则规避了这些问题,更适配变长序列等场景。
- 实现上,通过计算样本维度均值和标准差进行标准化,再通过可学习参数(
a_2和b_2)调整分布,公式为a_2 * (x - mean) / (std + ε) + b_2。
2.3.残差连接
为避免 Transformer 因结构复杂、层数深导致的模型退化,引入残差连接:每一层的输出由该层处理结果与原始输入相加得到,使底层信息可直接传递至高层,让模型更专注于学习残差。
在 Encoder 中,注意力层和前馈神经网络层均采用残差连接:先对输入做层归一化,经对应子层(注意力 / 前馈网络)处理后,与原始输入相加。
- 代码中通过 “
h = x + 注意力层输出”“out = h + 前馈网络输出” 的方式实现,其中注意力层和前馈网络的输入均经过层归一化处理。
本帖内容参考资料:《从零开始的大语言模型原理于实践教程》
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)