传统的技术是语义分析(semantic parsing) [3]。基于人工定义的语法规则,对问句进行句法分析以及语义分析,得到内部语义表示——逻辑表达式。语义分析需要人工定义句法,开发成本较高,可扩展性不好。
近年,基于神经符号处理的问答系统的研究有了很大突破。可以从数据出发,完全端到端地构建问答系统。不需要人工干预,只需要提供足够量的训练数据。问答的准确率也有了一定的提升。传统的语义分析技术被颠覆。下面介绍几个有代表性的工作。
脸书(Facebook)的韦斯顿(Weston)等人提出了记忆网络(memory networks)框架[4],可以用于如下场景的问答:
John is in the playground.
Bob is in the office.
John picked up the football.
Bob went to the kitchen.
Q: where is the football?
A: playground.
记忆网络由神经网络和长期记忆组成。长期记忆是一个矩阵,矩阵的每一个行向量是一个句子的语义表示。阅读时,记忆网络可以把给定的句子转换成内部表示,存储到长期记忆中。问答时,把问句也转换成内部表示,与长期记忆中每行的句子语义表示进行匹配,找到答案,并做回答。
谷歌 DeepMind 的格拉夫(Graves)等发明了可微分神经计算机(differentiable neural computer)模型[5]。该模型由神经网络和外部记忆组成。外部记忆是一个矩阵,可以表示复杂的数据结构。神经网络负责对外部记忆进行读写,它有三种类型,拥有不同的注意力机制,表示三种不同的读写控制,对应哺乳动物中海马体的三种功能。神经网络在数据中进行端到端的学习,学习的目标函数是可微分的函数。可微分神经计算机模型被成功应用到了包括智能问答的多个任务中。
谷歌的尼拉康藤(Neelakantan)等开发了神经编程器(neural programmer)模型[6],可以从关系数据库中寻找答案,自动回答自然语言问题。模型整体是一个循环神经网络。每一步都是基于问句的表示(神经表示)以及前一步的状态表示(神经表示),还包括计算操作的概率分布和列的概率分布,以及选择对数据库表的一个列来执行一个操作(符号表示)。顺序执行这些操作,并找到答案。操作表示对数据库列的逻辑或算数计算,如求和、大小比较。学习时,整体目标函数是可微分的,用梯度下降法训练循环神经网络的参数。
谷歌的 Liang 等开发了神经符号机(neural symbolic machines)模型[7]。神经符号机可以从知识图谱三元组中找到答案,回答像「美国最大的城市是哪个?」这样的问题。模型是序列对序列(sequence-to-sequence)模型,将问题的单词序列转换成命令的序列。命令的序列是 LISP 语言²的程序,执行程序就可以找到答案。神经符号机的最大特点是序列对序列模型表示和使用程序执行的变量,用附加的键-变量记忆(key-variable memory)记录变量的值,其中键是神经表示,变量是符号表示。模型的训练是基于强化学习(策略梯度法)的端到端的学习。
图 4 包含查询器的智能问答系统
华为公司的吕正东等开发了神经查询器(neural enquirer)、符号查询器(symbolic enquirer)和连接查询器(coupled enquirer)三个模型[8,9],用于自然语言的关系数据库查询。例如,可以从奥林匹克运动会的数据库中寻找答案,回答「观众人数最多的奥运会的举办城市的面积有多大?」这样的问题。问答系统包括语言处理模块、短期记忆、长期记忆和查询器,语言处理模块又包括编码器和解码器。图 4 即是这种架构的具体实现。查询器基于短期记忆的问题表示(神经表示)从长期记忆的数据库中(符号表示与神经表示)寻找答案。符号查询器是一个循环神经网络,将问句的表示(神经表示)转换为查询操作(符号表示)的序列,执行操作序列就可以找到答案。利用强化学习,具体的策略梯度法,可以端到端地学习此循环神经网络。神经查询器是一组深度神经网络,将问句的表示(神经表示)多次映射到数据库的一个元素(符号表示),也就是答案,其中一个神经网络表示一次映射的模式。利用深度学习,具体的梯度下降法,可以端到端地学习这些深度神经网络。符号查询器执行效率高,学习效率不高;神经查询器学习效率高,执行效率不高。连接查询器结合了两者的优点。学习时首先训练神经查询器,然后以其结果训练符号查询器,问答时只使用符号查询器。