ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Transformer Encoder Block

Transformer Encoder Block 目录1.层归一化2.残差连接3.位置编码4.Dropout (暂退法)5.GELU激活函数Transformer架构于2017年在Attention Is All You Need这篇文章中提出是Google Brain的工作。Transformer网络由多个Transformer Block堆叠而成。原文提出的是一个Encoder-Decoder架构如下图所示。Encoder和Decoder分别由多个相同结构的Block但参数是不同的组成分别称为Encoder Block和Decoder Block。先分别介绍Encoder Block和Decoder Block的结构。Transformer Encoder Block由两个子层组成分别为多头自注意力 (multi-head self-attention) 子层和前馈 (Feed-Forward Network) 子层。多头自注意力子层的计算公式在第2节已经讲解过而FFN的计算公式如下其中x为序列中任意一个位置的输入向量。FFN层的参数在各个位置之间是共享的 (因此被称为 Position-Wise Feed-Forward Network)可以看作是每个位置的特征表示依次经过了(1) 参数为的线性层Linear-1。(2) ReLU。(3) 参数为的线性层Linear-2。一般来说Linear-1的输出层节点数量 Linear-2的输出层节点数量。在Transformer的原创论文中每个token的特征向量长度为512Linear-1输出节点数量为2048Linear-2的输出又恢复到512。Linear-1先通过升维提供更多的非线性特征Linear-2类似于一个特征选择的过程从中又组合出与原特征数量相同的新特征。Transformer Encoder Block中每一个子层的输出为其中Sublayer为多头自注意力或者是FFN。下图以自注意力子层为例显示了Encoder Block Sublayer的结构1.层归一化论文https://arxiv.org/pdf/1607.06450LayerNorm即层归一化它BatchNorm的作用相似都是用来约束网络中间层的输入数据分布有利于提高深度神经网络的训练稳定性和加快收敛速度。Batch Normalization (简称为BN) 和Layer Normalization (简称为LN) 的本质差异在于归一化的统计维度不同BN的统计是沿着Batch维度和Height、Width维度进行的换言之只保留了特征通道的维度 (每个特征通道一套均值和方差)。LN的统计是沿着特征维度进行的换言之保留了Batch和序列维度 (每个序列的每个token对应一套均值和方差)。在LN中各个序列的每一个位置的所有输入之间进行归一化。设LN层的输入序列为其中上标表示样本即序列的序号下标表示在序列中的位置。则归一化所需的统计量计算为归一化的计算单元为即每个序列中的每个位置的输入向量同样是可学习的参数主要是避免在使用$$Sigmoid$$作为激活函数时输入过于集中在准线性区而失去非线性拟合能力。在进行了层归一化之后每个向量在特征空间中相对原点的方向不变只是模发生了变化。层归一化之后输出向量的模期望为。实验研究证明层归一化更适合于自然语言处理任务。LN层在Transformer block中的位置也有一些变种在经典的Transformer结构以及Bert预训练模型中采用的是Post-LN而在LLM中大多采用Pre-LN。这些选择主要是在实践中获得的。pytorch的LN层 (nn.LayerNorm)文档LayerNorm — PyTorch 2.14 documentation2.残差连接在Transformer Encoder Block中自注意力或FFN Layer的输入和输出被加到一起之后再输入给LayerNorm Layer。xSublayer(x)的结构即残差连接 (Residual Connection) 。残差连接的核心思想是通过引入“捷径” 在有的论文中又被称为highway将输入直接传递到后边的层这在实际上减小了梯度传播的层数。极深的神经网络 (上百层甚至上千层) 由于梯度连乘的作用容易发生梯度消失。残差连接最主要的作用是通过引入捷径减小反向传播过程中梯度幅度衰减的程度从而缓解梯度消失的影响改善神经网络的训练效果。3.位置编码Transformer并不是一个时间序列模型。实际上如果我们将序列中第i个位置和第j个位置上的token互换那么最后计算得到的输出也只是同样在i,j位置上发生了互换而已除此以外每个位置上的输出特征都和之前完全一样。但显然句子中token的顺序会严重影响语义。因此Transformer的输入特征中增加了对token所在位置的编码用公式表示为其中为第i个token的嵌入向量 (Embedding Vector)为位置i的位置编码。位置编码可以通过增加位置嵌入词典的方式直接学到即增加一个嵌入词典每个位置i对应一个嵌入向量。Embedding权重随机初始化作为模型参数在训练过程中进行更新。BERT采用了这种位置编码策略Embedding的行数为512即支持0511位置的位置编码。这种方式无法在推理阶段扩展序列长度。另外一种方式是基于正弦曲线计算位置编码详见https://zhuanlan.zhihu.com/p/7149740464.Dropout (暂退法)论文https://dl.acm.org/doi/pdf/10.5555/2627435.2670313Dropout是一种在深度学习中广泛使用的技术用于防止神经网络的过拟合。它的做法是在训练过程中随机丢弃即置为零一部分神经元的输出从而减少模型对特定输入特征的依赖增强模型的泛化能力。Dropout层在训练阶段和评测推理阶段的计算逻辑不同。在训练阶段Dropout层会基于一定的概率(dropout_rate)随机地将一部分神经元的输出设置为0那么这些被置为0即丢弃的神经元不再会有梯度传播下去。而被保留的特征会除以 (1-dropout\_rate)使得dropout的输出和之前大致在同一个数量水平上。在随机丢弃了一部分特征之后神经网络只能依靠余下的特征进行预测这可以看作是一种集成学习的策略。在推理阶段Dropout层直接透传输入等价于没有dropout。Transformer中应用Dropout的模块有每个子层的输出 (在与子层输入相加之前)Embedding层的输出 (在Word Embedding与Position Embeeding相加之后)Attention Dropout: 在每个query的attention score中随机drop相当于对应位置的value不会被加到最后的输出中了。PyTorch中的Dropout层Dropout — PyTorch 2.14 documentation5.GELU激活函数论文https://arxiv.org/pdf/1606.08415一些Transformer模型 (如BERTLLM) 中采用了引入非线性门控机制的激活函数用来代替FFN子层中的ReLU。这里我们先介绍在BERT模型中采用的GELU激活函数其公式为其中为标准正态分布的概率累积函数即在Transformer中输入数据通常经过了归一化因此分布接近于标准正态分布。在GELU的公式中x值越大其被透出的程度就越高透出系数为输入数据 (表达为随机变量X)取值不大于x的概率 概率累积函数的定义。显然可以理解为一个取值在01之间的非线性门控函数可以带来以下优势提高模型的非线性表达能力。通过门控机制过滤不重要的信息提升模型效果。梯度是连续的而不是像ReLU那样存在梯度跳变点。标准正态分布的概率密度函数 (PDF) 和概率累积函数 (CDF) 的图像如下所示标准正态分布的CDF公式计算复杂实际应用时可以采用以下近似公式或者GELU论文中贴出的GELU、ReLU和ELU的图像比较相关的PyTorch模块GELU — PyTorch 2.14 documentationELU — PyTorch 2.14 documentation
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进