摘要: 随着人工智能和物联网技术的飞速发展和相互融合, 越来越多的设备将会被植入问答 AI, 未来问答将会成为人机交互的重要入口, AI 问答将会无处不在那么 AI 是如何回答你所提出的问题的? 本文就为你揭秘智能问题系统背后的深度学习网络架构设计以及原理
本文内容由演讲嘉宾视频分享以及 PPT 整理而成
本节视频地址: https://yq.aliyun.com/video/play/1381
PDF 下载: https://yq.aliyun.com/download/2484
演讲嘉宾简介
金华兴(花名: 会当), 阿里巴巴算法专家在人工智能领域拥有十几年的经验, 在阿里曾负责搜索排序 / 机器学习 / 大数据基础算法 / 深度学习 / 机器阅读等算法领域主导研发了阿里多语言混合搜索排序算法系统, 融合深度学习 / 迁移学习 / 排序算法, 解决多语种标注数据不足问题, 首次将深度学习应用于搜索业务主导研发了阿里第一代不依赖于一行开源代码的分布式深度学习算法平台 ---ODPS 深度学习算法平台主导研发了阿里第一个基于深度强化学习的资讯推荐算法获得阿里 2010 年集团内部算法大赛冠军借助于阿里平台, 研发的算法影响着全球十多亿人
问答 AI 将会无处不在
本文将为大家分享问答系统背后的原理以及深度学习在问答系统中的应用本文中所谓的问答就是一问一答, 也就是用户提出问题, AI 系统给出回答随着人工智能和物联网技术的飞速发展以及两者之间的相互融合和落地, 越来越多的设备将会被植入问答 AI, 比如随身会携带的耳机手表戒指, 家里的音响台灯等, 汽车和机器人等, 最终 AI 将会无处不在未来, 大家可以随时随地与 AI 进行交互, 提出问题并获得答案, 或者通过 AI 来操控物理世界问答 AI 将会成为一个非常重要的入口, 其地位就相当于现在的搜索引擎
人类如何回答问题
在考虑设计一个 AI 问答系统之前, 不妨先来考虑一下人类是如何回答问题的比如提出一个问题, 现任美国总统是谁? 大家可能瞬间就能够给出答案, 因为像这样的简单问题在大脑里已经有了记忆, 人类可以根据记忆瞬间地给出回答还有一些问题则需要垂直领域的知识, 经过科学的计算和缜密的推理才能给出答案, 比如数学或者物理相关的问题此外, 还有一些问题需要多个领域进行综合分析才能给出回答, 比如在回答肺炎的患者吃什么食物比较合适? 这个问题时, 不仅需要知道医学领域中对于肺炎的病理, 还需要知道食物和营养学等相关知识, 只有结合以上这几个领域的知识才能够给出比较合理的答案而面对更加复杂的问题, 仅凭借人类大脑里面的知识储备可能还不够, 还需要借助外部工具搜集一些数据和资料才能进行回答
AI 问答系统架构
人类回答问题的基本逻辑就是对复杂的问题进行分解, 分而治之 AI 问答系统也借鉴了这样的逻辑, 把整个系统进行分解, 然后将不同的问题放入到不同的垂直问答领域中做回答当然, 还会有一个非常通用的通用问答在通用问答里面主要包含了 3 大部分, 即问题理解, 证据检索以及答案推理 AI 收到问题后, 先对问题进行各种各样的分析处理和理解; 接着基于分析结果从不同的数据源检索出相关的证据, 也就是检索可能包含答案的数据; 然后, 进行综合地阅读理解和推理并且给出答案问答 AI 的各个子系统都可以用深度学习实现
问题分类网络
接下来为大家分享通用问答这条流水线上面的各个子系统背后的深度学习模型首先为大家分享问题分类网络, 问题其实就是一段话, 也就是一个符号序列如果想用神经网络处理一个符号序列, 则首先需要将其 embedding 到向量空间中去, 因为这个符号序列是具有上下文的语义上的相关性的, 所以需要借助 LSTM 来进行处理, 将上下文的语义信息能够融合到词的向量中去因为序列是变长的, 所以为了便于后续的处理需要将整个序列转化成一个固定维度的向量, 转化方法比较多, 简单粗暴的方法就是将序列里面的所有的向量加起来再取平均; 稍微复杂一些的方法则可以考虑使用多个卷积层和 pooling 层, 逐步将长序列转化成为固定长度的向量; semi-self-attention 是简单而高效的方法, 把序列的最后一个状态作为 key, 和序列自己做一个 attention pooling 之后再做一些非线性的变化, 最终使用 Softmax 来输出类别如下图所示的就是一个问题分类网络
问题理解网络
其实上面所提到的问题分类也可以认为是一种问题理解的方式, 因为问题理解本身没有明确的定义, 只要是有助于回答后面问题的处理就都可以加入进来一般而言, 问题理解中的处理大致有这样几个: 问题分词实体识别意图识别以及问题分类其中的意图识别也是分类问题, 而分词和实体识别都是序列标注问题接下来以实体识别为例分享序列标注问题
实体识别的目标是识别问题中哪些词属于实体, 并且属于什么实体, 比如成龙的老婆是谁? 这个问题就包含了一个人名实体, 当然其他的场景下面可能还有地名机构名称以及道路名称等, 这些都是实体实体的标志方法一般是用 BIO 这种符号表示, 其中 B, 也就是 Beginning 代表着实体词的开始; I 代表 Inside 也就说这个词还是在这个实体里面; O 代表 Outside 也就是说这个词已经不属于这个实体了在前面的这个问题中成龙这个词就构成了实体序列标注模型一般会在下面使用深度学习, 上面则使用 CRF 类来做解码
深度学习的网络与前面所提到的问题识别其实是大同小异的, 最下面两层也负责将序列转化成为空间中的序列, 并且尽可能多地将语义的信息包含在其中在问题理解网络模型中间会加一个 Self-attention 层, 虽然 LSTM 能够捕获上下文的一些信息, 但是在实际中, 其对于较长句子的分析能力还是不足的, 并且也不能很好地捕获一些比较低频的问题的语义而 Self-attention 层能够将序列中的任意两个词都进行关联并捕获他们之间语义的关系, 这样就不会受限于长度, 可以在任意远的两个词之间捕获语义的相关性所以其对于语义的处理, 特别是标注都是很有帮助的上图所展现的就是一个问题理解中的深度学习网络
知识图谱
完成了以上的步骤后就需要去考虑检索证据证据的来源比较多, 一个重要的来源就是知识图谱在过去二三十年的互联网化以及信息化进程中, 各行各业都沉淀了很多的知识, 这些知识往往都是以知识图谱的形式保存下来的知识图谱是典型的图结构, 节点就表示实体, 边则表示实体之间的关系如果想要在知识图谱上使用深度学习方法做检索, 首先需要考虑的就是将知识图谱 embedding 到一个向量空间里面去, 再在向量空间中进行语义检索我们面临的第一个问题, 是如何将一个复杂的知识图谱 embedding 到一个向量空间中去? 大家不妨思考一下知识图谱具有什么样的特点, 其所具备的一个非常重要的特点就是它由三元组组成, 而三元组具有非常强烈的约束, 使用符号的形式进行表达是很容易理解的, 比如通过 <阿里, 收购, 优酷土豆> 这个三元组就能了解这样的一种关系但是将知识图谱中的三元组 embedding 到向量空间中去之后, 应该如何去描述这种关系呢? 这是一个非常关键的问题
知识图谱 Embedding 网络
有一句话叫做简单的就是美的, 实体可以变成向量, 而向量之间最简单的代数计算就是相加或者相减, 所以可以考虑让三元组中的前两个向量相加, 等于第三个向量, 通过简单的相加关系来表达知识图谱中符号上的逻辑关系在如下图所示的例子中, 阿里 + 收购 = 优酷土豆
一个知识图谱往往是非常庞大的, 很多时候就会有几百万个实体, 以及几十亿个关系, 所以需要设计一个损失函数来尽量多地满足等式关系, 最终驱动实体和边 embedding 到向量空间的比较好的点上面去因为现在知识图谱里面除了实体的信息之外还可能有其他的信息, 比如对实体以及关系的描述, 这种的描述往往是自然语言的形式, 比如句子段落甚至是一篇文章像这些信息也是可以用序列 embedding 的方式先将其转化成为一个向量, 在向量空间里也强迫其满足等式关系, 将有助于实现整个知识图谱的 embedding, 有助于后续语义上的处理
知识图谱检索网络
当知道了如何 embedding 之后, 接下来需要考虑如何检索知识图谱此时, 知识图谱里面的实体已经变成向量了, 而问题也可以表达成向量, 自然就可以使用问题向量在知识图谱中寻找接近的向量, 这样所找出来的向量很可能与问题是语义相关的, 甚至很有可能就包含了答案但是在实际中这种做法可能会存在问题, 因为问题表达学习与知识图谱的 embedding 是两个独立的任务, 学习出来的向量空间实际上存在于不同的坐标系里面, 在不同的坐标系里面, 即便坐标相同, 所表示的内容也可能是不相同的所以需要将其做进一步的对齐, 只有在坐标对齐之后才能判断两个坐标系中的点是否接近, 从而判断是否是真正地语义上的相近对齐两个坐标系可以用 Attention 机制来实现, 当然需要标注数据, 设计新的 Task 来驱动 Attention 里面的参数收敛, 使得两坐标系内的向量是可比较的如果标注的数据量够多, 也可以对问题向量学习里面的网络参数同时做 fine tune, 并且能够起到更好的效果提升在对齐之后就可以将问题向量丢到知识图谱的向量空间中去了, 将最相关或者最近的实体和关系找出来, 这样就能够获得最优的证据
网页证据检索网络
除了知识图谱是一个重要的证据来源之外, 其实还有一个更大的证据来源在于互联网在互联网中找证据就是一个经典的搜索 Ranking 的问题, 其核心就是衡量问题与网页之间的语义相关性, 找出与问题最为相关的网页用神经网络解决这个问题, 需要把网页文本和问题 embedding 到向量空间中, 还需要设计一个相似性函数, 一般而言可以使用 COS 相似性, 用 COS 值来衡量语义, 经过不断的学习之后使得学习出来的向量的 COS 值能够代表语义上的相近性, 最终就可以用 COS 值来找寻与问题最为相关的网页
从相关证据中推理答案 -- 阅读理解
接下来分享当将证据检索完之后接下来该如何做前面提到知识图谱和网页中的数据形式是具有一定差异的, 还有一些证据会来自其他数据源比如百科论坛以及图片视频等, 而这些不同形态的数据连起来就会非常复杂如何去进行综合阅读和推理是一个非常复杂的问题, 也是强 AI 的问题, 当解决了这个问题也就能跨越到强 AI 的阶段
而到目前为止, 这个问题还没有一个非常好的解决方案, 所以在该问题上的研究和讨论也非常火爆最近也有很多公司和研究机构发布了许多简化的开放的数据集供大家测试和研发算法, 比如 Standford 的 SQuAD 数据集, 这个数据集里面有 500 多个文章以及 10 万多个问题, 而去年百度谷歌以及微软也都发布了一些数据集, 这些数据集也更大并且更加复杂, 像百度和微软所发布的数据集中段落的数目有 100 多万, 问题也有 20 多万, 并且这些数据集也更加接近于真实的场景
阅读理解网络 --- 找出答案片段
当面对复杂的阅读理解问题时, 该如何设计深度学习模型来解决这个问题呢? 其实这里还不能称之为解决只能是探索性解决, 因为现在还没有一个特别好的解决方案这里为大家分享一个目前在 SQuAD 数据集上表现比较好的网络结构
在这个网络结构里输入是一个问题和多个段落, 目标是在多个段落里面找出答案片段, 当然也可能有多个答案片段自然也需要先对这些问题和段落进行 embedding, 在此基础之上再进行进一步地处理中间层的处理方式与前面所提到的问题分类以及序列标注都有所不同, 在中间层的 PQ attention 是将段落和问题进行关联, 让段落的表达能够蕴含问题的语义, 具体的做法就是让段落中的每一个词都单独地对整个问题进行 attention, 这样做完之后就能够使得每个段落中的每个词都能够包含问题, 也就是一定程度上将问题是什么以及段落中的词与问题的关联强度如何展现出来因为段落往往比较长, 会有很多杂音, 所以上面再加一个 Gate 层, 对无关的词起到过滤抑制的作用在此之上再加一层 Fusion 进行聚合, 其功能就是将 Gate 层锐化的信息再做一个平滑, 同时把前后的信息在此进行融合, 使其能够捕获答案与段落关联的更多信息在最上面是 Pointer 层, 这里就是找答案片段的层, 在其下的那些层里面是将不同的段落单独处理的, 而在 Pointer 层中则是将所有的段落串起来作为一个段落看待, 在里面寻找最佳答案; Pointer 层是一个 RNN, 初始状态是用问题向量, 输出是两个 Softmax 层, 一个表示答案的开始, 另一个表示答案的结束
答案生成网络 --- 自然语句生成
当将段落中的答案找出来之后, 还需要形成一个通顺的语句并反馈给用户, 而有时候答案片段可能有多个, 更需要将其串接起来形成自然语句生成自然语句是一个序列的 generation 问题, 与机器翻译或者图像 caption 问题是类似的 网络结构包含两大部分: encoder 和 decoder, 在 Decoder 部分, 可以认为和上述问题都是一样的, 但是在 Encoder 部分就会有很大的区别, 因为其数据来源和结构完全不同在机器翻译里面, Encoder 所处理的就是一个序列, 而在阅读理解里面, Encoder 所处理的数据就既有问题也有段落, 还会包含了已经找出来的答案信息
在 Encoder 中最下面的两层 Embedding 和 Encode 中可以完全共享寻找答案网络最下面的两层参数, 这里的 Start 和 End 就是阅读理解中的 Poiner 层输出的结果, 将其构成二值化序列放进来当然除此之外, 如果还有其他的特征也可以放入到 Encoder 里面来 Encoder 的信息会输出给 Decoder,Decoder 中有一个非常关键的层就是 Attention,Attention 能够准确地从问题或者段落里面找一些关键词出来, 使得必要的词能够被输出到最终的答案语句中去 Decoder 还会生成一些非关键词, 起到顺滑和链接的作用
总结而言, 本文为大家分享了 AI 问答系统的架构以及通用问答各个环节的深度学习网络结构以及其背后原理
本文由云栖志愿小组贾子甲整理, 编辑百见
来源: https://yq.aliyun.com/articles/574089