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

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介:

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


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] 来完成这项工作,而且后者的能力更强大。


文章转自新智元公众号,原文链接

相关文章
|
传感器 人工智能 物联网
穿戴科技新风尚:智能服装设计与技术全解析
穿戴科技新风尚:智能服装设计与技术全解析
1083 85
|
数据采集 机器学习/深度学习 自然语言处理
NLP助力非结构化文本抽取:实体关系提取实战
本文介绍了一套基于微博热帖的中文非结构化文本分析系统,通过爬虫代理采集数据,结合NLP技术实现实体识别、关系抽取及情感分析。核心技术包括爬虫模块、请求配置、页面采集和中文NLP处理,最终将数据结构化并保存为CSV文件或生成图谱。代码示例从基础正则规则到高级深度学习模型(如BERT-BiLSTM-CRF)逐步演进,适合初学者与进阶用户调试与扩展,展现了中文NLP在实际场景中的应用价值。
850 3
NLP助力非结构化文本抽取:实体关系提取实战
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
735 5
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
865 4
|
机器学习/深度学习 人工智能 自然语言处理
AI技术如何重塑客服系统?解析合力亿捷AI智能客服系统实践案例
本文探讨了人工智能技术在客服系统中的应用,涵盖技术架构、关键技术和优化策略。通过感知层、认知层、决策层和执行层的协同工作,结合自然语言处理、知识库构建和多模态交互技术,合力亿捷客服系统实现了智能化服务。文章还提出了用户体验优化、服务质量提升和系统性能改进的方法,并展望了未来发展方向,强调其在客户服务领域的核心价值与潜力。
885 6
|
监控 负载均衡 安全
静态IP代理与动态IP代理:提升速度与保障隐私的技术解析
本文探讨了静态IP代理和动态IP代理的特性和应用场景。静态IP代理通过高质量服务提供商、网络设置优化、定期更换IP与负载均衡及性能监控提升网络访问速度;动态IP代理则通过隐藏真实IP、增强安全性、绕过封锁和提供独立IP保障用户隐私。结合实际案例与代码示例,展示了两者在不同场景下的优势,帮助用户根据需求选择合适的代理服务以实现高效、安全的网络访问。
531 1
|
机器学习/深度学习 数据采集 自然语言处理
基于Python的情感分析与情绪识别技术深度解析
本文探讨了基于Python的情感分析与情绪识别技术,涵盖基础概念、实现方法及工业应用。文中区分了情感分析与情绪识别的核心差异,阐述了从词典法到深度学习的技术演进,并通过具体代码展示了Transformers架构在细粒度情感分析中的应用,以及多模态情绪识别框架的设计。此外,还介绍了电商评论分析系统的构建与优化策略,包括领域自适应训练和集成学习等方法。未来,随着深度学习和多模态数据的发展,该技术将更加智能与精准。
883 1
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
缓存 算法 Oracle
深度干货 | 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术
数据库高可用(High Availability,HA)是指在系统遇到故障或异常情况时,能够自动快速地恢复并保持服务可用性的能力。如果数据库只有一个实例,该实例所在的服务器一旦发生故障,那就很难在短时间内恢复服务。长时间的服务中断会造成很大的损失,因此数据库高可用一般通过多实例副本冗余实现,如果一个实例发生故障,则可以将业务转移到另一个实例,快速恢复服务。

热门文章

最新文章

推荐镜像

更多
  • DNS