最近transformer在cv领域崭露头角,分类效果直追CNN。也趁机来补习一波在NLP领域已经火了很久的transformer。本文是在看过李宏毅老师的教程之后的理解,意在用最简单的表述讲解transformer。
为什么用transformer
在seq2seq模型中,最常用的是RNN,但是RNN无法并行计算;而CNN虽然可以并行,但需要多层堆积才可以对全局进行感知(类似于感受野)。因此两个模型的效率都不是太高。所以我们想要用一个模型来取代之,此时Google一篇论文《Attention is all you need》应运而生,即transformer。
Attention机制
transformer里面最重要的一环就是self-attention。attention机制中有一个三元组(q,k,v),q表示query,用于match其他的key;k表示key,用于被query来match;v表示value,表示相应的key的取值。在上图中,输入x是若干个词嵌入,首先经过一个线性变换到a,随后通过三个分支分别得到(q,k,v)这个三元组向量。
随后利用三元组就可以计算attention的输出,首先将q和k进行点积(表示用q去matchk,计算两者之间的相似度);随后将该矩阵放缩除以维度d的平方根,在做softmax;最后将上述结果与value相乘,得到与输入相同维度的输出,整个公式如下图所示:
Multi-head self-attention
多头注意力机制可以拓展模型专注于不同位置的能力,其示意图如下:
可以看出multi-head就是在原始的三元组上拓展出若干个三元组,给出了注意力层的多个表示子空间。
Position Encoding
上述方法并没有涉及到句子的序列问题,因此各个位置的词嵌入是等价的。所以需要引入位置编码,这一部分没有做太多研究,李宏毅老师课件上的图是这样的:
transformer模型总览
这张图是最经典的,首先看Encoder部分,若干个词向量的嵌入作为输入,经过一个multi-head的注意力模块,将结果与原始输入相加(类似于resnet的残差),再做layer-norm(与BN相对,BN是将不同样本对应的相同维度做标准化,而layer-norm是对同一样本各个维度做标准化),随后再经过一个Feed-forward网络(全连接层),再经过add和norm得到encoder的输出。
对于Decoder,其输入不仅有encoder的输出,还包括某一个词前面的各个输出,对应masked multi-head attention。其他结构与encoder一致。
最后贴一篇个人认为非常棒的博客:https://www.cnblogs.com/robert-dlut/p/8638283.html