相比于语音和图像,自然语言是一个有「更多需求」和「更少标准答案」的领域。扎根自然语言的公司通常也不是从技术和方法出发,而是选择一个具体的需求,然后用所有可能的方法解决它。追一就是这样的一家公司,它瞄准的是「对话机器人」这个领域,把问题分类、分解、逐个建立准确高效的机器人,再有序集成起来。三月,机器之心有幸在深圳追一科技总部对首席科学家杨振宇进行了采访,我们仔细聊了聊「对话机器人是怎样炼成的」,以及在他眼里,深度学习与自然语言最好的结合方式是怎样的。
对话机器人需要解决的问题是如何分类的?
对话机器人是一个相对比较复杂的系统,由许多个模块组成。其中最核心的模块就是语义理解,理解用户想要表达什么意思。而在利用深度学习处理商业对话机器人的语义理解问题方面,追一是国内最早的一家。
根据服务类型,对话机器人可以分为 FAQ 咨询、资料查询、任务型和闲聊四种,涉及的自然语言处理问题也各不相同。
对于 FAQ 咨询来说,模块的输出对应知识库里的一个知识点。解决问答就像解决一个大型分类问题,机器人要将用户的需求对应到知识库里的某一个答案。
知识库里的知识点数量少则几百个,多则上万个。而根据知识库大小不同,适用的模型结构也会有所不同。例如,银行类客户通常有多个复杂的业务线,知识库规模也是数以万计,直接对几万个知识点进行分类是难以取得高准确率的,因此,机器人会采用分层处理的方法,先判定问题与哪一个大领域相关,再进行详细的知识点分类。
资料查询类对话需要从客户的输入里判定两件事:意图和实体。比如「A 公司的市盈率是多少?」这个问句里,就包含了意图「市盈率」和实体「A 公司」。成功获得这两个信息后,机器人会去一个结构化的数据库里做查询。得到答案后,按照一个预定义的格式化模板填充后返回给客户。
资料查询的一个难点是,用户在连续发问时,不会每次都重复自己的意图和实体,比如用户会在询问「A 公司的市盈率是多少?」之后,追问说,「那 B 公司的呢?」或者「那市净率呢?」。这时,系统就需要通过上下文管理,对意图和实体这些要素进行继承或切换。用户的提问到来之后,首先进行判断:用户在这一句中是否提供了某一要素?如果没有,则尝试从前文追溯继承;如果有,再判断用户是否进行了意图(实体)转移,如果是,则需要进行对应更新。
另一个难点是,用户可能不会直接说出实体全称,无法进行精准的、基于规则的匹配。因此,机器人需要结合特定用户的历史记录和用户群体的统计信息,通过学习的方法计算词与词之间转移的概率,然后进行模糊匹配。
任务型对话是当下比较流行的一种交互形式,机器人试图以对话的形式来执行订机票、查账单、买理财等任务。任务型和资料查询类对话有相似之处:它们同样要从用户处获得两类信息:意图和「元素」。区别在于,确定意图后,任务型机器人需要主导对话:它要理清进行特定任务所必要的元素有哪些,并以对话的形式确保用户提供了所有元素。以订机票举例,用户说「帮我订明天北京到上海的机票」,那么机器人在明确了任务是「订机票」之后,就要理清,用户已经提供的元素有时间、出发地、到达地,尚未提供的元素有舱位偏好、时间偏好、特定机场偏好等。只有获得了全部所需元素,机器人才能「执行任务」。
最后一类是闲聊,与陪护机器人的闲聊功能不同,穿插在查询、咨询问答或任务交互之间的闲聊,需要结合上下文一起识别。有时,一句话单独看是闲聊的意图,但结合上下文一起看则属于查询、咨询问答或任务交互的一部分。这种场景下的闲聊不仅要识别准,而且要保证上下文对话的流畅性,也非常有挑战。
一个对话机器人系统通常由哪些模块组成?
如前所述,系统是由 FAQ 咨询、资料查询、任务型和闲聊等不同类型的机器人组成的。除此之外,还有一个中控模块,是系统的管理控制中枢。
中控负责依据用户当前问句和历史会话记录,初步判断当前问题应该由哪个机器人来回答,然后下发给一个或多个下游机器人。下游机器人处理后,将答案以及对应的置信度返回给中控,中控根据下游返回的信息进行决策后,将最合适的响应返回给用户。
对话机器人上线后效果如何持续运营优化?
对话机器人可能发生的误判有两种不同形式。
一种是「系统知道自己可能犯错」:某一请求虽然分配给了特定机器人,但是机器人给出的最佳回答的置信度仍然很低,换言之,该回答能够满足用户请求的可能性很小。此时,中控会进行重新判断:其他机器人是否有置信度更高的回答?如果仍然无法找到置信度足够高的答案,系统会启动拒绝识别机制,即,系统判断自己无法回答这一问题,返回给用户一个通用话术,如「十分抱歉,您的问题我暂时回答不了」,然后记录下问题,定期推送给机器人运营人员通过数据标注、知识库扩充等手段进行迭代优化。
另一种则是「系统很自信,但还是回答错了」。这类错误要通过分析用户的反馈来发现,比如用户选择点「踩」或者继续提问,都意味着他们的需求可能没有得到满足。系统会结合分析结果把这种疑似错误的回答挑出来,形成一个叫做「质检」的任务,交给客户的质检人员判断并标注,补充进训练集进行迭代优化。与此同时,客户也拥有能够进行即时调整的人工干预工具:如果客户需要立刻对某个错误答案进行调整时,可以利用这个工具找到导致错误答案的影响因素,通过对这些影响因素的调整来达到即时生效的干预效果。
对于机器人的优化来说,极其重要的一点是在系统层面有完整的反馈学习机制,能够让机器人收集可能的错误情景,以及特定场景下的正确回答信号,然后利用这些数据和信号建立正反馈机制。
总体来说,通过初始化教育和持续运营优化,机器人一般能够达到综合准确率 95% 的效果,这样就会获得比较好的对话体验了。
自然语言处理的业界与学界:鸿沟与启发
对于学界而言,最好的研究是用新方法解决新问题,其次是用新方法解决老问题,最次是用老方法解决老问题。而工业界的衡量标准则截然不同,工业界的出发点是以需求为核心,无论什么方法,能落地提供极致体验的就是好方法。
举个例子,业界的系统是需要给客户提供快速干预工具的:一个无法调整的、干预不了的系统是不合格的。出于对企业形象的重视,客户需要能够监控机器的效果、需要在发现问题之后能够实时干预、需要定期检查用户反馈,让反馈数据作为新的监督信号进一步优化模型。业界搭建的优秀系统要有自适应的闭环和流动性,这是学界很少会考虑的事情。
另外,业界也需要更多地考虑系统上线时的资源限制问题。比如在自然语言领域里一个典型的测试环境,斯坦福的 SQuAD 数据集上,现在学界里效果最好的做法是把数十个不同的模型集成在一起,然而这种做法是很难在工业界大规模应用的。工业界要考虑成本、客户在云端的算力、用户从提问到得到反馈的时间等种种限制,集成少数几个模型也许是可行的,但是集成几十个高代价的模型是不切实际的。
当然,业界也在持续关注学界的新方法,希望得到方法论上的启示。
例如,深度强化学习的飞速发展也会让我们关注:能否依靠数据驱动,端到端地训练具有工业应用价值的任务型机器人?能否在有了足够多数据之后,把对话信息看做状态,用深度强化学习的方法学习一个对话策略出来呢?
另外,阅读理解领域的发展也让我们看到了不是基于「知识库」而是基于「文档库」进行回答的可能性。例如,一个特定问题的答案可能在某个文档里,如何构建一个深度学习系统,根据某一问题,定位到特定的文档,再从文档中把信息提炼出来用以回答这个问题?
元启发式优化算法是否能与深度学习模型结合?
图片来自:http://blog.otoro.net/2015/01/27/neuroevolution-algorithms/
我个人的研究背景是计算智能(Computational Intelligence),在 2015 年之前的近 10 年里,主要关注如何应用计算智能中的元启发式优化算法求解大规模复杂优化问题。这是一类基础性的研究难题,长期受到关注,比如我大约 10 年前的一个关于演化优化算法的工作,到现在已经被引用 500 多次了,而且现在还在逐渐增加,偶尔还会收到同行提出算法代码需求的邮件。随着算力的持续提升,也许元启发式算法在不久的将来会成为人工智能领域新的宠儿,我个人也非常关注它与深度学习结合的可能。
元启发式算法的最大的优点在于不要求目标函数可导,通用性强。现在,为了求解方便,建模时往往会对实际应用的真实目标做一些简化,使得该目标函数可导,以便可以用现成的梯度下降算法求解。然而这往往不是最优方案:一方面建模的简化一般会引入求解效果上限的损失;另一方面梯度下降算法不能保证获得全局最优解,往往只会收敛到一个极值。
元启发式优化算法是一个启发式框架,一般是设计一些通用的、对问题的依赖没有那么强的启发式策略,使算法更容易收敛到全局最优解。元启发式优化算法的缺点在于算法对计算能力的要求比较高。这主要是因为梯度下降算法有明确方向,只要朝着这一个方向下降就可以了,而元启发式算法,如其中的「主流分支演化算法」,用的方法则是试错法(trial-and-error),需要在空间里进行大量的采样、评估,再决策接下来去何处继续采样更有获得全局最优解的潜力。这个过程是非常消耗算力的。
现在,学界的关注重点是能否用局部优化的思想减少采样点的数量,以及能否提高采样、评估的并行化执行能力。
此外,元启发式算法还有一个梯度下降无论如何也做不到的优势,就是有希望进行结构的优化。如今神经网络的结构是全部由人来设计的,未必或者极有可能不是最优的。利用元启发式算法能够让机器在卷积层、循环层、全连接层等不同开放组合结构构成的空间中进行搜索,组装出一个针对特定问题效果最好的结构。这个方向一般叫做 Neuroevolution,正逐渐引起越来越多的学界和业界的关注。
应用深度学习带来了哪些不同?
在中控的排序模型里,深度学习模型能够提供含有大量信息的强特征,让体量更小、更简单的模型就能获得同等,甚至更优的效果。
在前深度学习时代,传统的搜索推荐经常需要上千万、上亿的特征,这是因为,在没有强大的特征的情况下,只能把各种组合人为构造出来,然后用一个浅层的大模型去学习。然而深度学习模型学习出的特征本身已经包含了巨大的信息量,因此繁琐的人工特征工程变得没那么重要了,这对技术的商业化非常有利。
这种信息量是通过深度学习在面对大规模原始数据的抽象、非线性学习能力而获得的。例如,通过抓取大量金融行业的相关文本,进行统一的文本语义相似度学习建模和训练,就能得到一个强大的文本特征提取模型。这个模型可以用于证券领域、基金领域、银行服务领域等等各个行业系统中。
此外,深度学习也可以通过「多任务学习」(multi-task learning)的方式整合不同类型的问答数据,极大简化了启动阶段客户标注数据的工作。
知识点的构建阶段需要客户提供有标注的训练数据:每一个知识点(标准答案),都需要客户「手写」用户标准提问范式和可能的变体。构建这样的标准问答集是极其耗费时间的,说服客户进行标注也是有一定难度的,然而如果客户之前采用过人工客服,有人工客服日志,我们就可以结合人工客服日志,使用多任务学习大量削减需要人工完成的标注数据集创建工作。
追一一直偏重实用、偏重落地,我们不仅仅钻研最前沿的技术,也致力于优化落地效果,把自适应、有闭环正反馈的系统交付给用户。令人自豪的是,我们有一批能够把问题想清楚的人,正在用系统工程的思维为客户构建具有极致体验的对话机器人服务。
*****
我们的对话机器人,不追求「一个 AI 模型端到端解决全部问题」,而是在一个完整系统的每个模块里、各个维度里,都用 AI 技术帮助提升效率、优化体验。这种优化可能帮助主系统提取了更强的特征,可能在冷启动阶段帮助客户简化了痛苦的数据标注过程,可能在运转过程里帮助分析舆情、找到客户产品设计的不合理之处。它们并不显山露水,却无处不在。
这也是追一希望向用户传达的理念:真正有「AI 意味」的系统,是「草色遥看近却无」的整体系统,而 AI 的角色,是「润物细无声」地、持续地优化其中的每一个细节。