Transformer

Posted on 2022-12-25 19:59  Charlie_ODD  阅读(137)  评论(0编辑  收藏  举报

前言

Transformer的应用场景是NLP领域的序列翻译,在Transformer产生之前,大家一般都是使用基于循环神经网络(RNN)的编码器-解码器(Encoder-Decoder)结构来完成序列翻译。所谓序列翻译,就是输入一个序列,输出另一个序列,例如汉英翻译即输入的序列是汉语表示的一句话,而输出的序列即为对应的英语表达。

2014年,基于深度网络的“序列到序列”(Sequence to Sequence,Seq2Seq)模型逐步成为机器翻译的主流方法。但是由于语言中的词汇在重要性上是有区别的,而原生的Seq2Seq模型对所有词汇“雨露均沾”。

因此,到了2015年,注意力机制被添加到Seq2Seq模型中,克服了原生Seq2Seq模型的若干重大问题,大幅提高了机器翻译的质量。随后的序列翻译工作基本上都是以上述工作为基础。我们就从这两个模型说起。

概览

论文中的验证Transformer的实验室基于机器翻译的,下面我们就以机器翻译为例子详细剖析Transformer的结构,在机器翻译中,Transformer可概括为:

Transformer的本质上是一个Encoder-Decoder的结构,那么上图可以表示为下图的结构:

如论文中所设置的,Transformer的Encoder和Decoder均由6个block堆叠而成,与所有的生成模型相同的是,编码器的输出会作为解码器的输入

Encoder

在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量𝑍,这个𝑍遍是论文公式1中的𝐴𝑡𝑡𝑒𝑛𝑠𝑖𝑜𝑛(𝑄,𝐾,𝑉 )


第一次看到这个公式你可能会一头雾水,在后面的文章中我们会揭开这个公式背后的实际含义,在这一段暂时将其叫做𝑍 。得到𝑍 之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:

Encoder的结构如图:

Decoder

Decoder的结构如上图所示,与Encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:

  1. Self-Attention当前翻译和已经翻译的前文之间的关系
  2. Encoder-Decoder Attention当前翻译和编码的特征向量之间的关系

Encoder示例分析

刚才介绍的就是Transformer的主要框架,下面我们将介绍它的输入数据。如下图所示,首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量,论文中使用的词嵌入的维度为𝑑𝑚𝑜𝑑𝑒𝑙= 512

输入编码作为一个tensor输入到encoder中:

Self-Attention是Transformer最核心的内容:目的是为输入向量的每个单词学习一个权重,经典Attention可视化示例图如下:

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

在self-attention中,每个单词有3个不同的向量,它们分别是Query向量(𝑄),Key向量(𝐾)和Value向量(𝑉),长度均是 64。它们是通过3个不同的权值矩阵由嵌入向量 𝑋 乘以三个不同的权值矩阵𝑊𝑄, 𝑊𝐾, 𝑊𝑉 得到【这三个如何得到的?随机初始化的线性变化的矩阵;64这个维度的选择有什么意义?】,其中三个矩阵的尺寸也是相同的,均是 512× 64

注意: X, Q, K, V 的每一行都表示一个单词

Attention的计算方法,整个过程可以分成7步:【假设维度为

  • 定义线性变换矩阵【假设维度均为
  • 根据嵌入向量得到𝑞, 𝑘, 𝑣 三个向量;【维度均为

  • 为每个向量计算一个score:𝑠𝑐𝑜𝑟𝑒=𝑞∗𝑘;【标量】

  • 为了梯度的稳定,Transformer使用了score归一化,即除以【0-1的标量】
  • 对score施以softmax激活函数,softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1;
  • softmax点乘Value值𝑣 ,得到加权的每个输入向量的评分𝑣 ;

  • 相加之后得到最终的输出结果𝑧=∑𝑣。【维度为

说明:

Query,Key,Value的概念取自于信息检索系统,举个简单的搜索的例子来说。当你在某电商平台搜索某件商品(年轻女士冬季穿的红色薄款羽绒服)时,你在搜索引擎上输入的内容便是Query,然后搜索引擎根据Query为你匹配Key(例如商品的种类,颜色,描述等),然后根据Query和Key的相似度得到匹配的内容(Value)。

self-attention中的Q,K,V也是起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法 之一,因此使用 进行相似度的计算。接着便是根据相似度进行输出的匹配,这里使用了加权匹配 的方式,而权值就是query与key的相似度。

 

Encoder结构

在self-attention需要强调的最后一点是其采用了残差网络中的short-cut结构,目的当然是解决深度学习中的退化问题

 

整体结构

 

Multi-Head Attention

Multi-Head Attention相当于ℎh个不同的self-attention的集成(ensemble),在这里我们以ℎ=8h=8举例说明。Multi-Head Attention的输出分成3步:

  1. 将数据𝑋分别输入到图13所示的8个self-attention中,得到8个加权后的特征矩阵𝑍𝑖,𝑖∈1,2,...,8。
  2. 将8个𝑍𝑖 按列拼成一个大的特征矩阵(512,64×8)。
  3. 特征矩阵经过一层全连接后得到输出𝑍。

  • 为什么要多头注意力?

 

 

位置编码

截止目前为止,我们介绍的Transformer模型并没有捕捉顺序序列的能力,也就是说无论句子的结构怎么打乱,Transformer都会得到类似的结果。换句话说,Transformer只是一个功能更强大的词袋模型而已。

为了解决这个问题,论文中在编码词向量时引入了位置编码(Position Embedding)的特征。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。

那么怎么编码这个位置信息呢?常见的模式有:

a. 根据数据学习;

b. 自己设计编码规则—— 好的位置编码方案需要满足以下几条要求:

  • 它能为每个时间步输出一个独一无二的编码;
  • 不同长度的句子之间,任何两个时间步之间的距离应该保持一致;
  • 模型应该能毫不费力地泛化到更长的句子。它的值应该是有界的;
  • 它必须是确定性的。

在这里作者采用了第二种方式【创新的位置编码方法,能够满足上述所有的要求】。那么这个位置编码该是什么样子呢?通常位置编码是一个长度为 𝑑𝑚𝑜𝑑𝑒𝑙 的特征向量,这样便于和词向量进行单位加的操作,如图:

论文给出的编码公式如下:

在上式中,𝑝𝑜𝑠pos 表示单词的位置, 𝑖i 表示单词的维度。关于位置编码的实现可在Google开源的算法中get_timing_signal_1d() 函数找到对应的代码。

作者这么设计的原因是考虑到在NLP任务重,除了单词的绝对位置,单词的相对位置也非常重要。根据公式 𝑠𝑖𝑛(𝛼+𝛽)=𝑠𝑖𝑛𝛼𝑐𝑜𝑠𝛽+𝑐𝑜𝑠𝛼𝑠𝑖𝑛𝛽 以及 𝑐𝑜𝑠(𝛼+𝛽)=𝑐𝑜𝑠𝛼𝑐𝑜𝑠𝛽−𝑠𝑖𝑛𝛼𝑠𝑖𝑛𝛽,这表明位置𝑘+𝑝k+p 的位置向量可以表示为位置𝑘k的特征向量的线性变化,这为模型捕捉单词之间的相对位置关系提供了非常大的便利。

如果我们假设嵌入的维数为4,那么实际的位置编码将如下所示:

在下图中,每行对应矢量的位置编码。因此第一行将是我们添加到输入序列中嵌入第一个单词的向量。每行包含512个值 - 每个值介于1和-1之间。我们对它们进行了颜色编码,使图案可见。

嵌入大小为512(列)的20个字(行)的位置编码的真实示例。你可以看到它在中心区域分成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们连接起来以形成每个位置编码矢量。

 

残差结构

 

Decoder结构

完成编码阶段后,我们开始解码阶段。解码阶段中的每个步骤输出来自输出序列的元素(在这种情况下为英语翻译句子)。

以下步骤重复该过程,直到到达特殊符号,表明Transformer解码器已完成其输出。每个步骤的输出在下一个时间步骤中被馈送到底部解码器,并且解码器像编码器那样冒泡它们的解码结果。就像我们对编码器输入所做的那样,我们在这些解码器输入中嵌入并添加位置编码,以指示每个字的位置。

输出层

解码器堆栈输出浮点数向量。我们如何将其变成一个单词?这是最终线性层的工作,其后是Softmax层。 线性层是一个简单的全连接的神经网络,它将解码器堆栈产生的向量投影到一个更大的向量中,称为logits向量。

 

总结

优点:

  • 虽然Transformer最终也没有逃脱传统学习的套路,Transformer也只是一个全连接(或者是一维卷积)加Attention的结合体。但是其设计已经足够有创新,因为其抛弃了在NLP中最根本的RNN或者CNN并且取得了非常不错的效果,算法的设计非常精彩,值得每个深度学习的相关人员仔细研究和品位。
  • Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的。
  • Transformer不仅仅可以应用在NLP的机器翻译领域,甚至可以不局限于NLP领域,是非常有科研潜力的一个方向。
  • 算法的并行性非常好,符合目前的硬件(主要指GPU)环境。

缺点:

  • 粗暴的抛弃RNN和CNN虽然非常炫技,但是它也使模型丧失了捕捉局部特征的能力,RNN + CNN + Transformer的结合可能会带来更好的效果。
  • Transformer失去的位置信息其实在NLP中非常重要,而论文中在特征向量中加入Position Embedding也只是一个权宜之计,并没有改变Transformer结构上的固有缺陷。

 

参考

李沐:https://www.zhihu.com/zvideo/1466282983652691968

https://www.cnblogs.com/zhongzhaoxie/p/13064374.html#2-transformer%E8%AF%A6%E8%A7%A3