跟风,听说最近Transformer很热,那肯定有其过人之处,今天大概看了一下最基础版的Transformer,简单说说体会和理解吧,不一定对,希望路过的大神指点。

要说是革命性的变革,那显然不是,Transformer和CNN以及RNN等都是机器学习的范畴,要说一点没变,那也不是,Transformer最大的特点,个人理解,是其Self-Attention机制,至于说这个机制是从哪儿得到的启发,暂不多说,搞过CNN的都知道。搞CNN的都习惯一个图片矩阵,那接下来的见解,我就以二维矩阵来说。

cnn和transformer结合模型 cnn和transformer区别_Self

还是原文的图,这里的X是将每一个单词embed到N维的空间中,每一个词对应一个行向量,将一个句子的每一个单词都映射过来,组成一个大小固定的矩阵。对于不同单词数的句子,使用padding的方式扩充。那矩阵到底有多少行?没错,就是你猜的那样,数据库中每个句子的最大单词数。英语老师天天说结合语境,结合语境,那其实就是上下文的关系,这就是Self-Attention的核心思想。具体到数学表达上,这个关系的强弱,就是相关性,那就来劲儿了,协方差矩阵!没错,就是这货,但是原文不是这么描述的,这是本人看完后的第一印象,本篇文章会一直沿用这个词,但是文中并不是标准的协方差,暂且称其为“伪协方差”吧。这里如果对每个单词的embedding编码直接相关,那没意义啊,我们还没有理解这个编码,因此,在Self-Attention的第一步就是做一个矩阵映射,这一组矩阵就是Self-Attention中要训练的矩阵:

cnn和transformer结合模型 cnn和transformer区别_Self_02

至于为啥是Multihead  self-attention,原文是说将编码投影到多个子空间中,个人理解这里应该是为了增加几组独立权重,增加参数量,以提升表达能力,跟Inception的感觉有点类似,但是没有Inception多尺度的理解那么直观。经过这一组投影后,得到一组编码:

cnn和transformer结合模型 cnn和transformer区别_人工智能_03

这些编码,每一行的维度都固定为64。多头自注意力的头数h,取8。这是论文中为了对比单头注意力和多头注意力,保证多头的总维度依旧是512。作者认为,多头注意力使得模型有能力学习到不同子空间的表示。而单头注意力,相当于将所有这些不同子空间取平均了,因而抑制了这一能力。这三组矩阵的名称分别是query/key/value-matrix。

看到现在,这self-attention到底是个啥?关键点来了。我们刚才已经说了,上下文的关系不是词编码直接相关,而是需要映射,这个映射矩阵十分关键,关系到整个编码器的性能,因此,经过投影后的

cnn和transformer结合模型 cnn和transformer区别_人工智能_03

,就是词编码后经过语义理解的编码,可以进行相关了,论文是让Q和K负责产生权重,V就老老实实代表编码值,经过投影后,Q和K的每一行都是一个单词的投影向量,那就直接把Q和K^T相乘,得到伪协方差矩阵,这里并不是标准的协方差,因为没有去均值,但是意思都差不多,就是两个向量的点积。这个伪协方差矩阵充当的作用就是权重,权重大的会被注意到,也即是self-attention。然后除以维度的平方根,这里的维度是映射后的编码维度,是512/8=64,那么开平方后是8。然后再来个softmax,这里的softmax是针对伪协方差矩阵的每一行进行的,保证每一行的值和为1。softmax后的伪协方差矩阵与V矩阵点积就得到对应组的输出Zi。Zi的行数还是最大单词数,列数是512/8,将8组Zi拼接即可得到与单头self-attention相同维数的编码矩阵。也就是说,下面这个公式是self-attention的核心:

cnn和transformer结合模型 cnn和transformer区别_协方差矩阵_05

最后将这些scaled的值通过Wo映射回去,与X的形状一致,也就是下一次self-attention的输入。

cnn和transformer结合模型 cnn和transformer区别_权重_06

Transformer的下一步就是前馈网络,熟悉的全连接,全连接层的输入输出都是512,中间层是2048:

cnn和transformer结合模型 cnn和transformer区别_协方差矩阵_07

这个全连接层在每一层的不同时间步是共享的,但是在不同层是独立的。我是理解是,所有单词都共享这两个全连接层的参数?

然后就是残差网络,输入和该层输出相加后layer normalization:

cnn和transformer结合模型 cnn和transformer区别_人工智能_08

因为模型不包含循环或卷积,因此需要加入时间序列信息,原文是在编解码器的embedding层后加入的,

cnn和transformer结合模型 cnn和transformer区别_Self_09

 

解码器中有个因果关系的控制,这里就不多说了。

损失函数是交叉熵,优化方法是Adam。

总结一下,个人理解的Transformer和CNN的区别:

1、Transformer还是机器学习,但是没有卷积、pooling等操作,也没有循环;

2、很好的利用了每一行数据之间的相关性,机制的解释性是比较强的,更适用于NLP;

3、CNN关注于二维局部数据之间的相互关联,随着层的加深,关注区域会更广,更适用于图像处理。

不过,最近听说Transformer在很多图像处理领域中屠杀CNN,所以先看看Transformer的基础。最大是体会就是,Transformer中引入了基于伪协方差的Self-attention!