论文地址
transfomer基本元素
- 注意力(Scaled Dot-Product Attention)
- 多头注意力(Multi-Head Attention)
- 位置编码(Position Encoding)
注意力
Attention is all you need中最能解释注意力的话
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the
query with the corresponding key.
表述了几个意思
-
注意力函数是 a query 和 a set of key-value pairs 到 an output的映射
-
key和value一一对应
-
一个query需要和一组key-value对计算
-
-
ouput是values的加权和,每个value对应的权重是由value对应的key和query计算出来的
-
o = ∑ i w i ⋅ v i o = \sum_i w_i \cdot v_i o=∑iwi⋅vi (1)
-
w i = f ( q , k i ) w_i=f(q, k_i) wi=f(q,ki) (2)
-
怎么跟论文里的公式那么不像?
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}})\cdot V Attention(Q,K,V)=softmax(dkQKT)⋅V (3)
下边分别是QKV矩阵,假设Q中有100个query(q),每个q维度为256, 假设序列长度为850, 即V有850个value(v), 每个v的维度也是256, K中是和V中的v一一对应的850个key(k), k的维度是256。每个矩阵中的黑线分别代表q,k,v向量, q和矩阵
K
T
K^T
KT做矩阵乘法得到
q
K
T
qK^T
qKT是一个1x850的向量,再套一个softmax其实就是上边公式(2) ,
s
o
f
t
m
a
x
(
q
K
T
d
k
)
softmax(\frac{qK^T}{\sqrt{d_k}})
softmax(dkqKT)中的元素就是公式(1)(2)中的
w
i
w_i
wi, 对应850个v的权重。它再和V做矩阵乘法,按分块矩阵乘法的角度看,就是每个元素
w
i
wi
wi和V的每个value做点积,就是公式(1)。 只看一个query, 论文里的attension公式是可以和(1)(2)对上的。矩阵乘法表述的时多个query的情况。
说这么多就是想帮助理解 ouput是values的加权和,每个value对应的权重是由value对应的key和query计算出来的 这句话。流程就像下面这样
多头注意力
Instead of performing a single attention function with d m o d e l d_{model} dmodel-dimensional keys, values and queries, we found it beneficial to linearly project the queries, keys and values h times with different learned linear projections to d k d_k dk, d k d_k dk and d v d_v dv
dimensions, respectively. On each of these projected versions of queries, keys and values we then perform the attention function in parallel, yielding d v d_v dv-dimensional output values. These are concatenated and once again projected, resulting in the final values.
表述了几个意思
-
qkv向量的维度不需要相等,只需要qk的维度相等即可
-
ouput向量的维度和v相等,output的序列长度和query的个数相等(这两点从矩阵乘法就可以看出)
-
把q, k, v线性投影到 d k d_k dk, d k d_k dk, d v d_v dv, 投影h个版本,每个投影版本的qkv可以并行计算注意力,共有h个输出,(multi-heads多头的意思)
-
最后需要把h个输出concat到一起再做线性投影
-
we found it beneficial …
-
Attension本身没有可学习的参数,那几个qkv的投影肯定是要加的。多个输入要融合到一起,为了多层stack, 再加一个投影把维度降下来也是必然。创新的地方是把qkv投影多个版本并行地计算注意力。它把qkv投影到h个不同的空间,分别计算注意力。
结构就是下面这样了
位置编码
在全序列上学习注意力,没有信息表达序列的间元素的位置关系,因此引入一种和位置相关的编码,用正弦余弦的好处是不管序列有多长值域都是有限的。
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos, 2i)}=sin(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos, 2i+1)}=cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)
我感觉引入位置编码是重要的,而具体采用什么样的位置编码(绝对的相对的,固定的,可学习的)的影响要小一些。