Transformer 模型详解
这篇对transformer的self attention子层的机制有详细的图文并茂的解释,并且附上了作者对关键概念的诠释,非常启发性。但是整体和其他方面一笔带过。
Transformer模型详解(图解最完整版)
这篇梳理了transformer的整体过程,但是没有更多自己的理解。
自己的一些理解笔记,门外汉,如有错误请指正:
1.线性变换层
self attention里提到的线性变换层,和全连接层有点像。但是全连接层是把分布式特征representation映射到样本标记空间,也就是说,把feature map 整合成一个值,因此空间结构特性被忽略了。
而本文里的线性变换层只是对输入矩阵做行方向上的线性相关运算,因此只损失了一个维度上的空间相关性(本文的context是NLP,矩阵一行代表一个单词,一列是一句话里的多个单词,因此不会贸然弄乱掉单词间的独立性)。
线性变换的实质就是一个一维方向上的卷积,但没有bias和激活函数。
2.注意力计算机制
例如假设[0,0,1]表示am,[0,1,0]表示student,在注意力权重计算得[0,0.2,0.8],相当于两个单词进行了某种融合。
①矩阵相乘X*Y=Z,X的宽度和Y的高度相同。把v矩阵看做元素为行向量(单词特征向量)的列向量,则z矩阵是v矩阵行向量(单词特征向量)的线性组合,也就是说z是v对单词向量之间进行某种相加和数乘的结果。因此z的宽度代表了特征向量的维度,这在线性变换中是不会改变的,必须和v相同。这里额外说一个线性代数的心得:分析矩阵相乘时,要回到线性代数,看成一个矩阵和一个向量相乘,也就是对该向量进行线性组合。例如本例中的v,可以把v看成单独的列向量。分别与注意力矩阵相乘后,再拼接起来,比较好理解。
②矩阵(上图左)并不是对角阵,因此说明注意力是有方向的。也就是说在某句话中,student对am的注意力,和am对student的注意力,二者并不相同。
③左乘这样的操作,相当于是按注意力作为权重将各个单词相加。Z虽然不再是输入的单词特征向量矩阵,但单个单词特征向量内部之间没有进行加操作,因此单词特征的独立性得到了一定程度的保留。设想如果是右乘一个3X3的矩阵,则破坏了单词特征内部的构造。
但是,在如下图所示的计算Q,K,V阶段,是使用的右乘,也就是在单词向量内部进行破坏和重组,这又是为什么呢?
这是因为目的不同,在计算Q,K,V阶段,从512维线性变换成了64维,相当于对单词向量进行了降维,提取了某种特征。这和CV里不一样,CV提特征是从低维度提到高维度,而NLP里,一个单词向量(简略来说)代表了它在词典里的位置,例如最基本的one-hot标注方式,因此特征提取反而是融合掉不必要的多余的维度。而在这里,右乘刚好起到这个作用。
3.输入输出整理
首先讨论训练时的情况,输入为英文“I am a students”,输出为其中文翻译,“我是一个学生”。其中decoder第一层会用到masked 多头注意力层。这里的mask在阅读博客时受误导,觉得因为在测试时(也就是inference时)是同声传译,说一个英文词,翻译一个中文词,要有时间先后,因此使用mask屏蔽掉后来的单词,避免在训练时引入了不该知道的信息。后面才知道自己理解错误,这里和时间无关,输入数据都是同时输入的,只不过输出时多次迭代机制,每次输出只有一个翻译词,并将该词加入已完成的句子参与迭代,也就是每次向右边挪一位,一个词一个词地完成句子(上面所说的shifted right)。具体见下图(动图):
(动图见The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.)
原因猜测:
①按照本文的网络结构,如果不是一个词一个词的翻译,那么输出的结果应该是世界上所有词组成的句子的概率分布。而句子没有长度限制,可以是无限长,所以网络无法处理。而本文的方法每次处理的是世界上所有的词的概率分布,是一个虽然大、但是有限的集。如下图:
4.对整个算法的理解
在encoder阶段,相当于训练一个高抽象的词典,关键的三个矩阵Q、K、V中,词典key对应低抽象层级的输入,value是该key在高抽象层级的对应。Q和V形成了注意力机制,也保证了语义在不同单词向量中间的流动,同时还引入了一定的交互机制。
在decoder阶段,先进行一定程度的抽象(第一层),再将抽象出来的Q用来对encoder中的KV字典进行查询,可以说模拟了一个“不同语言都可以查询的高度抽象的语义字典”的使用逻辑。