Transformer的基本原理

1.transforemr整体结构

比如在机器翻译中需要将法语翻译为英语

transformer调用gpu原理_全连接


探究transformer的内部,可以分为encoder和decoder两部分

transformer调用gpu原理_transformer调用gpu原理_02


再展开一点,Encoder由很多(6个)结构一样的Encoder堆叠(stack)而成,Decoder也是一样。如下图所示。注意:每一个Encoder的输入是下一层Encoder输出,最底层Encoder的输入是原始的输入(法语句子);Decoder也是类似,但是最后一层Encoder的输出会输入给每一个Decoder层,这是Attention机制的要求。

transformer调用gpu原理_transformer调用gpu原理_03


每一层encoder都是相同的结构,都是由一个self-attention和一个前馈网络(全连接层)组成,如下图所示:

transformer调用gpu原理_transformer调用gpu原理_04


每一层的decoder也是相同的结构,除了self-attention层和全连接层之外外多了一个普通的attention层,这个attention层使得decoder在解码时会考虑最后一层Encoder所有时刻的输出。它的结构如下图所示。

transformer调用gpu原理_点乘_05

2.self-attention理解

基本结构如下:

transformer调用gpu原理_点乘_06


关键在于Q,K和V三个矩阵。这三个矩阵分别代表什么意思?

以机器翻译为例子,现在要让机器理解:

The animal didn't cross the streent because it was too tired.

这句话里面"it"的含义,代表的是street还是animal。那么,Q表示为了编码当前词"it",需要去attend的其他词,包括它自己本身,这些词表征为Q这个查询向量。K表示的是,当前Q里面需要被关注的这些词,需要被检索的关键,表征为K这个关键向量。我们就是通过Q和K这两个矩阵去生成当前词与其他词的attention score。而V代表的就是输入的这句话。这句话后面的每一个词需要去乘以Q和K生成的概率,得到最后"it"这个词的表征。

举一个例子:

翻译“I am chinese”

source : I am Chinese

target: 我是中国人

比如翻译目标单词为 I 的时候,Q为I

而source中的 “我” “是” “中国人”都是K,

那么Q就要与每一个source中的K进行对齐(相似度计算);"I"与"我"的相似度,"I"与"是"的相似度;"I"与"中国人"的相似度;

相似度的值进行归一化后会生成对齐概率值(“I"与source中每个单词的相似度(和为1)),也可以注意力值;

而V代表每个source中输出的context vector;如果为RNN模型的话就是对应的状态向量;即key与value相同;

然后相应的V与相应的概率值进行加权求和,就得到了context vetor;

transformer调用gpu原理_transformer调用gpu原理_07


再举个例子:

翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用transformer调用gpu原理_全连接_08表示,Machines的embedding vector用transformer调用gpu原理_相似度_09表示。

transformer调用gpu原理_点乘_10


当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配,看看相关度有多高。我们用 transformer调用gpu原理_transformer调用gpu原理_11代表Thinking对应的query vector, transformer调用gpu原理_点乘_12transformer调用gpu原理_相似度_13 分别代表Thinking以及Machines对应的key vector,则计算Thinking的attention score的时候我们需要计算 transformer调用gpu原理_transformer调用gpu原理_11transformer调用gpu原理_相似度_15 的点乘,同理,我们计算Machines的attention score的时候需要计算 transformer调用gpu原理_transformer调用gpu原理_11transformer调用gpu原理_相似度_15 的点乘。如上图中所示我们分别得到了 transformer调用gpu原理_transformer调用gpu原理_11transformer调用gpu原理_相似度_15 的点乘积,然后我们进行尺度缩放与softmax归一化,如下图所示:

transformer调用gpu原理_点乘_20


显然,当前单词与其自身的attention score一般最大,其他单词根据与当前单词重要程度有相应的score。然后我们在用这些attention score与value vector相乘,得到加权的向量。

transformer调用gpu原理_全连接_21


如果将输入的所有向量合并为矩阵形式,则所有query, key, value向量也可以合并为矩阵形式表示

transformer调用gpu原理_相似度_22


其中 transformer调用gpu原理_点乘_23是我们模型训练过程学习到的合适的参数。上述操作即可简化为矩阵形式

transformer调用gpu原理_点乘_24

3. multi-Head Attention

这篇论文还提出了Multi-Head Attention的概念。其实很简单,前面定义的一组Q、K和V可以让一个词attend to相关的词,我们可以定义多组Q、K和V,它们分别可以关注不同的上下文。计算Q、K和V的过程还是一样,这不过现在变换矩阵从一组transformer调用gpu原理_点乘_25变成了多组transformer调用gpu原理_全连接_26transformer调用gpu原理_transformer调用gpu原理_27,…。如下图所示:

transformer调用gpu原理_点乘_28


对于输入矩阵(time_step, num_input),每一组Q、K和V都可以得到一个输出矩阵Z(time_step, num_features)。如下图所示。

transformer调用gpu原理_transformer调用gpu原理_29


但是后面的全连接网络需要的输入是一个矩阵而不是多个矩阵,因此我们可以把多个head输出的Z按照第二个维度拼接起来,但是这样的特征有一些多,因此Transformer又用了一个线性变换(矩阵transformer调用gpu原理_全连接_30)对它进行了压缩。这个过程如下图所示。

transformer调用gpu原理_点乘_31


完整过程:

transformer调用gpu原理_transformer调用gpu原理_32