深度学习的下一步:Transformer和注意力机制

Posted 云头条

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习的下一步:Transformer和注意力机制相关的知识,希望对你有一定的参考价值。

作者:Preet Gandhi是英伟达的深度学习解决方案架构师。

鉴于NLP在如今深度学习的许多应用中普遍很重要,本文介绍了Transformer和注意力机制如何可以进一步改善先进的翻译/转换技术。
 
从Alexa到谷歌翻译(Google Translate),深度学习最具影响力的分支之一是自然语言处理(NLP)。在这个日益全球化的世界,语言翻译已变得必不可少。NLP领域的进步已经带来了许多神经机器翻译/转换技术,比如序列到序列(Seq2Seq)模型,而Transformer和注意力机制可以进一步改善这种技术。

Seq2Seq模型

Seq2Seq是将一个序列转换成另一个序列的一大类模型。编码器-解码器模型是其广泛使用的一个子类。编码器获得输入序列(源语言)后映射到中间隐向量(更高维度空间),隐向量编码源句子的所有信息。随后,解码器获得该信息后映射到输出序列(目标语言)。该模型有能力处理可变长度的输入。编码器和解码器都是循环神经网络(RNN)。通常使用LSTM(长短期记忆),因为数据依赖于序列(单词的顺序很重要)。因此,通过使用输入门/输出门来捕获序列中的长距离依赖关系,记住/遗忘重要/不重要的部分,同时为序列赋予意义,这很重要。输出是数学上反映最高P(输出序列|输入序列)的序列。然而,这种方法有一个问题,因为它将输入源句子的所有信息压缩成固定长度的向量(上一个隐状态的输出),然后该向量由解码器获取。 结果已表明,这导致处理长句时性能下降。

编码器和解码器

注意力机制

解决长句中重要信息丢失这个问题的一种方法是使用注意力机制(attention mechanism)。源句子的第一个单词可能与目标句子的第一个单词高度关联。每次模型预测输出单词时,它仅使用输入中最相关的信息集中的部分,而不是使用整个句子。编码器照常工作,但解码器的隐状态连同上下文向量、先前输出和先前隐状态一并计算。上下文向量被计算成编码器生成的注释的加权和。我们为每个目标单词都有一个单独的上下文向量。在双向LSTM的情况下,这些注释是向前和向后方向上隐状态的级联。每个注释的权重由对齐模型(即前馈网络)计算,该模型对输入和输出的匹配程度进行评分。注意力得分(alpha)即计算上下文向量时隐状态的权重表明某个注释在决定下一个状态、生成输出单词时有多重要。

深度学习的下一步:Transformer和注意力机制 RNN中的注意力机制

注意力类型:

  • 全局注意力:使用编码器中的所有隐状态来计算上下文向量。这从计算资源上来说开销很大,因为要针对每个目标单词考虑来自源句子的所有单词。

  • 局部注意力:选择源句子中的位置来确定要考虑的单词窗口。

  • 双向注意力:同一个模型处理假设和前提,两个表示都是级联的。然而,该模型无法区别停用单词之间的对齐不如内容单词之间的对齐来得重要。

  • 自注意力:这种机制关联单单一个序列的不同位置,以计算其内部表示。

  • 键值注意力:输出向量被分成键以计算注意力和值,从而编码下一个单词分布和上下文表示。

  • 分层嵌套注意力:两个注意力级别:第一个是单词级别,第二个是句子级别。这突出了文档中信息量大的部分。


我们可以解释和直观显示模型在做什么。通过直观显示注意力权重矩阵,我们可以理解模型在如何翻译/转换:

深度学习的下一步:Transformer和注意力机制
直观显示注意力机制

注意力开销很大,因为我们需要计算输入和输出单词每个组合的值。如果是字符级计算,句子又有由数百个子词(token)组成,机制的开销变得很大。我们发现,由于注意力机制,解码器捕获全局信息,而不是完全依赖一个隐状态。学习了解输入和输出之间的依赖关系。不过在Transformer架构中,这个想法延伸为还要学习了解输入内和输出内依赖关系。

Transformer

Transformer是一种新的编码器-解码器架构,它仅使用注意力机制而不是RNN来编码每个位置,并关联有关其自身的输入和输出的两个远端单词,然后可以并行化处理,因而加快训练。由于RNN是顺序型的,如果两个单词隔着10个单词,需要10个计算步骤,但在自注意力中,这只是一个层。它有自注意力的多层,其中所有键(序列中所有单词的向量表示)、值和查询(序列中一个单词的向量表示)都来自输入句子本身。权重由序列的每个单词如何受序列中所有其他单词的影响来加以定义。权重计算可以并行处理,名为多头注意力(multi-head attention)。由于我们不使用RNN,因此我们将位置编码器添加到单词的嵌入表示中以维持顺序。

深度学习的下一步:Transformer和注意力机制
多头注意力

就多头注意力而言,输出是值的加权和,其中分配给每个值的权重由拥有所有键的查询的点积(dot-product)来确定。该架构使用乘法注意力函数,并计算多个注意力加权和,每个加权和是输入表示的线性转换。

编码部分和解码部分分别是一堆数量相同的编码器和解码器。其中的每个元素有同样的结构,但并不共享权重。

深度学习的下一步:Transformer和注意力机制

深度学习的下一步:Transformer和注意力机制
Transformer

每个编码器都有自注意力层和前馈层。在自注意力层中,编码器聚合来自所有其他单词的信息,按照整个上下文提供信息的每个单词生成新的表示。同样的前馈网络独立应用于每个位置。在输入句子中的每个连续位置,自注意力查看其他位置,寻找有助于更好地编码单词的线索。每个位置中的单词流经编码器中的路径,自注意力层中有这些路径之间的依赖关系。前馈层没有允许并行执行的那些依赖关系。在编码器的每个子层之后,还有规范化步骤。位置向量添加到每个输入嵌入,该输入嵌入遵循模型学习了解的特定模式,以帮助知道不同单词之间的距离或每个单词的位置。连接编码器和解码器的多头注意力模块将确保综合考虑编码器输入序列和解码器输入序列。

Transformer

解码器在开始时有自注意力,然后是编码器-解码器注意力以及此后的前馈。解码器输入将向右移动一个位置,使用单词字词的开头作为第一个字符,因为我们不希望自己的模型学习了解在训练期间如何复制解码器输入,因为位置i的目标单词/字符将是解码器输入中的单词/字符i。然而,我们想要了解:若有了编码器序列和模型已经看到的特定解码器序列,我们就能预测下一个单词/字符。因此,通过将解码器输入移动一个位置,我们的模型需要为只看到解码器序列中单词/字符1, …, i-1的位置i预测目标单词/字符。我们将句末字词附加到解码器输入序列的末尾,以标记该序列结束,还将它附加到目标输出句子的末尾。Transformer将掩码(mask)应用于第一个多头注意力模块中的输入,以避免看到潜在的“未来”序列元素。如果没有掩模,多头注意力将在每个位置考虑整个解码器输入序列。在每个时间步长,一个解码器的输出被馈送到另一个解码器。在每个时间步长还添加位置向量。解码器输出进入到线性层(完全连接的NN),该线性层输出对数向量(大得多的向量)。最后,softmax给出了选择与最高概率相关联的相应单词作为该时间步长输出的概率。

Transformer适用于序列转换(语言翻译)、句法结构成分解析的典型语言分析任务以及不同的输入和输出模态(比如图像和视频以及换代消解)。该算法大有潜力,因为它可以应用于图像和视频。该算法的高效是一个活跃的研究领域,可通过尝试不同的位置编码方法(添加vs级联单词嵌入,学习vs预设位置编码等方法)来加以改进。

英文原文链接:https://www.kdnuggets.com/2019/08/deep-learning-transformers-attention-mechanism.html


以上是关于深度学习的下一步:Transformer和注意力机制的主要内容,如果未能解决你的问题,请参考以下文章

深度学习入门基础二简单理解 Transformer

深度学习入门基础二简单理解 Transformer

从感知机到Transformer:一文概述深度学习发展史!

《自然语言处理实战入门》深度学习基础 ---- attention 注意力机制 ,Transformer 深度解析与学习材料汇总

自注意力 self attention Transformer 多头注意力代码 Transformer 代码 动手学深度学习v2

《自然语言处理实战入门》深度学习基础 ---- attention 注意力机制 ,Transformer 深度解析与学习材料汇总