transformer存在一个特点,能够将任意类型的输入建模为拓扑几何空间的全连接图。但CNN要求输入是对齐的网格空间或者矩阵。所以transformer相比于其他深度学习方法,更适合于多模态学习。
1.vanilla transformer
每个transformer layer包括一个multi-head-self-attention(MHSA)模块,以及一个在位置上全连接的feed forward layer(FFN)。并且在两个层中都使用了残差结构,即假设输入为Z,则输出满足如下公式:。 其中N为归一化,如batch normalization。
该处正则化和求和的顺序值得商讨,因为按照代数的Gram–Schmid process,应该是先正则后投影。
1)Input tokenization
(1)tokenization :
tokenize后,每个tokenize sequence是输出图的一个结点。
tokenization存在以下几个优点:1)不同模态都能完成 2)能兼容不同类型的问题,如分类、Maeked language learning 3)容易将其他信息编码进去 4)只需通过拼接、求和等操作就能编辑多种模态。
(2)position embedding
将额外的信息提供给transformer, 让它可以学习或编码到潜在的结构。比如提供作画线条时笔的状态。如果position embedding信息缺少,则不同位置的词语或结点的注意力可能相同。
2)self attention and multi-head self-attention
(1) self attention
a.直观理解:
相当于一个数据库软查询表。原有的数据库是根据query输出对应一个key的value,但self attention综合了所有key的value输出一个值。
对于self-attention,权重来源于序列元素。而cross-attention,权重来源于encoder处理输入sequence构造的数据库。
b.从构造encoding的角度理解
final encoding zi为.其中包含三个encoding,
为query encoding,
为key encoding,
为value encoding。
(a)为什么需要key encoding和value encoding
transformer的理念是为每一个元素xi构造value encoding ,然后value encoding的加权平均得到元素i的encoding zi
。因此
值应该和元素i相关,我们希望当元素i和元素j的相关性大时,
值大,意味着元素i应该注意元素j。
但是如果将直接构造为
,则意味着以
查询
的重要性与
查询
的重要性相同。所以我们将x1 encode为query qi,xj encode为key kj(相乘顺序:假设Q,K以行储存一个query,key。encoding的目的是为一个query综合多个key,所以矩阵相乘规则决定了是QK,而非KQ。)
(b)softmax
为了引入非线性、并确保weights非负,引入softmax函数。(但是也有文章把softmax修改为线性operator:cosFormer: Rethinking Softmax In Attention | OpenReview)
(c)scaling
为什么scaling:考虑到当softmax输入方差比较大时,输出值容易陷入接近0,接近1的极值。所以将QK的方差从归一化为1.
scaling 为什么为:由于Q,K矩阵独立,根据独立变量方差计算公式
矩阵左上的元素为:
(d)我们应该直接学习
还是分开学习两个矩阵?
如果直接学习,则矩阵维度为D*D,但分开学习Q,K为D*d且d远远小于D。
(2)multi-head self-attention
主要作用是能够同时使用不同子空间表示下的QKV.
为了不由于增加额外的head,增加模型的复杂度,所以每个head的维度为原有维度/h
(3) cross-attention
3)Feed forward network
网络中包含线性层和非线性层,为非线性函数,如RELU。则一个两层的FFN可被表示如下