文章目录
- 一、位置编码
- 1.1 介绍
- 1.2 简单探讨
- 二、多头注意力
- 2.1 一般的多头注意力机制
- 2.2 解码器中的掩码多头注意力机制(Look-ahead Mask)
- 三、残差连接
- 四、层归一化
- 4.1 对比不同的Normalization
- 4.2 Batch Normalization的实现
- 4.3 Layer Normalization的实现
- 4.4 Layer Normalization所处位置的讨论
- 4.5 何以使用LN而非BN
- 五、基于位置的前馈网络
Transformer总结(二)中介绍Transformer的整体架构,下文主要介绍其中涉及的一些组件,尽可能从多角度来探讨它们的作用。
一、位置编码
【Transformer系列】深入浅出理解Positional Encoding位置编码
一文通透位置编码:从标准位置编码、旋转位置编码RoPE到ALiBi、LLaMA 2 Long(含NTK-aware简介)
Transformer总结(一):基础介绍(注意力机制、自注意力机制、位置编码、多头注意力机制)
1.1 介绍
Transformer模型本身不具有处理序列顺序的能力,为了让模型能够理解词序,就需要借助位置编码注入位置信息。
-
位置编码将位置信息注入到输入里:假设长度为 n n n的序列是 X ∈ R n × d X\in \mathbb{R}^{n\times d} X∈Rn×d
-
使用位置编码矩阵 P ∈ R n × d P\in \mathbb{R}^{n\times d} P∈Rn×d,输出 X + P X+P X+P作为自编码输入
-
P P P中的元素根据列的奇偶差异,分为: p i , 2 j = sin ( i 1000 0 2 j d ) p_{i,2j}=\sin(\frac{i}{10000^{\frac{2j}{d}}}) pi,2j=sin(10000d2ji), p i , 2 j + 1 = cos ( i 1000 0 2 j d ) p_{i,2j+1}=\cos(\frac{i}{10000^{\frac{2j}{d}}}) pi,2j+1=cos(10000d2ji), j j j始于0
-
绝对位置信息:在上述公式中,频率 ω j = 1 1000 0 2 j d \omega_j=\frac{1}{10000^{\frac{2j}{d}}} ωj=10000d2j1,从函数定义中可以得出,频率沿向量维度减小, j j j越大,波长越长;不同词元的位置编码仅由其位置唯一决定
-
相对位置信息:选择正弦余弦曲线函数,可以让模型更加轻易的学习关注相对位置信息
[ cos ( δ ω j ) sin ( δ ω j ) − sin ( δ ω j ) cos ( δ ω j ) ] [ p i , 2 j p i , 2 j + 1 ] = [ sin ( ( i + δ ) ω j ) cos ( ( i + δ ) ω j ) ] = [ p i + δ , 2 j p i + δ , 2 j + 1 ] \begin{bmatrix}\cos(\delta\omega_j) & \sin(\delta\omega_j)\\-\sin(\delta\omega_j) & \cos(\delta\omega_j)\end{bmatrix}\begin{bmatrix}p_{i,2j}\\p_{i,2j+1}\end{bmatrix}=\begin{bmatrix}\sin((i+\delta)\omega_j)\\\cos((i+\delta)\omega_j)\end{bmatrix}=\begin{bmatrix}p_{i+\delta,2j}\\p_{i+\delta,2j+1}\end{bmatrix} [cos(δωj)−sin(δωj)sin(δωj)cos(δωj)][pi,2jpi,2j+1]=[sin((i+δ)ωj)cos((i+δ)ωj)]=[pi+δ,2jpi+δ,2j+1]
通过一个 2 × 2 2\times2 2×2的投影矩阵(与 i i i值无关),便可以实现线性投影,也可以理解为某个单词的位置信息是其他单词位置信息的线性组合,这种线性组合就意味着位置向量中蕴含了相对位置信息。
-
1.2 简单探讨
不过值得探讨的是此处对位置编码的使用,它可以与词向量直接相加,也可以直接拼接到词向量后面,而论文选择使用前者,并且前者确实足够有效,从直观角度来看,直接相加可能导致信息损失,但这种损失依然被神经网络强大的抽象能力所理解,并从中得到了更加丰富的上下文信息。
二、多头注意力
Transformer总结(一):基础介绍(注意力机制、自注意力机制、位置编码、多头注意力机制)
d2l-10.5 多头注意力
2.1 一般的多头注意力机制
给定查询 q ∈ R d q q\in \mathbb{R}^{d_q} q∈Rdq、键 k ∈ R d k k\in \mathbb{R}^{d_k} k∈Rdk和值 v ∈ R d v v\in \mathbb{R}^{d_v} v∈Rdv,每个注意力头的计算方法为:
h i = f ( W i ( q ) q , W i ( k ) k , W i ( v ) v ) ∈ R p v h_i=f(W_i^{(q)}q,W_i^{(k)}k,W_i^{(v)}v)\in\mathbb{R}^{p_v} hi=f(Wi(q)q,Wi(k)k,Wi(v)v)∈Rpv
多头注意力的输出需要经过另一个线性转换, 它对应着 h h h个头连结后的结果:
W o [ h 1 ⋮ h h ] ∈ R p v W_o\begin{bmatrix}h_1\\\vdots\\h_h\end{bmatrix}\in \mathbb{R}^{p_v} Wo h1⋮hh ∈Rpv
- 其中可学习的参数包括: W i ( q ) ∈ R p q × d q W_i^{(q)}\in\mathbb{R}^{p_q\times d_q} Wi(q)∈Rpq×dq、 W i ( k ) ∈ R p k × d k W_i^{(k)}\in\mathbb{R}^{p_k\times d_k} Wi(k)∈Rpk×dk、 W i ( v ) ∈ R p v × d v W_i^{(v)}\in\mathbb{R}^{p_v\times d_v} Wi(v)∈Rpv×dv和 W o ∈ R p o × h p v W_o\in\mathbb{R}^{p_o\times hp_v} Wo∈Rpo×hpv
- 代表注意力汇聚的函数 f f f,此时是缩放点积注意力
2.2 解码器中的掩码多头注意力机制(Look-ahead Mask)
在Transformer总结(二)中的3.4.2 讨论了掩码机制是在解码器的训练阶段发挥作用,是为了并行计算时可以获得不同时间步的输入,此时将讨论是如何实现这种掩码计算。
图片来源(Illustrated Guide to Transformers Neural Network: A step by step explanation)
首先根据一般的多头注意力计算得到注意力分数矩阵,此时尚未引入mask
在计算完注意力分数之后,此时分数矩阵还没有经过sofamax操作,将其与一个右上角填充了负无穷大的mask矩阵相加,相加之后得到一个新的注意力分数矩阵。根据观察,可以发现,在这个新的矩阵上,单词与其后的单词的注意力分数变为了负无穷大。
对注意力分数使用softmax操作,可以发现原先负无穷大的值逼近了0,它们的注意力权重也就可以忽略不计了。
三、残差连接
Deep Residual Learning for Image Recognition论文原文
在Transformer模型中,残差连接(Residual Connection) 通过将输入数据与其通过子层变换后的数据相加,以提高模型的训练稳定性和深度。这种操作不仅保留了原始数据的某些信息,还允许模型学习输入数据的多个层次表示。
四、层归一化
详解三种常用标准化 Batch Norm & Layer Norm & RMSNorm
Group Normalization(图片出处)
4.1 对比不同的Normalization
- N N N表示批量轴
- C C C表示通道轴(特征轴)
- ( H , W ) (H,W) (H,W)表示空间轴
- 蓝色像素是相应计算时涉及到的位置,通过相同的平均值和方差进行归一化,聚合这些像素的值来计算。
从上图不难发现,不同的归一化方法区别只在于像素集选取的差异。但上图对于数据的表示需要特别说明一下:
- 如果是2D图片,可以构成一个4D向量,以 (N, C, H, W ) 顺序索引特征,其中 N 是批处理轴,C 是通道轴, H和W是空间高度和宽度轴。
- 如果是句子,可以将其理解为高度为1的数据,像素的通道数就是token的特征向量长度, C C C作为词嵌入特征向量的索引, ( H , W ) (H,W) (H,W)理解为一个句子中词元的索引。
4.2 Batch Normalization的实现
如果以 S i S_i Si表示每次计算归一化时涉及到的位置集,Batch Normalization对应的 S i S_i Si定义为:
S i = { k ∣ k C = i C } S_i=\{k\vert k_C=i_C\} Si={k∣kC=iC}
这意味着只要特征轴索引相同的位置会被一起归一化。
结合上图,Batch Normalization处理的是同一个特征轴下的元素,需要访问每个批次以及其中所有的样本。
- 如果是图片,它将访问所有批次所有样本的某张特征图,4D向量为(N, C, H, W ) 时,将计算C次归一化
- 一般不使用BN来处理NLP问题,因为句子长度不一,如果以特征图的角度来理解,也就是不同批次下特征图的大小不同,不利于使用。
4.3 Layer Normalization的实现
Layer Normalization对应的 S i S_i Si定义为:
S i = { k ∣ k N = i N } S_i=\{k\vert k_N=i_N\} Si={k∣kN=iN}
这意味着只要批量轴索引相同的位置会被一起归一化。
不过此时需要特别说明:
- CV领域是使用上述公式来进行层归一化计算,如果是图片,每次计算它将访问同一批次下所有的元素(同一批次里所有样本所有通道)
- 在Transformer模型中,是以token为单位单独计算,每次计算它只会访问句子中一个词元对应的特征向量,如对于形状为(2,3,4)的向量,它将计算6次层归一化。
4.4 Layer Normalization所处位置的讨论
OnLayer Normalization in the Transformer Architecture
《为什么Pre Norm的效果不如Post Norm?》-苏剑林
pre-norm 和 post-norm 的区别 -唐翔昊
在上述架构中,改变了归一化操作所处的位置,具体而言就是 P r e N o r m Pre\ Norm Pre Norm是先进行归一化,再将数据输入子层,最后进行残差,公式描述如下:
P r e N o r m : x t + 1 = x t + F t ( N o r m ( x t ) ) Pre\ Norm:\ \ x_{t+1}=x_t+F_t(Norm(x_t)) Pre Norm: xt+1=xt+Ft(Norm(xt))
P o s t N o r m : x t + 1 = N o r m ( x t + F t ( x t ) ) Post\ Norm:\ \ x_{t+1}=Norm(x_t+F_t(x_t)) Post Norm: xt+1=Norm(xt+Ft(xt))
- 同一设置之下,Pre Norm结构往往更容易训练,但最终效果通常不如Post Norm。
- 一个L层的Pre Norm模型,其实际等效层数不如L层的Post Norm模型,而层数少了导致效果变差。
- Pre Norm结构会过度倾向于恒等分支(bottom layers),从而使得Pre Norm倾向于退化(degradation)为一个“浅而宽”的模型,最终不如同一深度的Post Norm。
4.5 何以使用LN而非BN
- 4.2中已经说明了BN不适用于不定长的序列,可能导致训练的不稳定。
- BN会损失样本之间的信息差异性,而LN是按照词元进行计算,可以保留不同词之间的差异性。
五、基于位置的前馈网络
F F N ( X ) = m a x ( 0 , X W 1 + b 1 ) W 2 + b 2 FFN(X)=max(0,XW_1+b_1)W_2+b_2 FFN(X)=max(0,XW1+b1)W2+b2
在Transformer模型中,前馈网络(Feed-Forward Network,FFN)的作用是对序列数据进行进一步的非线性变换,使得模型能够捕捉到更复杂的特征,具体而言就是先将数据映射到高维空间再映射到低维空间。