当前位置:   article > 正文

transformer - Attention is all you need

transformer - Attention is all you need

Transformer 是谷歌在论文《Attention is all you need》中提出来解决 Sequence to Sequence 问题的模型,其本质上是一个编解码(Encoder-Decoder )结构。

编码器 和解码器 由 6 个编码 block 组成。

编码器 中的每个 block 包含 Multi-Head Attention 和 FFN(Feed-Forward Network);解码器 每个 block 包含 Multi-Head Attention、Encoder-Decoder Attention 和 FFN。

0 Position Encoding

由于Transformer中没有循环以及卷积结构,为了使模型能够利用序列的顺序,作者们需要插入一些关于tokens在序列中相对或绝对位置的信息。因此,作者们提出了“Positional Encoding”(位置编码)的概念。Positional Encoding和token embedding相加,作为encoder和decoder栈的底部输入。Positional Encoding和embedding具有同样的维度 d k d_k dk,因此这两者可以直接相加。

P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i d k ) PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{k}}}}) PE(pos,2i)=sin(10000dk2ipos)

P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i d k ) PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{k}}}}) PE(pos,2i+1)=cos(10000dk2ipos)

  • pos表示token在sequence中的位置,例如第一个token就是0
  • i i i或者准确意义上是 2 i 2i 2i 2 i + 1 2i+1 2i+1表示了Positional Encoding的维度, i ∈ [ 0 , d k 2 ) i \in [0, \frac{d_k}{2}) i[0,2dk),所以当pos为1时,对应的Positional Encoding可以写成 P E ( 1 ) = [ s i n ( 1 1000 0 0 512 ) , c o s ( 1 1000 0 0 512 ) , s i n ( 1 1000 0 2 512 ) , c o s ( 1 1000 0 2 512 ) , . . . ] PE(1) = [sin(\frac{1}{10000^{\frac{0}{512}}}), cos(\frac{1}{10000^{\frac{0}{512}}}), sin(\frac{1}{10000^{\frac{2}{512}}}), cos(\frac{1}{10000^{\frac{2}{512}}}), ...] PE(1)=[sin(1000051201),cos(1000051201),sin(1000051221),cos(1000051221),...]

1 Encoder

1.1 self attention

以句子“The animal didn’t cross the street because it was too tired”为例了解self attention。self-attention可以借助词的上下文判断句子中的"it"指的是"animal" 还是"street"。联系到tired,我们可以得知是"animal"。self-attention就可以通过计算词与词之间的相关性来理解句子

假设输入2个单词 a 1 = T h i n k i n g , a 2 = M a c h i n e s a_1 = Thinking, a_2=Machines a1=Thinking,a2=Machines,,embedding后得到2个单词向量 x 1 , x 2 x_1, x2 x1,x2, 每个单词向量分别与3个weight做点积,得到每个单词对应的query, key和value。query用来和其他单词比较的,key是用来被其他单词比较的,value则是保存从单词向量中提取的信息。

假设我们正在计算本例中第一个单词“Thinking”的自注意力。步骤如下

  1. 我们需要计算这个词与输入句子的每个词的score(点积)。当我们在某个位置对单词进行编码时,score 决定了将多少注意力放在输入句子的其他部分上。因此,如果我们正在处理位置 #1 中单词的自注意力,第一个score 将是 q 1 q_1 q1 k 1 k_1 k1 的点积。第二个分数是 q 1 q_1 q1 k 2 k_2 k2 的点积。
  2. 除以 d k \sqrt{d_k} dk 后走softmax。当数据量很大即值 d k d_k dk很大时,dot-product的结果很大,导致softmax函数的梯度非常小,因此除以 d k \sqrt{d_k} dk 来缩小dot-product的结果。
  3. 将softMax score乘以value并求和。得到加权后的attention score。

矩阵求解根据输入 X X X和三个权重矩阵 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,得到Query, Key, and Value矩阵;通过矩阵运算得到attention vector。

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(dk QKT)V

1.2 multi head Attention

muilti-head指的是有多组query, key, value,对于相同的输入 X X X每组head初始化不同的 W i Q , W i K , W i V W_i^Q, W_i^K, W_i^V WiQ,WiK,WiV(相当于将 X X X映射到了多个不同的子空间进行运算), 然后做self-attention计算,最后把多组的结果concat起来表示attention score

m u l t i h e a d ( Q , K , V ) = c o n c a t ( a t t e n t i o n ( Q i , K i , V i ) ∣ i = 1 , . . . , h ) W O multihead(Q,K,V) = concat(attention(Q_i,K_i,V_i) | i = 1, ..., h) W^O multihead(Q,K,V)=concat(attention(Qi,Ki,Vi)i=1,...,h)WO

1.3 Feed-forward Network & Residual Network

每个编码器中的每个子层(self-attention,ffn)周围都有一个残差连接,然后是层归一化步骤。

F F N ( x ) = L a y e r N o r m ( x + D r o p o u t ( r e l u ( x W 1 + b 1 ) W 2 + b 2 ) ) FFN(x) = LayerNorm(x + Dropout(relu(xW_1 + b_1)W_2+ b_2)) FFNx)=LayerNorm(x+Dropout(relu(xW1+b1)W2+b2))

2 Decoder

在每个layer里面,除了和encoder一样有两个sublayer, 还加上了一层masked multi-head self-attention layer。因为decoder的时候,是一个单词接着一个单词的预测,对于排在位置i后面的单词没法进行attention,所以要把排在位置i后面的位置都是mask掉。具体实现的时候,mask的位置用-inf表示。

3 The Final Linear and Softmax Layer

这一层主要是将decoder输出的向量转换成单词。首先,把decoder输出的向量通过线性转换,扩展到一个更大的向量, 叫做logit vector。假设训练数据中有10000个不重复的单词,那么logit vector就是10000维, 表示每个单词预测为序列中下一个单词的分数,通过softmax函数得到每个单词预测的概率,概率最大的单词作为预测结果输出。


欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/393996
推荐阅读
相关标签
  

闽ICP备14008679号