# 编解码器循环神经网络中的注意力如何工作

> 原文： [https://machinelearningmastery.com/how-does-attention-work-in-encoder-decoder-recurrent-neural-networks/](https://machinelearningmastery.com/how-does-attention-work-in-encoder-decoder-recurrent-neural-networks/)

注意力是一种机制，旨在提高机器翻译中编解码器 RNN 的表现。

在本教程中，您将发现编解码器模型的注意机制。

完成本教程后，您将了解：

*   关于编解码器模型和机器翻译的注意机制。
*   如何逐步实现关注机制。
*   注意机制的应用和扩展。

让我们开始吧。

*   **2017 年 12 月更新**：修正了第 4 步的小错字，谢谢 Cynthia Freeman。

## 教程概述

本教程分为 4 个部分;他们是：

1.  编解码器模型
2.  注意模型
3.  工作注意的例子
4.  注意力的扩展

## 编解码器模型

两篇论文介绍了用于循环神经网络的编解码器模型。

两者都开发了技术来解决机器翻译的序列到序列的性质，其中输入序列的长度与输出序列不同。

Ilya Sutskever，et al。在使用 LSTM 的文章“[序列到神经网络的序列学习](https://arxiv.org/abs/1409.3215)”中这样做。

Kyunghyun Cho，et al。在“[学习短语表示使用 RNN 编解码器进行统计机器翻译](https://arxiv.org/abs/1406.1078)”中这样做。这项工作和一些同一作者（Bahdanau，Cho 和 Bengio）后来开发了他们的特定模型以开发注意力模型。因此，我们将快速浏览本文所述的编解码器模型。

从高级别来看，该模型由两个子模型组成：编码器和解码器。

*   **编码器**：编码器负责逐步执行输入时间步长并将整个序列编码为称为上下文向量的固定长度向量。
*   **解码器**：解码器负责在从上下文向量读取时逐步执行输出时间步长。

![Encoder-Decoder Recurrent Neural Network Model.](img/047c218a5eed4d8b21b095b8e19b7a80.jpg)

编解码器循环神经网络模型。
取自“使用 RNN 编解码器进行统计机器翻译的学习短语表示”

> 我们提出了一种新颖的神经网络架构，它学习将可变长度序列编码成固定长度的向量表示，并将给定的固定长度向量表示解码回可变长度序列。

- [使用 RNN 编解码器进行统计机器翻译的学习短语表示](https://arxiv.org/abs/1406.1078)，2014。

模型的关键在于整个模型（包括编码器和解码器）是端到端训练的，而不是单独训练元素。

一般地描述该模型，使得不同的特定 RNN 模型可以用作编码器和解码器。

作者不是使用流行的长期短期记忆（LSTM）RNN，而是开发和使用他们自己的简单类型的 RNN，后来称为门控循环单元（GRU）。

此外，与 Sutskever 等人不同。在模型中，来自前一时间步骤的解码器的输出被作为输入馈送以解码下一个输出时间步长。您可以在上图中看到这一点，其中输出 y2 使用上下文向量（C），从解码 y1 传递的隐藏状态以及输出 y1。

> ... y（t）和 h（i）也都以 y（t-1）和输入序列的摘要 c 为条件。

- 使用 RNN 编解码器进行统计机器翻译的[学习短语表示](https://arxiv.org/abs/1406.1078)，2014

## 注意模型

Dzmitry Bahdanau 等人提出了注意力。在他们的论文“[神经机器翻译中通过联合学习来对齐和翻译](https://arxiv.org/abs/1409.0473)”，这是他们以前在编解码器模型上工作的自然延伸。

提出注意作为对编解码器模型的限制的解决方案，该编解码器模型将输入序列编码为一个固定长度向量，从该向量解码每个输出时间步长。在解码长序列时，这个问题被认为是更多的问题。

> 这种编解码器方法的潜在问题是神经网络需要能够将源句子的所有必要信息压缩成固定长度的向量。这可能使神经网络难以处理长句，特别是那些比训练语料库中的句子长的句子。

- [通过联合学习对齐和翻译的神经机器翻译](https://arxiv.org/abs/1409.0473)，2015。

建议将注意力作为对齐和翻译的方法。

对齐是机器翻译中的问题，其识别输入序列的哪些部分与输出中的每个单词相关，而翻译是使用相关信息来选择适当输出的过程。

> ...我们引入了编解码器模型的扩展，它学会了共同对齐和翻译。每次所提出的模型在翻译中生成单词时，它（软）搜索源语句中的一组位置，其中最相关的信息被集中。然后，模型基于与这些源位置和所有先前生成的目标词相关联的上下文向量来预测目标词。

- [通过联合学习对齐和翻译的神经机器翻译](https://arxiv.org/abs/1409.0473)，2015。

注意模型不是将输入序列编码成单个固定的上下文向量，而是开发一个特定于每个输出时间步骤过滤的上下文向量。

![Example of Attention](img/e825a9af99294073846960f320d8a4e5.jpg)

注意力
取自“通过共同学习协调和翻译的神经机器翻译”，2015 年。

与编解码器纸一样，该技术应用于机器翻译问题并使用 GRU 单元而不是 LSTM 存储器单元。在这种情况下，使用双向输入，其中向前和向后提供输入序列，然后在传递到解码器之前将其连接。

我们将研究一个有效的例子，而不是重新迭代用于计算注意力的等式。

## 工作注意的例子

在本节中，我们将通过一个小的工作示例来注意具体。具体来说，我们将使用未向量化的术语逐步完成计算。

这将为您提供足够详细的理解，您可以将注意力添加到您自己的编解码器实现中。

这个有效的例子分为以下 6 个部分：

1.  问题
2.  编码
3.  对准
4.  权重
5.  上下文向量
6.  解码

### 1.问题

问题是一个简单的序列到序列预测问题。

有三个输入时间步骤：

```py
x1, x2, x3
```

该模型需要预测一个时间步骤：

```py
y1
```

在此示例中，我们将忽略编码器和解码器中使用的 RNN 的类型，并忽略双向输入层的使用。这些元素对于理解解码器中的注意力计算并不重要。

### 2.编码

在编解码器模型中，输入将被编码为单个固定长度向量。这是最后一个时间步的编码器模型的输出。

```py
h1 = Encoder(x1, x2, x3)
```

注意模型需要在每个输入时间步长访问编码器的输出。本文将这些称为每个时间步的“_ 注释 _”。在这种情况下：

```py
h1, h2, h3 = Encoder(x1, x2, x3)
```

### 3.对齐

解码器一次输出一个值，在最终输出当前输出时间步长的预测（y）之前，该值被传递到可能更多的层。

对准模型得分（e）每个编码输入（h）与解码器的当前输出的匹配程度。

分数的计算需要来自前一输出时间步骤的解码器的输出，例如， S（T-1）。为解码器的第一个输出进行评分时，这将为 0。

使用函数 a（）执行评分。我们可以为第一个输出时间步骤评分每个注释（h），如下所示：

```py
e11 = a(0, h1)
e12 = a(0, h2)
e13 = a(0, h3)
```

我们对这些分数使用两个下标，例如 e11，其中第一个“1”表示输出时间步长，第二个“1”表示输入时间步长。

我们可以想象，如果我们有一个带有两个输出时间步长的序列到序列问题，那么稍后我们可以按如下方式对第二个时间步的注释进行评分（假设我们已经计算了 s1）：

```py
e21 = a(s1, h1)
e22 = a(s1, h2)
e23 = a(s1, h3)
```

函数 a（）在本文中称为对齐模型，并实现为前馈神经网络。

这是传统的单层网络，其中每个输入（s（t-1）和 h1，h2 和 h3）被加权，使用双曲正切（tanh）传递函数并且输出也被加权。

### 4.加权

接下来，使用 [softmax 函数](https://en.wikipedia.org/wiki/Softmax_function)对准分数进行归一化。

分数的归一化允许它们被视为概率，指示每个编码的输入时间步长（注释）与当前输出时间步长相关的可能性。

这些标准化分数称为注释权重。

例如，我们可以计算 softmax 注释权重（a）给定计算的对齐分数（e）如下：

```py
a11 = exp(e11) / (exp(e11) + exp(e12) + exp(e13))
a12 = exp(e12) / (exp(e11) + exp(e12) + exp(e13))
a13 = exp(e13) / (exp(e11) + exp(e12) + exp(e13))
```

如果我们有两个输出时间步长，则第二个输出时间步长的注释权重将按如下方式计算：

```py
a21 = exp(e21) / (exp(e21) + exp(e22) + exp(e23))
a22 = exp(e22) / (exp(e21) + exp(e22) + exp(e23))
a23 = exp(e23) / (exp(e21) + exp(e22) + exp(e23))
```

### 5.上下文向量

接下来，将每个注释（h）乘以注释权重（a）以产生新的有人值守的上下文向量，从该向量上下文向量可以解码当前输出时间步长。

为简单起见，我们只有一个输出时间步骤，因此我们可以如下计算单个元素上下文向量（带括号以便于阅读）：

```py
c1 = (a11 * h1) + (a12 * h2) + (a13 * h3)
```

上下文向量是注释和标准化对齐分数的加权和。

如果我们有两个输出时间步长，则上下文向量将由两个元素[c1，c2]组成，计算如下：

```py
c1 = a11 * h1 + a12 * h2 + a13 * h3
c2 = a21 * h1 + a22 * h2 + a23 * h3
```

### 6.解码

然后根据编解码器模型执行解码，尽管在这种情况下使用当前时间步长的有人值环境向量。

解码器的输出在本文中称为隐藏状态。

```py
s1 = Decoder(c1)
```

在最终退出模型之前，这可以被馈送到附加层中作为时间步长的预测（y1）。

## 注意力的扩展

本节介绍 Bahdanau 等人的一些其他应用。注意机制。

### 硬和软的注意力

在 2015 年论文“[展示，出席和讲述：神经图像标题生成与视觉注意](https://arxiv.org/abs/1502.03044)”，Kelvin Xu，et al。使用卷积神经网络作为关于字幕照片问题的图像数据的特征提取器，将注意力应用于图像数据。

他们开发了两种注意机制，一种称为“_ 软注意 _”，它类似于上面用加权上下文向量引起的注意，第二种是“_ 硬注意 _”，其中清晰的决策是关于每个单词的上下文向量中的元素。

他们还建议双重关注，注意力集中在图像的特定部分。

### 删除以前的隐藏状态

这种机制的一些应用已经简化了方法，以便从注释评分中删除上一个输出时间步骤（s（t-1））的隐藏状态（上面的步骤 3）。

两个例子是：

*   [用于文档分类的分层注意网络](https://www.microsoft.com/en-us/research/publication/hierarchical-attention-networks-document-classification/)，2016。
*   [用于关系分类的基于注入的双向长短期记忆网络](http://aclweb.org/anthology/P/P16/P16-2034.pdf)，2016

这具有不向模型提供先前解码的输出的想法的效果，其旨在帮助对准。

这在论文中列出的等式中有所说明，并且不清楚任务是对模型的有意改变还是仅仅是方程式的省略。在任何一篇论文中都没有讨论过放弃这个术语。

### 研究以前的隐藏状态

Minh-Thang Luong，et al。在他们的 2015 年论文中，“[基于注意力的神经机器翻译的有效方法](https://arxiv.org/abs/1508.04025)”明确地重新构建了在注释评分中使用先前的解码器隐藏状态。另请参见[论文的演示文稿](https://vimeo.com/162101582)和[相关的 Matlab 代码](https://github.com/lmthang/nmt.matlab/tree/master/code/layers)。

他们开发了一个框架来对比不同的注释评分方法。他们的框架调出并明确排除了注释评分中的先前隐藏状态。

相反，他们采用先前的注意上下文向量并将其作为输入传递给解码器。目的是允许解码器知道过去的对齐决定。

> ......我们提出了一种输入馈送方法，其中注意向量 ht 在下一步[...]与输入连接。具有这种连接的效果是双重的：（a）我们希望使模型充分了解先前的对齐选择;（b）我们创建一个跨越水平和垂直的非常深的网络

- [基于注意力的神经机器翻译的有效方法](https://arxiv.org/abs/1508.04025)，2015。

以下是本文采用的这种方法的图片。注意虚线表示使用解码器参与隐藏状态输出（ht），在下一个时间步长向解码器提供输入。

![Feeding Hidden State as Input to Decoder](img/d66bf632243c7629cd755622292c47aa.jpg)

将隐藏状态作为解码器的输入
取自“基于注意力的神经机器翻译的有效方法”，2015 年。

他们还开发了“_ 全局 _”与“_ 本地 _”注意力，其中本地注意力是对学习固定大小窗口以在每个输出时间强加注意向量的方法的修改步。它被认为是 Xu 等人提出的“_ 硬注意 _”的简单方法。

> 全球关注的缺点在于它必须关注每个目标词的源侧的所有单词，这是昂贵的并且可能使得翻译较长序列（例如段落或文档）变得不切实际。为了解决这一不足，我们提出了一种局部注意机制，它选择只关注每个目标词的一小部分源位置。

- [基于注意力的神经机器翻译的有效方法](https://arxiv.org/abs/1508.04025)，2015。

在具有不同注释评分函数的全局和局部关注的论文中的分析表明，局部关注在翻译任务上提供了更好的结果。

## 进一步阅读

如果您要深入了解，本节将提供有关该主题的更多资源。

### 编解码器文件

*   [使用 RNN 编解码器进行统计机器翻译的学习短语表示](https://arxiv.org/abs/1406.1078)，2014。
*   [用神经网络进行序列学习的序列](https://arxiv.org/abs/1409.3215)，2014。

### 注意论文

*   [通过共同学习对齐和翻译的神经机器翻译](https://arxiv.org/abs/1409.0473)，2015。
*   [显示，参与和讲述：视觉注意的神经图像标题生成](https://arxiv.org/abs/1502.03044)，2015。
*   [用于文档分类的分层注意网络](https://www.microsoft.com/en-us/research/publication/hierarchical-attention-networks-document-classification/)，2016。
*   [用于关系分类的基于注入的双向长短期记忆网络](http://aclweb.org/anthology/P/P16/P16-2034.pdf)，2016
*   [基于注意力的神经机器翻译的有效方法](https://arxiv.org/abs/1508.04025)，2015。

### 更多关于注意力

*   [长期短期记忆循环神经网络](http://machinelearningmastery.com/attention-long-short-term-memory-recurrent-neural-networks/)的注意力
*   [第 10 讲：神经机器翻译和注意模型](https://www.youtube.com/watch?v=IxQtK2SjWWM)，斯坦福大学，2017 年
*   [第 8 讲 - 引起注意的语言](https://www.youtube.com/watch?v=ah7_mfl7LD0)，牛津大学。

## 摘要

在本教程中，您发现了 Encoder-Decoder 模型的注意机制。

具体来说，你学到了：

*   关于编解码器模型和机器翻译的注意机制。
*   如何逐步实现关注机制。
*   注意机制的应用和扩展。

你有任何问题吗？
在下面的评论中提出您的问题，我会尽力回答。