本文是对UvA Deep Learning的讲义的理解及笔记
注意力机制(Attention)
注意力机制中最为核心的是个概念分别是:
- Query-查询:代表当前需要关注的目标。在处理序列数据时,每个元素都生成一个Query ( Q = X ⋅ W Q Q=X \cdot W^Q Q=X⋅WQ),用以与其他元素的Key进行比较,以确定其相关性。
- Key-键: 每个输入元素也会生成一个Key( Q = X ⋅ W K Q=X \cdot W^K Q=X⋅WK),这些Key用来与Query进行匹配。Key的目的是帮助系统识别每个元素对Query的重要程度
- Value-值:与Key相对应的Value ( Q = X ⋅ W Q Q=X \cdot W^Q Q=X⋅WQ)包含了实际的数据内容。一旦Query和Key匹配确定了相关性,相应的Value就会用来计算最终的输出。
- Score function: score function用来计算不同输入元素之间的关联强度,其计算步骤为:
- 计算得分:Transformer使用scale Dot-Product Attention作为得分函数,把每个Query与所有的Key进行点积,的饭反映了各个元素与当前Query的相关性。 f a t t e n ( k e y i , q u e r y ) f_{atten}(key_i, query) fatten(keyi,query)
- 缩放:点积后的score使用 d k \sqrt {d_k} dk进行缩放,避免在维度较高时计算得分过程中梯度消失或者爆炸。
- 引用Softmax: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
Note: 上述的权重矩阵是需要我们在训练中不断学习,调整的。
多头注意力
多头注意力机制允许模型对一个序列输入的多个层面进行感知。具体来说,对于同一个输入,多头注意力机制使用不同的权重矩阵( W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV)分别形成自己的Query, Key 和Value向量。它们分别进行Scale Dot Product Attention操作,相当于从不同角度分别观察这个序列。
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
\begin{equation} Multihead(Q, K, V) = Concat(head_1, \cdots, head_h)W^O \end{equation}
Multihead(Q,K,V)=Concat(head1,⋯,headh)WO
where
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
)
head_i = Attention (QW_i^Q, KW_i^K, VW_i^V)
headi=Attention(QWiQ,KWiK,VWiV)
Transformer encoder and Decoder
Transformer是由编码器和解码器组成,编码器负责处理输入数据并转换为一系列上下文相关的输出,这些输出随后被解码器用于生成最终结果。在大多数NLP任务中,如机器翻译或文本生成,编码器的作用是理解和转换输入文本,而解码器则基于编码器的输出生成目标文本。一个标准的Transformer编码器由若干层堆叠而成,每层都包含两个主要部分:
- 多头自注意力机制(Multi-Head Self-Attention)
- 前馈神经网络(Feed-Forward Neural Network)
每个部分之后都有一个残差连接(Residual Connection),随后是层归一化(Layer Normalization)。下面是这些组件的详细说明:
- 多头自注意力机制
这一部分允许编码器内部的每个位置都可以关注到输入序列的其他位置。
通过这种方式,模型不仅能捕捉局部信息,还能捕捉长距离的依赖关系。
多头机制使得网络可以在不同的表示子空间中并行学习信息。 - 前馈神经网络
每个编码器层还包含一个前馈神经网络,这是一个简单的两层线性变换,中间有一个ReLU激活函数。
该网络对每个位置应用相同的变换,但对不同实例是独立的,这种设计称为“位置全连接”。 - 残差连接和层归一化
在多头注意力和前馈网络的每个部分后面,都有一个残差连接,即将输入直接添加到输出(经过一个线性变换)。
残差连接后是层归一化步骤,层归一化帮助稳定训练过程,是训练深层网络的关键技术之一。
编码器的工作流程
当输入数据(比如一句话的词向量)传入编码器时,每个编码器层都会执行以下操作:
首先,数据通过多头自注意力层,这层帮助模型在不同位置间建立直接的依赖关系。
然后,每个位置的输出通过前馈神经网络进行进一步处理。
在每个子层之后,应用残差连接,并进行层归一化。
最后一层的输出作为编码器的最终输出,这通常是一个综合了整个输入序列信息的高维表示,用于解码器或其他下游任务。
位置编码Positional encoding
在Transformer模型中,位置编码(Positional Encoding)是一个重要的组成部分,它的作用是向模型提供关于输入序列中各个单词的位置信息。由于Transformer的自注意力机制本身并不涉及序列中元素的相对或绝对位置,位置编码因此成为提供这种信息的关键方式,确保模型能够考虑到词语在句子中的顺序。每一个单词(input embedding向量都会有一个位置编码)
Transformer模型中的位置编码是通过向每个输入嵌入向量加入一个位置向量来实现的。这个位置向量有固定的模式,旨在让模型能够区分序列中不同位置的元素。位置编码的设计通常遵循以下原则:
- 唯一性:每个位置的编码应该是唯一的,以便模型可以区分不同位置的词。
- 可加性:位置编码应允许模型通过组合位置和内容的信息来学习序列的关系。
在原始的Transformer模型中,位置编码使用正弦和余弦函数的组合来生成。对于每个位置 i i i和每个维度 d d d,位置编码PE 的计算方法如下:
对于偶数索引维度(使用正弦函数)
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)
对于奇数索引维度(使用正弦函数)
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)
Transformer中的维度
-
input embedding dimension
输入嵌入维度也是模型维度( d m o d e l d_{model} dmodel)。这个维度也是一个核心维度,表示词嵌入向量的大小。每个输入词经过词嵌入层后被转换层一个 d m o d e l d_{model} dmodel维度的向量,这个维度在模型中保持一致,是各层处理的标准尺寸。另外,位置编码的维度也是 d m o d e l d_{model} dmodel, 保证位置编码和输入嵌入向量的可加性。 -
多头的维度
在多头注意力中,模型维度 d m o d e l d_model dmodel被分割成 h h h个头,每个头处理一部分信息。每个头的维度 d k d_k dk通常是 d m o d e l / h d_{model}/h dmodel/h,比如 d m o d e l d_{model} dmodel是512,设置了8个头,那么每个头的维度 d k d_k dk是 512 / 8 = 64 512/8=64 512/8=64。其对应的权重矩阵 W Q W^Q WQ, W K W^K WK 以及 W V W^V WV都是 512 × 64 512\times 64 512×64. 假设一个序列的长度是 n n n,那么输入是 n × d m o d e l n \times d_{model} n×dmodel, 每一个头的输入 n × d m o d e l n \times d_model n×dmodel, 因为 W Q W^Q WQ , W K W^K WK , W V W^V WV 的维度是 d m o d e l × d k d_{model} \times d_k dmodel×dk,所以最后的输出维度是 n × d k n \times d_k n×dk
Note: 和CNN类似,不同的单词是用同样的权重矩阵计算的.。 -
Encoder中前馈神经网络的维度
多头注意力之后,不同头的输出会被结合在一起。所以前馈神经网络的输入维度是 d k × h = d m o d e l d_k \times h = d_{model} dk×h=dmodel。 其输出为 d m o d e l d_{model} dmodel