【邓侃】DeepMind 机器理解文本 NLP 技术复现与解析

【新智元导读】 本文对 DeepMind 的让计算机读懂文本、回答问题的深度学习技术进行复现与解析。文章对DeepMind的整个技术思路进行了清晰的重构:从问题出发,到语言模型、再到基于LSTM的实现方式、LSTM的缺点及解决方案(Attention)、语料训练以及记忆网络等。在作者邓侃的解读下,整个技术变得清晰易懂,技术难点也得以一一呈现,这对读者了解基于深度学习方法的自然语言理解技术有很大的启发作用。

一. 要解决什么问题,难度在哪里?

Google DeepMind 团队在 NIPS 2015 发表了一篇题为 “Teaching Machines to Read and Comprehend” 的论文 [1]。这篇论文想解决的问题是:如何让计算机回答提问。具体来说,输入一篇文章(d)和一句提问(q),输出文章中的一个词组,作为回答(a)。

譬如输入以下这段文章,

The BBC producer allegedly struck by Jeremy Clarkson will not press charges against the “Top Gear” host, his lawyer said Friday. Clarkson, who hosted one of the most-watched television shows in the world, was dropped by the BBC Wednesday after an internal investigation by the British broad-caster found he had subjected producer Oisin Tymon “to an unprovoked physical and verbal attack” .

并且输入一句提问,

Producer X will not press charges against Jeremy Clarkson

期望输出的答案是,

X = Oisin Tymon

要正确理解文章,并推理答案,有若干难度。

在上述例子中的难点包括:

1. 同义词:struck、attack 是同义词。

2. 多态指称:Jeremy Clarkson、“Top Gear” host,单纯从字面语义来理解,两者没有关联。但是在上下文中,都指称同一个人。

3. 上下文关联,譬如 his、he 究竟指代谁?

4. 句型复杂,从句很多。

5. 整个文章中,掺杂着很多与提问无关的内容。

6. 最难的是语义转承。文中提到 “Jeremy Clarkson 打了制片人 Oisin Tymon”,又提到 “被打的制片人不准备起诉”,所以,后一句中 “被打的制片人” 等于 “Oisin Tymon”。

二. 语言模型

解决方案有两个基本思路:如果没有训练语料,就分析句法结构。根据每个句子的主谓宾,及其句子与句子之间的语义关联,找到答案。如果有大量语料,就先用这些语料先训练模型,然后用模型分析文章中每个词及上下文,从而识别出目标词组。

这篇论文用的是后一种办法,针对文章中每一个词,估算这个词是答案的概率,即,P( w(t) = a | [d, q] ) ,a 是答案,d 是文章,q 是提问,w(t) 是文中第 t 个词。

众所周知,神经网络(NN)可以模拟任何函数,Y = f( X ) = NN( X ),所以,P( w(t) = a | [d, q] ) 也可以用神经网络来模拟 。

具体来说,把文章 d 和提问 q 当成神经网络的输入 X,把神经网络 NN 当成分类器(Classifier),神经网络的输出是一个向量 Y,Y 的维度是英语里所有词汇的总数。Y(t) 是词汇表中第 t 个词,是答案 a 的概率。

这个办法有两个问题:

1. 神经网络的输入 X,必须是定长的向量。但是在我们的问题里,X = [d, q],文章 d 和提问 q 不定长。

2. 神经网络的输出是一个向量 Y,Y 的维度是英语里所有词汇的总数,数量巨大,导致神经网络的规模巨大,参数众多,导致需要非常多的训练语料才能优化这些参数。

解决这两个问题的思路分别是:

1. 用循环神经网络 RNN,尤其是它的变种 LSTM,来取代常规的神经网络(Feed Forward NN)。 把整篇文章和整句提问的每一个词,先转换成定长的词向量,然后依次输入 RNN/LSTM。

2. 把文章 d 和提问 q 中所有词的词向量,依次输入 RNN/LSTM 以后,这时 RNN/LSTM 的输出 Y,预测着紧随其后下一个词的词向量。下一个词的词向量,其实就是答案 a 的词向量的预测值。

我们把答案 a 的词向量的预测值,与文章中每一个词的词向量比对,找到距离最短,也就是语义最接近的那个词,那个词极有可能就是我们寻找的答案。

我们不需要计算英语里每一个词是答案的概率,只需要预测答案 a 的词向量。通过这个办法,我们可以保持 RNN/LSTM 的规模不大,参数不多。

三. 基于 LSTM 的实现方式

沿着前文的思路,我们接下去讨论如何具体实现。

假如我们有足够多的训练语料,就可以预先用 [2] 的方法,把所有词都逐个转换为词向量。词向量蕴含着词的特征。同义词的特征相近,所以同义词的词向量,相互距离也比较接近。两个词向量之间的距离,可以用余弦距离来计算。

把文章中所有词,都逐个转换为词向量,文章就被转变成 n * f 的矩阵 X。矩阵的行数 n,是文章包含的所有词的数量,矩阵的列数 f 是每个词向量的维度。f 是多少,没有定规,根据经验设定。

X(t) 是指该矩阵的第 t 行,也就是文中第 t 个词的词向量。我们的任务,是根据 X(1) ... X(t) ,来预测 X^(t+1)。

不妨先构造一个神经网络 LSTM,它由若干常规神经网络构成(FeedForward NN)。先做一个预测神经网络 PredictNN,输入有两个向量,X(t) 和 Context(t-1)。Context(t-1) 是前文语义的记忆,而前文是指 X(1) ... X(t-1)。输出是 H(t),它是下一个词向量的预测值 X^(t+1)。

Context 的内容,由另外一个神经网络 ContextNN 来决定。ContextNN 的输入有三个向量:

1. 当前词的词向量 X(t),

2. PredictNN 在 (t-1) 时刻的输出 H(t-1),也就是上一个时刻,PredictNN 预测的 X^(t)。如果 PredictNN 预测得很准,那么 H(t-1) = X^(t) = X(t)。

3. 在上一个时刻,Context 的内容 Context(t-1)。

如果 PredictNN 预测得很准,即 H(t-1) = X^(t) = X(t),那么说明 X(t) 没有新鲜的内容。在这种情况下,不需要在 Context 里添加 X(t) 的内容。反之,H(t-1) 与 X(t) 的差距越大,Context 越需要添加 X(t) 的内容,同时淡忘 Context(t-1) 的内容。ContextNN 的输出是更新后的 Context 的内容,Context(t)。

这两个神经网络 PredictNN 和 ContextNN,有若干参数需要设置。如果我们有足够的训练语料,就可以通过常规的机器学习算法,譬如 Stochastic Gradient Descent 来找到这些参数的最优值。

LSTM 可以用两个神经模型来实现,也可以用其它方式来实现。细节或许不同,但是大致原理相似。

四. LSTM 的缺陷

LSTM 的缺陷在于,记住了后文,忘记了前文。论文 [1] 用 Attention 的办法 [3],来弥补 LSTM 的缺陷。建议先读 [3] 再读 [1],这样更容易理解 [1]。

Attention 的办法是,在 Context 中,不遗漏任何 X(t),而是把 Context 处理成 X(t) 的加权和,X(t) 的权重,取决于两个因子,

1. X(t) 的上下文,

2. X(t) 的上下文与答案 a 的相关度。

沿着这个思路,论文提议了两个语义模型:作者把一个模型称为 Attentive Reader,把另一个模型称为 Impatient Reader。Impatient Reader 是 Attentive Reader 的变种,大同小异。我们只介绍 Attentive Reader。

Attentive Reader 把文章 d,转换为矩阵 X。X(t) 是该矩阵的第 t 行,也就是文中第 t 个词的词向量。

1. Attentive Reader 用 LSTM,依次输入从文章的第 1 个词 X(1),到第 t 个词 X(t),得到输出 Hf(t)。

Hf(t) 概况了 X(1) .. X(t) 的重要内容,不妨称为上文语义向量。

2. 接着计算从文章中最后一个词,第 n 个词,反向到第 t 个词的下文语义向量,Hb(t)。

3. 然后把上文和下文这两个语义向量拼接在一起,就得到完整的上下文语义向量 Yd(t) = Hf(t) || Hb(t)。

如果词向量的维度是 f,那么上下文语义向量的维度是 2f。

同理,Attentive Reader 从提问语句的第一个词的词向量 Q(1) 到最后一个词的词向量 Q(m),做一个词向量。又从提问语句的最后一个词的词向量 Q(m),到第一个词的词向量 Q(1),反向再做一个词向量。把正向和反向两个词向量,拼接在一起,就得到提问语义向量 U,U 的维度也是 2f。

有了文章第 t 个词的上下文语义向量 Yd(t) 和提问语义向量 U,就可以计算文章的第 t 个词与提问 a 之间的相关度。论文 [1] 提议,用一个常规的神经网络,来计算 Yd(t) 与 U 之间的相关度。为什么不能用余弦距离,来计算 Yd(t) 与 U 之间的相关度呢?因为 Yd(t) 是 U 的答案,而不等同于 U 本身。

有了上下文语义向量 Yd(t),以及 Yd(t) 与 U 之间的相关度,我们就可以计算 Context(t)。

有了 X(t) 和 Context(t-1),我们就可以用 PredictNN 来预测 X^(t+1)。

有了 X^(t+1),我们就可以预测排在 X(1), ... X(n), Q(1),... Q(m) 之后的下一个词向量,这个词向量,就是答案 a 的词向量。

有了预测的答案 a 的词向量,我们就可以给文章中的每一个词,计算它与预测的答案 a 的词向量之间的余弦距离。距离最短的词,就是我们寻找的提问的答案。

Attentive Reader 使用了多个神经网络,不仅计算上下文语义向量时,所用的 LSTM 需要两个或者更多神经网络,而且计算 Yd(t) 与 U 之间的相关度也需要一个神经网络,而且预测下一个词的词向量,也需要一个神经网络。

我们需要有足够多的训练语料,才能训练这些神经网络。“Teaching Machines to Read and Comprehend” 这篇论文,不仅介绍了如何用 attention 弥补 LSTM 缺陷,而且也讨论了如何自动获得足够多的训练语料。

五. 训练语料

论文中提议的方法,有赖于用大量语料,训练 LSTM 去估算文章中每一个词的上下文语义向量,而且也需要大量语料去优化每一个词与提问的相关度。

每一个训练语料都包含三部分,文章 d、提问 q、答案 a。

论文提议,从新闻网站中,收集整理新闻稿,作为训练语料中的文章 d,把新闻稿附设的文章摘要(Story highlights),转换为训练语料中的提问 q 和答案 a。

譬如 [4] 有这么一篇新闻,

A U.S. Navy SEAL was killed in a parachute accident in Perris, California, near Riverside, a U.S. Navy official told CNN on Wednesday. He was identified Thursday as Special Warfare Operator 3rd Class Jason Kortz, 29, of Highlands Ranch, Colorado. "Jason distinguished himself consistently throughout his career. He was the epitome of the quiet professional in all facets of his life, and he leaves an inspiring legacy of natural tenacity and focused commitment for posterity," the Navy said in a news release. Kortz joined the SEALs in September after enlisting in the Navy two years earlier. He was married, the Navy said. Initial indications are the parachute failed to open during a jump as part of a training exercise. Kortz was part of a West Coast-based Navy SEAL team.

该新闻附设两条文章摘要,Store highlights

* Navy identifies deceased sailor as Jason Kortz, who leaves behind a wife

* Statement says he was "epitome of a quiet professional"

论文提议把这两条文章摘要转换为提问 q 和答案 a,譬如,

提问 q: Navy identifies deceased sailor as X,回答 a: X = Jason Kortz

提问 q: Statement says X was epitome of a quiet professional,回答 a: X = Jason Kortz

六. Memory Networks

如果文章不长,就把存放在内存里。如果文章很长,就需要把它存放在硬盘里,或者硬盘和内存混用。

论文[1] 中用 LSTM 给文章的每一个词,依次打分,分值是该词与提问的相关度。因为是依次打分,所以 LSTM 与内存和硬盘的交互方式很简单。

但是如果需要做更复杂的处理,譬如把 “Top Gear host” 替换成 “Jeremy Clarkson”,把 “被打的制片人” 替换成 “Oisin Tymon”,LSTM 与内存和硬盘做交互时,需要更复杂的寻址机制。

论文提议用 Memory Network [5] 来实现 LSTM 与内存和硬盘的交互。其实也可以用 Differentiable Neural Computer [6] 来完成这项工作,而且后者的能力更强大。

七. 参考文献 ( 附下载链接)

[1] Teaching Machines to Read and Comprehend

https://arxiv.org/abs/1506.03340

[2] A Neural Probabilistic Language Model

https://www.researchgate.net/publication/2413241_A_Neural_Probabilistic_Language_Model

[3] Neural Machine Translation by Jointly Learning to Align and Translate

https://arxiv.org/abs/1409.0473

[4] US Navy SEAL Jason Kortz dies in parachute accident

http://edition.cnn.com/2015/03/18/politics/us-navy-seal-dies-in-training-accident/

[5] Memory Networks

https://arxiv.org/abs/1410.3916

[6] Hybrid computing using a neural network with dynamic external memory

http://www.nature.com/articles/nature20101.epdf?author_access_token=ImTXBI8aWbYxYQ51Plys8NRgN0jAjWel9jnR3ZoTv0MggmpDmwljGswxVdeocYSurJ3hxupzWuRNeGvvXnoO8o4jTJcnAyhGuZzXJ1GEaD-Z7E6X_a9R-xqJ9TfJWBqz

原文发布于微信公众号 - 新智元(AI_era)

原文发表时间:2016-12-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

使用深度学习来理解道路场景

语义分割是深度学习的方法之一,通过语义分割,我们可以对图片中的每一个像素赋予含义,即将像素划分到一个预先设定的类中。从上边的 GIF 图可以看出,我们在语义切分...

13920
来自专栏AI科技大本营的专栏

硬货 | 一文了解深度学习在NLP中的最佳实践经验和技巧

编译 | AI科技大本营(rgznai100) 参与 | JeyZhang,鸽子 在NLP社区中曾流行着这样一个玩笑,说是一个带注意力机制的LSTM模型在任何的...

32440
来自专栏算法channel

机器学习|kaggle数据挖掘和求解的基本步骤

01 — 数据探索(Exploratory Data Analysis) 对数据进行探索性的分析,通常会用 pandas 来载入数据,并做一些简单的可视化来理解...

31460
来自专栏AI科技评论

开发 | 为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题。

AI科技评论按:本文作者Professor ho,原文载于其知乎主页,雷锋网获其授权发布。 传统的“提拉米苏”式卷积神经网络模型,都以层叠卷积层的方式提高网络深...

47450
来自专栏机器人网

【深度学习】详细的神经网络架构图

将这些架构绘制成节点图的一个问题:它并没有真正展示这些架构的工作方式。比如说,变自编码器(VAE)可能看起来和自编码器(AE)一样,但其训练过程却相当不同。训练...

38160
来自专栏ATYUN订阅号

【深度学习】AI如何用文字表达情绪——使用人工神经网络进行带情感识别的文本分类

本文将带你尝试,不使用文本复杂的矩阵转换将文本分类。本文是对3种方法的综合描述和比较,这些方法被用来对下面这些数据的文本进行分类。完整的代码可以在下面链接找到。...

55930
来自专栏机器学习和数学

[机智的机器在学习] 常用网络层总结之CNN篇

卷积神经网络(CNN)由输入(Inputs)、卷积层(Convolutions layer)、激活层(Activation)、池化层(Pooling layer...

39350
来自专栏奇点大数据

生成对抗网络(GAN)的直观介绍

原文来源:freeCodeCamp 作者:Thalles Silva 让我们假设这样一种情景:你的邻居正在举办一场非常酷的聚会,你非常想去参加。但有要参加聚会...

41760
来自专栏张俊红

最懒惰的算法—KNN

总第77篇 本篇介绍机器学习众多算法里面最基础也是最“懒惰”的算法——KNN(k-nearest neighbor)。你知道为什么是最懒的吗? 01|算法简介:...

32550
来自专栏大数据挖掘DT机器学习

谱聚类、Chameleon聚类、PCCA、SOM、Affinity Propagation

层次聚类和K-means聚类,可以说是聚类算法里面最基本的两种方法(wiki的cluster analysis页面都把它们排前两位)。这次要探讨的,则是两个相...

43330

扫码关注云+社区

领取腾讯云代金券