1. encoder
1.1 词嵌入
除了在最底层的编码器的输入来自词嵌入的词向量,其余的解码器的输入则来自下一层解码器的输出。
对于每个编码器,接收的是一个向量列表。比如词向量维512维,一句话有30个词,输入便是(30*512)
1.2 self-attention 自注意力层
每个单词的输入路径不同。
512维词向量,10个词,经过三个权重层 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV,每个词分别生成query vector, key vector, value vector, 这三个vectors将用于计算句子的其他词对某一个词的自注意力得分。
比如计算word2对word1的自注意力得分: s o f t m a x ( q 1 ∗ k 2 d q 1 ) ∗ v 2 softmax(\frac{q1*k2}{\sqrt{d^{q1}}})*v2 softmax(dq1q1∗k2)∗v2
将所有注意力得分对加权值向量求和,便得到word1在自注意力层的输入向量
深入一些:
- 为什么要softmax?
实际上softmax后的是注意力权重,与value vector相乘才会得到最后的注意力得分 - 为什么要除以
d
k
\sqrt{d_k}
dk?
那为什么是 d k \sqrt{d_k} dk而不是其他数?
因为QKV均服从标准正态分布N(0,1),它们的点积结果很大,且服从N(0, d k \sqrt{d_k} dk)。很大的点乘结果会导致落在softmax梯度很小的区域,除以 d k \sqrt{d_k} dk可以使得结果重回标准正态分布N(0,1)且使梯度增大。
1.3 multi-headed” attention 多头注意力
每个encoder有多个独立的头,每个头都有自己的 W Q , W K , W V W_Q,W_K,W_V WQ,WK,WV,生成不同的query vector, key vector, value vactor,可以给出注意力层的多个“表示子空间”
它扩展了模型专注于不同位置的能力。
假设一个头的输出是(10*64), 有8个头,最后的便是八个头的输出拼接(10*512),在经过全连接层,重新生成(10*64)的输出,它融合了所有头的注意力头信息
深入一些:
1.4 位置编码
设token的索引为pos,他的位置编码为
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(\frac{pos}{10000^{\frac{2i}{d^{model}}}}) PE(pos,2i)=sin(10000dmodel2ipos)
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(\frac{pos}{10000^{\frac{2i}{d^{model}}}}) PE(pos,2i+1)=cos(10000dmodel2ipos)
设 d m o d e l = 512 d^{model}=512 dmodel=512,则 i = 0 , 1 , 2 , . . . , 255 i=0,1,2,...,255 i=0,1,2,...,255
Why do so?
s i n ( a + b ) = sin a cos b + sin b cos a sin(a+b) = \sin a \cos b + \sin b \cos a sin(a+b)=sinacosb+sinbcosa
c o s ( a + b ) = cos a cos b − sin a sin b cos(a+b) = \cos a \cos b - \sin a \sin b cos(a+b)=cosacosb−sinasinb
这样的话便有
P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) ∗ P E ( k , 2 i + 1 ) + P E ( p o s , 2 i + 1 ) ∗ P E ( k , 2 i ) PE(pos+k,2i) = PE(pos,2i)*PE(k,2i+1) + PE(pos,2i+1)*PE(k,2i) PE(pos+k,2i)=PE(pos,2i)∗PE(k,2i+1)+PE(pos,2i+1)∗PE(k,2i)
P E ( p o s + k , 2 i + 1 ) = P E ( p o s , 2 i + 1 ) ∗ P E ( k , 2 i + 1 ) − P E ( p o s , 2 i ) ∗ P E ( k , 2 i ) PE(pos+k,2i+1) = PE(pos,2i+1)*PE(k,2i+1) - PE(pos,2i)*PE(k,2i) PE(pos+k,2i+1)=PE(pos,2i+1)∗PE(k,2i+1)−PE(pos,2i)∗PE(k,2i)
**当求P E ( p o s + k , 2 i ) PE(pos+k,2i)*P**E*(*p**o**s*+*k*,2*i*)的向量时,可表示为对P E ( p o s , 2 i ) PE(pos,2i)*P**E*(*p*o*s*,2*i*)上的线性表示,
1.5 残差模块和层归一化
decoder
顶端编码器encoder最终输出一个包含key vector和value vector的注意力向量集,用于decoder的(编码器-解码器注意力层),帮助解码器关注输入序列的哪些部分。
解码器中的自注意力机制只关注当前输出之前的值
解码器最后输出一个实数向量,经过linear和softmax层,最终输出每个词的概率。