原文出处:Transformers 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
注意力机制与 Transformer
课前小测
NLP 领域最重要的问题之一是机器翻译,Google 翻译这类工具都建立在它之上。本节聚焦机器翻译,再推广一步,也就是任何序列到序列(sequence-to-sequence)任务,也叫句子转导(sentence transduction)。
用 RNN 做序列到序列,靠的是两个循环网络:一个网络是编码器(encoder),把输入序列压缩成一个隐状态;另一个网络是解码器(decoder),把这个隐状态展开成翻译结果。这套做法有两个问题:
- 编码器网络的最终状态很难记句子的开头,导致模型处理长句时质量不佳
- 序列里的每个词对结果的影响相同。但现实中,输入序列里的特定词往往比其他词对输出影响更大
注意力机制(attention mechanism)提供了解法:它给每个输入向量分配权重,衡量它们对 RNN 每次输出预测的上下文影响。实现方式是搭建捷径,直接连接输入 RNN 的中间状态和输出 RNN。这样,生成输出符号 y_t 时,我们会考虑所有输入隐状态 h_i,并给每个状态配上不同的权重系数 α_t,i。
原文此处有一张图,画的是带加性注意力层的编码器-解码器模型,出自 Bahdanau 等人 2015 年的论文,转引自这篇博客。
注意力矩阵 {α_i,j} 表示的是:某些输入词在输出生成某个给定词时起到多大作用。原文此处有一张这样的矩阵示例图(取自 Bahdanau 等人 2015 年论文的图 3,RNNsearch-50 找到的对齐关系),从矩阵里可以直接读出输入词与输出词之间的对应强度。
注意力机制撑起了 NLP 当前(或接近当前)最高水平的大部分成果。不过加上注意力会大幅增加模型参数,带来 RNN 的扩展难题。扩展 RNN 的一个关键约束在于:这类模型天生是循环的,训练时很难做批处理和并行化。RNN 里序列的每个元素必须按顺序逐个处理,没法轻松并行。
原文此处有一张动画图(来自 Google 官方博客),演示带注意力机制的编码器-解码器网络的工作过程。
注意力机制的普及,加上上面这个并行化约束,共同催生了如今被称为最先进水平的 Transformer 模型,从 BERT 到 OpenGPT3 都在其中。
Transformer 模型
Transformer 的主要设计思想之一,是避开 RNN 的顺序处理,做出一个训练时能并行的模型。它靠两个办法实现:
- 位置编码(positional encoding)
- 用自注意力(self-attention)机制捕捉模式,取代 RNN(或 CNN)。提出 Transformer 的论文因此取名 Attention is all you need(注意力就是一切)
位置编码/位置嵌入
位置编码的思路是这样的:
- 用 RNN 时,词元(token)之间的相对位置由处理步数体现,不需要显式表示。
- 一旦改用注意力,就必须知道词元在序列中的相对位置。
- 为了得到位置编码,我们给词元序列配上一条位置序列(也就是 0,1,…… 这样一串数字)。
- 然后把词元的位置和词元的嵌入(embedding)向量混合。要把位置(整数)变成向量,有几种做法:
- 可训练的嵌入,跟词元嵌入类似,本文采用这一种。给词元和词元的位置各套一层嵌入层,得到维度相同的两组向量,再对应相加。
- 固定的位置编码函数,原论文的做法。
原文此处有一张图(作者自绘),展示词元嵌入与位置嵌入相加的过程。
位置嵌入得到的结果,把原始词元和它在序列中的位置一起编码了进去。
多头自注意力
接下来要捕捉序列内部的模式。Transformer 为此使用自注意力机制,本质上就是把注意力同时作为输入和输出施加到同一条序列上。用自注意力,我们能顾及句子中的上下文(context),看出哪些词彼此相关。例如,it 这类指代词到底指向前文哪个词,自注意力能看到,并且把上下文一并纳入考虑。原文此处有一张图(来自 Google 官方博客),演示的就是这种指代消解。
Transformer 里我们还使用多头注意力(Multi-Head Attention),让网络有能力同时捕捉多不同类型的依赖关系,比如长期与短期的词间关系、指代关系与其他关系。
TensorFlow 笔记本里有 Transformer 各层实现的更多细节。
编码器-解码器注意力
在 Transformer 里,注意力用在两个地方:
- 通过自注意力捕捉输入文本内部的模式
- 完成序列翻译,即编码器与解码器之间的那层注意力
编码器-解码器注意力与本节开头讲的 RNN 注意力机制非常接近。原文此处有一张动画图,演示这种注意力在模型求值时的角色。
由于每个输入位置到每个输出位置的映射彼此独立,Transformer 的并行化能力远超 RNN,由此才能撑起更大、表达力更强的语言模型。每个注意力头可以学到词与词之间的不同关系,让下游的自然语言处理任务受益。
BERT
BERT(Bidirectional Encoder Representations from Transformers,基于 Transformer 的双向编码器表示)是一个非常大的多层 Transformer 网络:BERT-base 有 12 层,BERT-large 有 24 层。模型先在大规模文本语料(维基百科加书籍)上用无监督训练做预训练,任务是预测句子中被遮住的词。预训练过程中,模型吸收了相当深厚的语言理解能力,之后再用其他数据集做微调(fine-tuning),就能把这份能力用起来。这个过程叫迁移学习(transfer learning)。
原文此处有一张图,展示 BERT 的遮罩语言建模,来自 Jay Alammar 的图解 BERT 博客。
练习:Transformer
在下面的笔记本里继续学习:
小结
这一课讲了 Transformer 和注意力机制,两者都是 NLP 工具箱里的必备工具。Transformer 架构有很多变体:BERT、DistilBERT、BigBird、OpenGPT3 等等,大多可以微调后为己所用。HuggingFace 机构维护的代码库能帮你用 PyTorch 或 TensorFlow 训练上面这些架构中的大多数。
课后小测
复习与自学
- 详解 "Attention is all you need" 的博客文章
- 图解 Transformer 系列文章,逐篇细讲架构