【深度学习模型】Transfomer以及Self-Attention讲解


前言

这一篇主要讲解谷歌发表的Attention Is All You Need。这篇论文提出了驰名的一种注意力机制 —— self-attention 模块,并进一步提出了 Transformer 架构,从而将以往用的计算代价较大的RNN替换掉了。目前,nlp任务中效果非常好的BERT模型就是大量应用了Transformer架构的Encoder。

下边是一个很好的使用Transformer进行机器翻译任务的例子。在预测过程中,编码阶段,输入的“I arrived at the”中的每个单词都会计算与所有单词的注意力权重,并加权求和得出新的自己的表示,逐层编码。解码阶段,输入由encoder出来的所有单词的表示和上一个位置输出的embedding,经过类似的注意力操作得到这一个位置的输出,是一种随着预测位置移动的迭代过程。
戳我看例子


1. 总体框架与流程

1.1 框架

对照着以上例子,看下边的Transfomer总体框架图。左边为编码器,右边为解码器。编码器和解码器中都包含了Positional Encoding模块,Multi-Head Attention模块,Feed-Forward模块。下一章节会对此着重讲解。
在这里插入图片描述

1.2 流程

定义一下符号。

  • emb_dim:嵌入的尺寸
  • input_length:输入序列的长度
  • target_length:目标序列的长度+1。+1是因为要移位。
  • vocab_size:目标词汇表中的单词数量。
    则Transformer的流程可表示为:
  1. 该模型将每个token表示为维度emb_dim的向量。然后,对于特定的输入序列,我们有了尺寸为(input_length)x(emb_dimb)的矩阵。
  2. 然后添加位置信息(位置编码)。与上一步一样,此步骤将返回尺寸为(input_length)x(emb_dim)的矩阵。
  3. 数据通过N=6个编码器块。之后,我们获得尺寸为(input_length)x(emb_dim)的矩阵。
  4. 目标序列经过等同于1和2的操作,并进行mask屏蔽。输出的尺寸为(target_length)x(emb_dim)。
  5. 4的结果经过N=6个解码器块。在每个迭代中,解码器都使用编码器的输出3)。这在总框图中由从编码器到解码器的箭头表示。输出的尺寸为(target_length)x(emb_dim)。
  6. 最后,逐行使用全连接层和softmax。输出的尺寸为(target_length)x(vocab_size)。

在这里插入图片描述
编码器对于训练阶段和测试阶段是一样的编码过程,而解码器的流程则有所不同,因此先讲解一下解码器的训练和测试。
在测试阶段,由于没有groundtruth,所以我们需要从零开始不断迭代一个词一个词地生成。具体操作如下:

  1. 计算输入序列的嵌入表示。
  2. 使用起始token例如’‘,作为第一个目标序列。该模型将预测输出一个token。
  3. 将最后一个预测token添加到目标序列,并使用它生成新的预测。
  4. 重复执行步骤3,每次的输入token和输出token都增加,直到预测的token是表示序列结束的token,例如。
    训练阶段中,由于我们事先有roundtruth,因此我们将直接为模型提供整个已移位目标序列,并要求其预测未移位目标。
    举个例子,目标是将句子从英语翻译成西班牙语:
    X = [‘Hello’,’,’,’how’,’are’,’you’,’?’](输入序列)
    Y = [‘Hola’,’,’,’como’,’estas’, ‘?’](目标序列)
    在前面的示例之后,我们将给解码器输入:
    [‘‘,’Hola’,’,’,’como’,’estas’,’?’]
    预期的预测将是:
    [‘Hola’,’,’,’como’,’estas’,’?’,’‘]

因此可以看到,解码器在训练时直接从target_length->target_length,而测试时则是从1->1 2->2 3->3 … target_length->target_length的过程,最后预测的是每次迭代中最后一个预测的token串联起来。

2. 模块细节

2.1 Positional Encoding

Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

  • 用不同频率的sine和cosine函数直接计算
  • 学习出一份positional embedding
    实验后发现两者结果一样,所以用了第一种方法,优点是不需要训练参数,而且即使在训练集中没有出现过的句子长度上也能用
    在这里插入图片描述
    对于输入序列,经过word embedding后,加上positional embedding后即可得到该序列的 representation,序列中的每个token都转换成包含 word 的特征和 word 在句子中的位置信息的向量。

2.2 Multi-Head Attention

Multi-Head Attention其实就是多个Self-Attention结构的结合。因此,首先我们需要着重学习论文的重点Self-Attention。

2.3 Self-Attention

从一个比较知名的例子讲起。
假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用x1表示,Machines的embedding vector用x2表示。当我们处理Thinking这个词时,我们需要计算句子中所有词与它的Attention Score,这就像将当前词作为搜索的query,去和句子中所有词(包含该词本身)的key去匹配(点乘),看看相关度有多高。相关度进行尺度缩放与softmax归一化可以得到注意力权重,注意力与相应的value加权求和就得到新的表达。
在这里插入图片描述
如果将输入的所有向量合并为矩阵形式,则所有query, key, value向量也可以合并为矩阵形式表示

在这里插入图片描述
则上述操作可简化为矩阵形式
在这里插入图片描述
这就是著名的注意力公式:
在这里插入图片描述

2.4 Multi-Head Attention

基于上边的Self-Attention, 我们进一步拓展,对输入序列使用不同的Q,K,V进行多次以上操作,而后拼接起来,再转换成最终的表示。这样每个head可以学习到在不同表示空间中的特征。
在这里插入图片描述
可视化如下:
在这里插入图片描述

2.5 Masked Multi-Head Attention

在训练过程的解码器中,需要对输入的注意力矩阵(即上边QK经过softmax的矩阵)进行masked操作,从而不给模型看见未来信息,解决了信息泄露问题。举例来说,对于目标序列(I have a dream),I作为第一个单词,只能有和自身的attention。have作为第二个单词,有和I, have 两个attention。 a 作为第三个单词,有和I,have,a 前面三个单词的attention。到了最后一个单词dream的时候,才有对整个句子4个单词的attention。
在这里插入图片描述
其它操作和上述的Multi-Head Attention一致。

2.6 Encoder-Decoder Multi-Head Attention

在解码器的第二层attention里,需要整合encoder的输入序列和decoder的目标序列的信息,算出相互之间的注意力。与Multi-Head Attention的不同点在于,Encoder-Decoder Multi-Head Attention的Q矩阵来自decoder,而K和V来自encoder。其实也很好理解,就是注意力矩阵是由来自解码器的Query和来自编码器的Key之间计算得来,其它操作都相同。

2.7 Feed-Forward

这个就很简单了,就是简单的映射层。
在这里插入图片描述

2.8 Produce Output Probabilities

这个其实也是普通的映射层,它将每一个目标序列的token由emb_dim映射到vocab_size,因此就可得到各个token,串成目标序列了。

3. 总结

不得不说,这确实是一篇很经典的论文,将seq2seq模型推到了一个新高度,避免了RNN的大量计算代价,从此用CNN操作序列信号就有很好的效果了。另外,Self-Attention还跨界在cv行业也有了非常多的研究。可以说cv和nlp是同源的,只需要将图像的长宽拉成一列(空间信息)类比成序列信号的序列,图像的通道类比成序列信号的embedding即可。因此,Self-Attention模块的输入在nlp上是time × embedding,在cv上是spatial × channel。此外,当下横扫nlp的BERT模型也是基于Transfomer的encoder,这也表明这个模型的重要性了。

参考文献

https://medium.com/dissecting-bert/dissecting-bert-appendix-the-decoder-3b86f66b0e5f
https://zhuanlan.zhihu.com/p/80986272
https://zhuanlan.zhihu.com/p/44121378
https://zhuanlan.zhihu.com/p/39034683
https://zhuanlan.zhihu.com/p/47282410

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值