使用注意力机制、图像字幕制作及文本生成等技术训练机器翻译的完整代码示例
文 / 开发者计划工程师实习生 Yash Katariya
我一直觉得生成和序列模型很令人着迷,这两个模型提出的问题与我们刚开始研究机器学习时通常会遇到的问题有所不同。刚开始研究 ML 时,我(与很多人一样)学习了分类和回归。这些概念有助于我们提出和回答与下方类似的问题:
这张图片上的动物是猫还是狗? (分类)
明天下雨的概率是多少? (回归)
分类和回归是非常有用的技巧,很有必要掌握,而且将这些领域应用于解决实用的现实问题时,几乎没有任何限制。但是,我们可能会提出其他类型的问题,这些问题让人感觉大不相同。
我们能否生成诗歌? (文本生成)
我们能否生成猫的照片? (GAN)
我们能否将某个句子从一种语言翻译成另一种语言? (NMT)
我们能否生成图像字幕? (图像字幕制作)
在暑期实习期间,我使用 TensorFlow 的两个最新 API(tf.keras 和 Eager Execution)想出这些问题的示例,并在下文中分享了全部相关内容。希望您认为这些内容实用和有趣!
Eager Execution 是一个由运行定义的命令式接口。一旦用户从 Python 中调用此接口,便可立即执行运算。这让 TensorFlow 的入门变得更加简单,并让研发变得更加直观。
tf.keras 是使用类似乐高积木的构建基块定义模型的高级 API。我使用模型子类化来执行这些示例,这样就可以通过对 tf.keras 模型进行子类化及定义您自己的正向传递来构建完全可自定义的模型。在启用 Eager Execution 时,模型子类化特别有用,因为用户可以命令式地写入正向传递。
如果您不熟悉这些 API,可以在 tensorflow.org/tutorials 上探索笔记系列,以了解相关详情,该网站包含最近更新的示例。
下方每个都是端到端示例,并且采用类似的模式:
自动下载训练数据
对训练数据进行预处理,并创建 tf.data 数据集,以便在我们的输入管道中使用
使用 tf.keras 模型子类化 API 来定义模型
使用 Eager Execution 来训练模型
说明如何使用经过训练的模型
示例 #1:文本生成
我们的第一个示例是文本生成。在此示例中,我们使用 RNN 来生成风格与莎士比亚作品类似的文本。您可以通过上面提供的链接在 Colaboratory 上运行代码(或者您也可以从 GitHub 上将其作为 Jupyter 笔记下载)。此笔记对相关代码进行了详细说明。
注:示例链接
https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/text_generation.ipynb
由于莎士比亚的作品众多,此示例学会生成的文本只是听起来和看起来与其风格类似:
在通过莎士比亚的作品集进行 30 次完整训练后,使用笔记生成的示例文本
虽然大部分句子都没有意义(这是当然,因为这种简单模型还没有学会语言的含义),但令人印象深刻的是,大多数单词都*是*有效的,而且所生成的戏剧结构看起来与原文结构类似。(这是一个基于字符的模型,在我们对其进行训练的短时间内,它成功地从头开始学会了这两件事)。如果您愿意,可以通过改变单行代码来改变数据集。
如要了解更多关于 RNN 的知识,最好的方法是阅读 Andrej Karpathy 的精彩文章《递归神经网络不可思议的有效性》(The Unreasonable Effectiveness of Recurrent Neural Networks)。如果您想进一步了解如何通过 Keras 或 tf.keras 执行 RNN,我们推荐您阅读由 Francois Chollet 编写的相关笔记。
注:笔记链接
https://github.com/fchollet/deep-learning-with-python-notebooks
示例 #2:DCGAN
在此示例中,我们使用 DCGAN 来生成手写体数字。生成对抗网络 (GAN) 由一个生成器和一个判别器组成。生成器的工作是创建令人信服的图像,以此瞒过判别器。判别器的工作是将真实图像与虚假图像(由生成器创建)区分开来。下面您看到的输出是使用这篇论文中所述的架构和超参数,对生成器和判别器进行 150 次完整训练后生成的数字。
注:示例链接
https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/dcgan.ipynb
在 150 次完整训练中,每 10 次训练便会生成 GIF 图像 您可以在笔记中寻找代码,并像这样创建 GIF
示例 #3:使用注意力机制训练神经机器翻译
此示例是训练模型将西班牙语句子翻译成英语句子。对模型进行训练之后,您可以输入西班牙语句子,例如 “¿todavia estan en casa?”,然后系统会返回英语译文: “are you still at home?”(你还在家吗?)
注:示例链接
https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/nmt_with_attention/nmt_with_attention.ipynb
下面您看到的图像就是注意力绘图。该图显示在翻译时,所输入句子的哪些部分吸引了模型的注意力。例如,当此模型翻译单词 “cold”时,它注意到 “mucho”、“frio” 和 “aqui”。我们使用 tf.keras 和 Eager Execution 从头开始执行 Bahdanau 注意力机制,这一点在笔记中进行了详细说明。您也可以使用这种实现方式作为执行自定义模型的基础。
上述译文的注意力绘图
示例 #4:使用注意力机制进行图像字幕制作
在此示例中,我们训练模型来预测图像的字幕。我们也生成了注意力绘图,该图显示在生成字幕时模型重点关注的图像部分。例如,在预测单词 “surfboard”时,模型重点关注的是图像中冲浪板附近的部分。我们使用 MS-COCO 数据集的一个子集来训练此模型,该子集会通过笔记自动下载。
注:示例链接
https://colab.research.google.com/github/tensorflow/tensorflow/blob/master/tensorflow/contrib/eager/python/examples/generative_examples/image_captioning_with_attention.ipynb
所预测的图像字幕
以上图像中每个单词的注意力绘图
后续步骤
如需了解 tf.keras 和 Eager 的详细信息,请持续关注 tensorflow.org/tutorials 以获取更新内容,并定期查看本博客及 TensorFlow 的 twitter 动态消息。感谢阅读!
致谢
非常感谢 Josh Gordon、Mark Daoust、Alexandre Passos、Asim Shankar、Billy Lamberta、Daniel ‘Wolff’ Dobson 及 Francois Chollet 对本文的贡献与帮助!
TensorFlow 社区活动:
· 快来投票吧 — 程序员工作环境大 Battle!(火热进行中...)
☟ 点击 “阅读原文”
参加 TensorFlow 社区活动