transformer架构介绍
首先把transformer当成一个黑盒子,输入是一个序列,输出是另外一个序列,如下图:
transformer由两部分组成,一个是encoders,另外一个是decoders,两者是相连的。
encoders包含了多个encoder,同样dicoders也包含了多个decoder。
encoders之间不共享权重,每个encoder又包含了两层:
第一层是self-attention层,这一层可以让词语观察整个句子的其他词语
第二层是feed-forward neural network
而decoder不仅在encoder基础上,在self-attention和feed forward之间又加了一层encoder-decoder Attention。就是在seq2seq文章中讲的。该成可以帮助decoder来观测输入的相关单词。
首先使用embedding将词语向量化。
每个词向量开始进入encoder,每个词语可以并行计算。
self-attention细节
第一步是对每一个单词计算Query向量,Key向量和Value向量。这三个向量是通过三个权重矩阵和embedding向量相乘得来的。
得出的新向量(Query,Key,Value)是比embedding向量要小的。
第二步是计算该单词和句子中其他单词的分数。这个分数的意义就是要放多少注意力在这个单词上。
通过query向量和key向量点乘获得。
比如
q
1
∗
k
1
q_1 * k_1
q1∗k1,
q
2
∗
k
2
q_2 * k_2
q2∗k2
第三步是将分数除以8,8是key向量维度64的平方根
第四步是将所有分数进行softmax,最后softmax得分决定要分多少注意力在该位置上
第五步是将softmax分数和value向量相乘,作用是专注需要专注的词,而丢弃不需要专注的词
第六步是将所有的value向量相加,作为slef-attention的输出。
从单词角度来看整个self-attention过程
第一步,首先计算Query,Key,Value。下图中X是embedding,每一行代表一个单词
然后和权重矩阵(WQ、WK、WV)相乘
最后我们来计算QKV三个矩阵得到Z
multi-headed attention
multi-header有两个优点:
1.可以让模型关注不同位置
2.可以让模型关注不同空间(比如语法,情感,语义等)
但
Multi-Head其实不是必须的,去掉一些头效果依然有不错的效果(而且效果下降可能是因为参数量下降),这是因为在头足够的情况下,这些头已经能够有关注位置信息、关注语法信息、关注罕见词的能力了,再多一些头,无非是一种enhance或noise而已。
https://www.zhihu.com/question/341222779
分多组进行QKV运算
可以得到多组Z
将多组Z合并,和W0矩阵相乘的到最终的Z
总结起来就是这样:
Positional Encoding
transformer给每个embedding添加了position向量,可以用来指示单词的位置,和单词之间的距离。
如果我们假设embedding有4维度,则真实的信息如下图:
Residuals
在每个encoder中self-attention和feed forward之间使用Residuals层连接,而且每个Residuals都跟了Layer-normalization。
更详细的如下图:
在decoder也是一样的
Decoder
Final Linear and Softmax Layer
参考:
http://jalammar.github.io/illustrated-transformer/