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

简介:

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


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


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

相关文章
|
Web App开发 数据采集 开发者
某查”平台请求头反爬技术解析与应对
某查”平台请求头反爬技术解析与应对
|
传感器 人工智能 物联网
穿戴科技新风尚:智能服装设计与技术全解析
穿戴科技新风尚:智能服装设计与技术全解析
1286 85
|
数据采集 自然语言处理 分布式计算
大数据岗位技能需求挖掘:Python爬虫与NLP技术结合
大数据岗位技能需求挖掘:Python爬虫与NLP技术结合
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
1822 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
人工智能 文字识别 自然语言处理
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
1596 29
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
862 5
|
机器学习/深度学习 人工智能 自然语言处理
AI技术如何重塑客服系统?解析合力亿捷AI智能客服系统实践案例
本文探讨了人工智能技术在客服系统中的应用,涵盖技术架构、关键技术和优化策略。通过感知层、认知层、决策层和执行层的协同工作,结合自然语言处理、知识库构建和多模态交互技术,合力亿捷客服系统实现了智能化服务。文章还提出了用户体验优化、服务质量提升和系统性能改进的方法,并展望了未来发展方向,强调其在客户服务领域的核心价值与潜力。
1087 6
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
1022 4
|
编解码 人工智能 并行计算
基于 Megatron 的多模态大模型训练加速技术解析
Pai-Megatron-Patch 是一款由阿里云人工智能平台PAI 研发的围绕英伟达 Megatron 的大模型训练配套工具,旨在帮助开发者快速上手大模型,打通大模型相关的高效分布式训练、有监督指令微调、下游任务评估等大模型开发链路。本文以 Qwen2-VL 为例,从易用性和训练性能优化两个方面介绍基于 Megatron 构建的 Pai-Megatron-Patch 多模态大模型训练的关键技术

热门文章

最新文章

推荐镜像

更多
  • DNS