采用注意力机制的神经机器翻译(tensorflow2.0官方教程翻译)

本教程训练一个序列到序列 (seq2seq)模型,实现西班牙语到英语的翻译。这是一个高级示例,要求您对序列到序列模型有一定的了解。

训练模型后,输入一个西班牙语句子将返回对应英文翻译,例如 "¿todavia estan en casa?" ,返回 "are you still at home?"

对于一个玩具例子来说,翻译质量是合理的,但是生成的注意情节可能更有趣。这说明在翻译过程中,模型注意到了输入句子的哪些部分:

spanish-english attention plot

注意:此示例在单个P100 GPU上运行大约需要10分钟。

1. 下载并准备数据集

我们将使用 http://www.manythings.org/anki/ 提供的语言数据集。此数据集包含以下格式的语言翻译对:

有多种语言可供选择,但我们将使用英语 - 西班牙语数据集。为方便起见,我们在Google Cloud上托管了此数据集的副本,但您也可以下载自己的副本。下载数据集后,以下是我们准备数据的步骤:

  1. 为每个句子添加开始和结束标记。
  2. 删除特殊字符来清除句子。
  3. 创建一个单词索引和反向单词索引(从单词→id和id→单词映射的字典)。
  4. 将每个句子填充到最大长度。

1.1. 限制数据集的大小以更快地进行实验(可选)

对 > 100,000个句子的完整数据集进行训练需要很长时间。为了更快地训练,我们可以将数据集的大小限制为30,000个句子(当然,翻译质量会随着数据的减少而降低):

 

1.2. 创建 tf.data 数据集

2. 编写编码器和解码器模型

我们将实现一个使用注意力机制的编码器-解码器模型,您可以在TensorFlow 神经机器翻译(seq2seq)教程中阅读。此示例使用更新的API集,实现了seq2seq教程中的注意方程式。下图显示了每个输入单词由注意机制分配权重,然后解码器使用该权重来预测句子中的下一个单词。

attention mechanism

通过编码器模型输入,该模型给出了形状 (batch_size, max_length, hidden_size) 的编码器输出和形状 (batch_size, hidden_size) 的编码器隐藏状态。

下面是实现的方程:

attention equation 0

attention equation 1

我们用的是 Bahdanau attention 。在写出简化形式之前,我们先来定义符号:

定义伪代码:

每个步骤中所有向量的形状都已在代码中的注释中指定:

3. 定义优化器和损失函数

4. Checkpoints检查点(基于对象的保存)

5. 训练

  1. 通过编码器传递输入,编码器返回编码器输出和编码器隐藏状态。
  2. 编码器输出,编码器隐藏状态和解码器输入(它是开始标记)被传递给解码器。
  3. 解码器返回预测和解码器隐藏状态。
  4. 然后将解码器隐藏状态传递回模型,并使用预测来计算损失。
  5. 使用 teacher forcing 决定解码器的下一个输入。
  6. Teacher forcing 是将目标字作为下一个输入传递给解码器的技术。
  7. 最后一步是计算梯度并将其应用于优化器并反向传播。

6. 翻译

注意:编码器输出仅针对一个输入计算一次。

7. 恢复最新的检查点并进行测试

png

 

png

 

png

png

8. 下一步

最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-text-nmt_with_attention.html 英文版本:https://tensorflow.google.cn/beta/tutorials/text/nmt_with_attention 翻译建议PR:https://github.com/mashangxue/tensorflow2-zh/edit/master/r2/tutorials/text/nmt_with_attention.md