Transformer详解

细抠Transformer

基础:Attention model

attention model是从输入句<X1,X2,X3…Xm>中产生h1…hm的hidden state,通过attention score α 乘上input 的序列加权求和得到Context vector c_{i},有了context vector和hidden state vector,便可计算目标句<y1…yn>。
输入句中的每个文字是由一系列成对的 <Key, Value>所构成,而目标中的每个文字是Query,那麼就可以用Key(文字), Value(word embedding), Query(目标文字)去重新解释如何计算context vector,透过计算Query和各个Key的相似性,得到每个Key对应Value的权重系数(attention score),再对Value进行加权求和,得到最后的Attention/Context vector。

在这里插入图片描述

上图(左)中Query和各个Key的相似性是score e_{ij}= Similarity(Query, Key_{i}),计算方法是内积,我们通过softmax算出Softmax(sim_{i})=a_{i}得到attention score a_{i},然后透过attention score a_{i}乘上Value_{i}的序列和加总所得 = Attention(Query, Source)。
在这里插入图片描述

A High-Level Look

首先把模型看做一个黑箱子:
在机器翻译任务中,就是输入一个语言的一句话,输出另一语言对应的翻译。
在这里插入图片描述
把黑箱子打开看:
我们可以看到一个编码组件、一个解码组件,和它俩之间的链接。
在这里插入图片描述
编码组件就是一堆编码器的堆叠(论文中用了6个),同样解码组件就是6个解码器堆叠在一起。
在这里插入图片描述

编码器之间参数不共享,每个编码器可分解为两层:
输入数据首先流向一个自注意力层-这一层的作用是通过句子中的其他单词,针对某个特定的词进行编码,自注意力层的输出流入一个前馈的神经网络,所以这样每一个编码器都重点关注输入的句子中的某个词。

在这里插入图片描述

一个decoder是在自注意力层和前馈网络层中间再加一个attention layer
在这里插入图片描述

模型如何运作?

首先我们把输入的单词转为词向量。
Each word is embedded into a vector of size 512. We'll represent those vectors with these simple boxes.
编码之后的词向量再分别的流向encoder里面的两层网络。
在这里插入图片描述

Self-Attention详解

我们输入一句话:”The animal didn’t cross the street because it was too tired”。
“it”是指什么?动物?街道?自注意力机制的作用就是把“it”和“animal”联系起来;
当模型处理每个词的时候,自注意力机制将句子中的其他词作为线索,针对某个特定的词进行更好的编码,所以自注意力机制其实就是通过句子中的其他单词去理解某一个单词的方法。
在这里插入图片描述

如何计算encoder self attention?

  1. 第一步是创造三个encoder的输入向量Q,K,V,举例来说,“Are you very big?”中的每一个字的隐向量都有各自的Q,K,V,是通过词向量乘一个初始化矩阵得到,论文中是512维。Q,K,V的维数都比词向量要小,论文中是64维。
    在这里插入图片描述

  2. 第二步通过内积计算score <q_{t}, k_{s}>(相似得分),假设我们在计算第一个字”Are”的self-attention,我们可能会将输入句中的每个文字”Are”, ”you”, ‘very’, ‘big’分别和”Are”去做比较,这个分数决定了我们在encode某个特定位置的文字时,应该给予多少注意力(attention)。所以当我们在计算#位置1的self-attention,第一个分数是q1、k1的内积 (“Are vs Are”),第二个分数则是q1、k2 (“Are vs you”),以此类推。
    在这里插入图片描述

  3. 第三步是将算出的分数除以根号d_{k},论文中是64,目的是避免内积过大时,softmax產出的结果非0即1。然后第四步就是通过softmax得出attention score,表示在这个位置上我们应该放多少注意力。
    在这里插入图片描述

  4. 第五步是用value vector乘以上面算出的softmax注意力得分,目的是保留我们集中注意力的单词的value,同时稀释那些不相关的词的value。

  5. 第六步就是把上一步加权的value加总,得到自注意力层的输出值z。
    在这里插入图片描述

在实际操作中,是直接将每个文字同时处理,因此会变成一个矩阵,而非单一词向量,计算后的结果attention vector也会变成attention matrix Z:
6. 计算Query, Key, and Value 矩阵:把通过训练得到的权重矩阵(WQ, WK, WV)和词向量X相乘
在这里插入图片描述

  1. 使用矩阵乘法,我们就能把前面计算self-attention的六步合并成一步:
    在这里插入图片描述

muti-headed attention

论文在自注意力机制的基础上又加了一个多头注意力机制,这个机制从两个方面增强了注意力层的表现:

  1. 增加了模型将注意力集中在多个不同位置的能力
  2. muti-headed attention可以使我们拥有多组的 Query/Key/Value 权重矩阵(论文中是8组)。每一组都随机初始化经过训练之后,能够将输入的词向量转化为具有不同代表意义的子空间(different representation subspace)
    在这里插入图片描述

通过将词向量与8个不同的权重矩阵相乘,我们得到的事8个不同的Z矩阵
在这里插入图片描述
然而前馈层只处理一个矩阵而不是8个,所以我们要把8个压缩成1个,方法就是再创造一个权重矩阵WO:
在这里插入图片描述
所以multi-headed attention整个流程串起来就是:
在这里插入图片描述

那么不同的attention head的注意力都集中在什么地方呢? 我们先看一个例子:
给“it”编码时,一个attention head集中在“animal”,另一个集中在“tired”
在这里插入图片描述
但是当我们把全部的attention head都加上时,却变得难以解释:
在这里插入图片描述

用位置编码表示句子的序列中词的顺序

Transformer 给每个输入的词向量又加了一个向量,这些向量的作用的定义每个词在句子中的位置以及不同词之间的距离:
在这里插入图片描述
假设位置向量是4维的,那么例子中的位置向量就长这样:
在这里插入图片描述
那么为什么长这样呢?
下图中每行都代表一个字的位置向量,那么第一行就是位置中的第一个词,每行是512维的向量,每个值都是-1-1之间。 可以看到在一半的位置(第255维左右),图被劈了一半,因为左半边的值是sine算的,右半边用cosine算的;具体的可以自己看论文,代码get_timing_signal_1d()
在这里插入图片描述

残差

对于每个encoder里面的每个sub-layer,它们都有一个残差的连接(不懂?),而且每个sub-layer后面还有一步 layer-normalization(不懂,以后再看)。
在这里插入图片描述
具体长这样(不懂):
在这里插入图片描述
对于decoder模块也是一样的操作:
在这里插入图片描述

Decoder 部分

encoder部分说完了,decoder怎么工作也有了大致的了解,那么它俩是怎么一起工作的呢?
最后一层encoder的输出会被转化为一组attention vector:K和V。 然后这一组attention vector会再decoder层的encoder-decoder attention层被用到,目的是帮助decoder专注在输入序列中合适的位置:
在这里插入图片描述
接着重复上面的步骤,直到decoder全部输出完成
在这里插入图片描述
decoder中的self-attention layer和encoder中的有一点区别:在decoder中,自注意力层只能处理输出序列中当前词之前的序列,做法是在计算softmax之前把后面的词都设成 -inf。
“Encoder-Decoder Attention”层就和multiheaded self-attention的运作方式一样。

最后的Linear和softmax层

Linear层就是一个全连接网络,作用是把decoder输出的向量映射到一个大很多的logits 向量上。
比如模型从训练集中学会10,000个英文单词,那么logits vector就是10000维的,没一维对应一个词,记过softmax计算后输出分数最高的那个词就是这一步的输出
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40005743/article/details/85460869