Attention is All You Need.
3.Model Architecture
3.1 整体架构如图
3.2 Encoder与Decoder
- Encoder:由 N = 6 N=6 N=6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer:多头注意力和MLP(FFN,前馈神经网络),每个子层被一个残差链接包围,且后接一个LayerNorm。由于残差链接要求被包围的Block输入输出shape一致(比如Resnet中利用PWConv达到降维、尺寸缩减,来保证输入输出的shape一致)。多头注意力层和FFN层就要满足此条件,因此作者选择固定网络中的Embedding dimension为512。每个子层的输出可以用公式表示为 LayerNorm ( x + SubLayer ( x ) ) \text{LayerNorm}(x + \text{SubLayer}(x)) LayerNorm(x+SubLayer(x))。 x x x为输入。
Q: SliceGPT如何解决各层hidden dimension一致的问题?
-
Decoder:同样为6个Block。有两个多头注意力子层,一个FNN子层。且使用自回归的方式:t时刻Decoder的输入,为t时刻以前所有Decoder的输出的总和。
- masked self multi-head attention: mask样本t时刻以后的输入,保证t时刻无法看到未来的输入,避免模型“作弊”。理解起来很简单,因为预测第i个位置的输出时只能依靠第i个位置以前的所有输出单词的语义信息。
-
为什么用LN而不是BN?
BN针对特征做归一化,LN则针对样本。LN在机器翻译中会用的更多,主要是因为输入序列的长度通常不一致。(在训练中,使用zero padding来解决输入长度不一致的问题)。如果一个batch中输入序列的长度差异很大,则得到的mean,square也会产生震荡。并且在预测时,由于使用全局的mean square,如果输入序列很长,比train set的序列都要长,则预测效果也会变差(因为之前没有统计过)。
3.3 Attention
概括来说,Attention就是一个将query,key,value映射为output的函数。output,k,v,q均为矩阵/向量。output为value的加权平均,权重由key和query的相似度函数计算得到,不同的attention实现会有不同的计算相似度的方法。
- 注:这里的query,key,value都是指attention的输入。当然有些文章也会指Attention中q, k, v对应的权重矩阵。这里需要指出,输入的shape一般都是一样的: x ∈ R N × d model x \in R^{N \times d_{\text{model}}} x∈RN×dmodel。其中 N N N为序列长度, d model d_{\text{model}} dmodel为embedding长度。如果是权重矩阵,比如key的 w k ∈ R d model × d k w_k \in R^{d_{\text{model}}\times d_{\text{k}}} wk∈Rdmodel×dk,相当于把输入 x x x投影到另一个维度 d m o d e l → d k d_{model} \to d_k dmodel→dk。
3.3.1 Scaled Dot-Product Attention
最基本的Attention。 Q Q Q与 K K K的hidden dimension维度 d k d_k dk, V V V为 d v d_v dv,计算 K K K与 Q Q Q的内积作为 V V V的权重。具体公式如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V (1) \text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V \tag1 Attention(Q,K,V)=softmax(dkQKT)V(1)
Q , K , V Q, K, V Q,K,V 在这里就是输入乘以权重矩阵后的结果: Q ∈ R N × d k , K ∈ R d k × m , V ∈ R m × d v Q \in R^{N \times d_k}, K \in R^{d_k \times m}, V \in R^{m \times d_v} Q∈RN×dk,K∈Rdk×m,V∈Rm×dv。比如 Q = x w k Q = xw_k Q=xwk。
Scaled:除以了 d k \sqrt{d_k} dk。当 d k d_k dk很大时,维度数过多,各个值可能差别很大,softmax后大的值很大,小的值很小,softmax函数的梯度,会变得很小,train不动。(这个具体是根据softmax函数的一次函数来看)。
- Mask:mask掉的是key-value,即对t时刻以后的key-query weight设为0(即进入softmax前设一个很大的负数)。
3.3.2 多头注意力
将高维的 Q , V , K Q,V,K Q,V,K(输入)投影到低维,投影h次分别得到h个低维的 Q , V , K Q,V,K Q,V,K,再分别做attention(相当于h个头),把h个头的attention输出并在一起,然后投影回原维度。多头注意力能让模型学习更多参数,相当于学习不同角度的信息。
示意图如Figure 2右图所示:h个头的attention。原特征维度 d model d_\text{model} dmodel,则投影后的维度为 d model / h = d k = d v d_\text{model} / h = d_k = d_v dmodel/h=dk=dv。 K , Q , V K,Q,V K,Q,V经投影矩阵(权重矩阵),也就是Linear层降维后送入Attention,将h个头的Attention拼接,再经过最后的Linear升维度,得到输出。原文中 h = 8 , d model = 512 , d k = d v = 64 h=8, \ d_\text{model}=512, \ d_k = d_v = 64 h=8, dmodel=512, dk=dv=64为每个头的hidden dimension长度。
Attention的参数量。https://blog.csdn.net/qq_46009046/article/details/134417286
具体Multi-Head实现如以下公式:
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
.
.
.
,
h
e
a
d
h
)
W
O
w
h
e
r
e
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
\begin{aligned} \mathrm{MultiHead}(Q,K,V)& =\mathrm{Concat}(\mathrm{head}_1,...,\mathrm{head}_\mathrm{h})W^O \\ \mathrm{where~head_i}& =\mathrm{Attention}(QW_{i}^{Q},KW_{i}^{K},VW_{i}^{V}) \end{aligned}
MultiHead(Q,K,V)where headi=Concat(head1,...,headh)WO=Attention(QWiQ,KWiK,VWiV)
W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v W_i^Q\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^K\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^V\in\mathbb{R}^{d_{\mathrm{model}}\times d_v} WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv, W O ∈ R h d v × d m o d e l W^O\in\mathbb{R}^{hd_v\times d_{\mathrm{model}}} WO∈Rhdv×dmodel均为权重矩阵(投影矩阵)。 Q , K , V ∈ R N × d m o d e l Q ,\ K,\ V \in \mathbb{R}^{N \times d_{model}} Q, K, V∈RN×dmodel
3.3.3 Attention的不同应用
假设输入序列长为 N N N
-
Encoder:输入shape为 R ∈ N × d model R \in {N \times d_\text{model}} R∈N×dmodel。输出shape与输入相同。
-
Decoder中的Masked-MHSA:与Encoder中的attention类似,不过用了mask保证自回归性。
-
Cross-Attention:Encoder的输出作为key-value,之前的Decoder输出信息的总和得到的embedding作为query,相当于考虑decoder与encoder的embedding之间的相关性。具体到机器翻译中,如英译中,就是中文某个字与英文某个句子(多个字)的关系。
3.4 Point-Wise FFN
简而言之就是两个全连接层。Point指的是每个word embedding,即针对每个word做处理。与PWConv类似但参数量不同。
PWFFN为:
in_embedding
×
out_embedding
\text{in\_embedding} \times \text{out\_embedding}
in_embedding×out_embedding,而PWConv为:
in_channel
×
out_channel
\text{in\_channel} \times \text{out\_channel}
in_channel×out_channel。
为什么能用Point-Wise FFN,也就是对每个word做投影?因为Attention部分已经汇聚了语义信息(词与词之间的相关度),MLP相当于只是做维度的变换。
3.5 Embeddings and Softmax
embedding层中权重乘以 d model \sqrt{d_\text{model}} dmodel,因为L2Norm把权重惩罚得很小。
3.6 Positional Encoding
Attention中没有考虑单词的位置信息,所以理论上来说,如果不加入位置信息,把输入word顺序打乱之后,attention输出应该一致。所以要加入位置编码信息。
预测过程:
Encoder:直接获得整个句子的输入的Embedding,经过6个block,然后得到Encoder的输出,比较直接。
Decoder:先输入起始符(S),经过n层decoder,每一层decoder都要通过masked自注意力机制,以及交互注意力机制(和encoder输出的k,v进行计算,这里就说明decoder在交互注意力不需要再算k,v),在最后一层输出预测结果。然后把最新的预测结果以及历史预测结果综合起来,再放到decoder中,做下一个word的预测,直到得到终止符(E)。
训练过程
Encoder:与预测过程类似。
Decoder:与预测过程不同的是,采用Teacher Forcing的方式,即直接告诉Decoder整个目标序列(也就是正确的输出结果),但是由于预测阶段中,不可能直接告诉你答案是上面,因此会加一些随机mask,比如对15%的单词加入mask,以保证训练效果。
文献标注
Attention的参数数量: https://blog.csdn.net/qq_46009046/article/details/134417286
Attention的训练,推理过程: https://blog.csdn.net/AIcar_lrm/article/details/138577652
问题
- auto regressive 是什么意思?
自回归模型:自变量和因变量应当属于同一个分布。比如根据前n天的股票价格,预测下一天的股票价格。(过去时候的输入作为当前时刻的输入)
- 为什么要除以
d
k
\sqrt {d_k}
dk?
- 在数值过大/过小的情况下,softmax的偏导数值过小,造成学习困难。除以$\sqrt {d_k} $相当于将输入控制在均值为0,方差为1,控制了数量级。还起到了归一化的作用
- BN和LN是什么。Transformer中用的是什么?
LN:对每个Batch中,所有样本基于所有维度进行归一化,均值和方差数量根据batch_size决定()。
BN:对各个Batch中的样本,在各个维度进行归一化,均值和方差数量根据batch中的word数量决定(图片的话是维度)。
使用的实际上是InstanceNorm,对每个instance的所有维度做归一化,但是pytorch中可以用nn.LayerNorm函数实现
实现细节:
- d m o d e l = 512 d_{model}=512 dmodel=512,模型中的embedding dimension和output的维度固定为512,以保证训练效率
-
h
=
8
h = 8
h=8代表使用8个头的注意力
d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model} / h=64 dk=dv=dmodel/h=64 为每个矩阵得到的向量维度。
ding dimension和output的维度固定为512,以保证训练效率 -
h
=
8
h = 8
h=8代表使用8个头的注意力
d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model} / h=64 dk=dv=dmodel/h=64 为每个矩阵得到的向量维度。