本文对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