文章目录
1.为什么要有Transformer
任何一个新事物的出现都来源于对于传统方法的批判和新技术基础的出现。
1.1 传统RNN-Based Model的缺点
以NLP任务为背景,来分析一下传统RNN-Based Model的缺点。
(1)不支持并行,效率低
我们都知道RNN模型是从序列的一边看到另一边,并且用隐藏层记录之前看过序列的信息“记忆”,这样的方法要求每一个序列信息处理的时候都必须看完之前的序列信息,这也就造成了模型无法并行计算,效率低下。
(2) 记忆能力有限
RNN的隐藏层向量维度有限,当阅读的序列长度较大时,后续的节点很难保证对之前节点的记忆保持完整,这样会造成模型处理任务的性能下降。
1.2 Attention方法的出现
Attention原理分析可以参考我上一篇blog《Attention的基本原理与模型结构》
可以发现,Attention方法可以并行的计算节点和对于之前序列的关联度,也可以通过只关注几个关联度高的节点很好的解决RNN Model记忆力不足的问题。
2.Transformer的原理与结构
2.1Transformer的Attention——Self-Attention
self-Attention是Transformer的核心机制,他使得模型既能够进行并行计算,又可以防止RNN记忆不足的问题。
self-Attention过程先通过一层全连接提取原始向量的特征,然后通过:
Q
=
W
q
a
K
=
W
k
a
V
=
W
v
a
\begin{aligned} Q &= W^qa\\ K &= W^ka\\ V &= W^va \end{aligned}
QKV=Wqa=Wka=Wva
其中,Q类似搜索引擎中的搜索词,代表用该位置的单词“搜索”其他单词的抽象特征;K类似搜索引擎中的词条关键词,代表该单词自身的抽象特征;V代表该单词自身的值特征。
通过每个词用q去搜索其他词的k可以得到词之间的Attention关联度:
α
i
,
j
=
q
i
k
j
d
\alpha_{i,j} = \frac{q^ik^j}{\sqrt{d}}
αi,j=dqikj
d是q,k的维度,用来平衡结果,使方差降低。
而后通过Softmax归一化Attention值:
α
^
i
,
j
=
e
α
i
,
j
∑
k
e
α
i
,
k
\hat{\alpha}_{i,j} = \frac{e^{\alpha_{i,j}}}{\sum_ke^{\alpha_{i,k}}}
α^i,j=∑keαi,keαi,j
从句子的角度来看,这里其实是句子中自己的词和词在做Attention,因而叫self-Attention。
句子的输出特征为:
b
i
=
∑
j
α
^
i
,
j
V
i
b_{i} = \sum_j\hat{\alpha}_{i,j}V^i
bi=j∑α^i,jVi
可以发现,我们的每一步都可以改写成矩阵乘法,也就意味着可以支持GPU加速并行计算:
2.2Positional Encoding
从Attention机制我们可以看出来,每一个单词的输出仿佛只与句子有哪些单词有关系,和位置无关,这不是我们想要的。
e.g. 我打了他 vs 他打了我
这是同样四个字的排列组合,意思显然相反,但如果用self-Attention处理后每一个字向量的输出应该都是一样的。因此,我们需要在原始特征上加一个位置向量,表达词的位置信息。
其中,PE为二维矩阵,大小跟输入embedding的维度一样,行表示词语,列表示词向量;pos 表示词语在句子中的位置;
d
m
o
d
e
l
d_{model}
dmodel 表示词向量的维度;i表示词向量的位置。因此,上述公式表示在每个词语的词向量的偶数位置添加sin变量,奇数位置添加cos变量,以此来填满整个PE矩阵,然后加到input embedding中去,这样便完成位置编码的引入了。
2.3 Multi-head
Multi-head我在学习的时候一直挺迷惑,因为多头的方法本质上就是做多组一样的self-Attention,最后将结果拼接起来通过全连接层学习。感觉每一个头应该学到一样的东西,查阅论文《A Multiscale Visualization of Attention in the Transformer Model》发现,大部分头学到东西是一样的,而少数会有不同。分析认为应该是参数初始化的随机性导致的。因此Multi-head实际上是一种类似Dropout的机制,降低参数随机初始化带来的不稳定性。