智能对话系统之多轮对话
序言
以一周前的一条微博作为开始。一周前我讲:相对的,自然语言解析技术已经逐渐不再成为各家广义智能助理产品的核心竞争力,识别用户意图之后所提供的服务开始成为对话机器人差异化的核心。
百度:对话系统的组成对于一个对话系统而言,我微博中所指的『后续服务』,就是上图中的DST(对话状态维护)以及Policy(动作候选排序),或者统一的称其为DM(DialogueMannagement,对话管理)。也即,当接收到NLU模块的输出、其他场景及用户特征信息之后,判断系统应该跳转到什么状态,以及执行什么样的动作。
从产品的角度,DM是对话机器人封闭域多轮对话体验的核心,正是一次次DST+Policy形成了人机间的多轮对话体验。(我个人倾向于将识别用户意图之后,为了获取必要信息,与用户进行的有目的的多轮对话称为封闭域多轮对话,区别于识别用户意图之前,为了利用上文信息,所采用的『上下文替换』、『主体补全』等技术,aka 开放域多轮对话。下文提到的『多轮对话』,均指封闭域多轮对话。)
既然多轮对话在对话机器人类产品体验中扮演着如此重要的角色,我便倾向于开始思考:一个架构完备的多轮对话体系应该是什么样的。也即多轮对话系统中需要至少包含哪些模块,才能为用户提供一种与人人对话相去不远的人机对话体验。
多轮对话定义我有个习惯,就是在构造一个复杂系统之前,先从纷繁的细节之中跳出,尝试抽象的描述整个系统,及系统中的各个模块,也即为它们『下定义』。这能帮助你在多种可行方案中做出选择,也即帮你明确:什么该做,什么不该做,什么该谁做。
基于以上思想,我尝试先给出几个我个人对于多轮对话体系定义问题的回答:
基本定义:什么是多轮对话?(封闭域)多轮对话是一种,在人机对话中,初步明确用户意图之后,获取必要信息以最终得到明确用户指令的方式。多轮对话与一件事情的处理相对应。
补充说明:所谓『必要信息』一定要通过与用户的对话获取吗?不一定,即便是人与人之间的交流,对话本身所包含的信息也只占总传递信息量的一小部分,更多信息来源于说话人的身份、当前的时间/地点等一系列场景信息。所以多轮对话的信息获取方式也不应当只局限于用户所说的话。
补充说明:多轮对话一定在形式上表现为与用户的多次对话交互吗?不一定,如果用户的话语中已经提供了充足的信息,或者其它来源的补充信息已经足够将用户的初步意图转化为一条明确的用户指令,那就不会存在与用户的多次对话交互。
以上是针对多轮对话整体定义问题的回答,每个模块的相关定义会在下文各个模块的讲解中尝试给出。
槽基本定义:什么是槽?槽是多轮对话过程中将初步用户意图转化为明确用户指令所需要补全的信息。一个槽与一件事情的处理中所需要获取的一种信息相对应。
补充说明:多轮对话中的所有的槽位都需要被填充完整吗?不一定,以如下对话为例:
我:『去萧山机场多少钱』出租车司机:『70』
对话中的『70』,应当被理解为70元人民币,而不必再去追问:『你说的是人民币、美元、日元还是港币?』。这类信息应当以默认值的形式存在,也即槽有必填与非必填之分,与上文所说的『信息未必需要通过与用户的对话获取』相对应。
词槽与接口槽上文反复的提到,对话内容并不是获取信息的唯一方式,用户身份以及当前场景也包含着大量值得被利用的隐含信息。所以,与此相对的,一个完备的多轮对话体系应当同时具备从用户话里以及话外获取信息的能力。
我个人将利用用户话中关键词填写的槽叫做词槽,利用用户画像以及其他场景信息填写的槽叫做接口槽。
举个例子,我讲『我明天要坐火车去上海』。其中,分别将『明天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。
槽组与槽位我个人将利用用户话中关键词填写的槽叫做词槽,利用用户画像以及其他场景信息填写的槽叫做接口槽。
举个例子,我讲『我后天要坐火车去上海』。其中,分别将『后天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。
不知道上文错的如此离谱的结论有没有引起你的注意:)
仔细读一遍上面举的例子,就会发现一个很严重的矛盾点:难道『出发地』这个槽不能由用户指定?用户完全可以说『我后天要坐火车从北京去上海』,那它是词槽还是接口槽?而且更进一步的,难道只能用『我当前所在的位置』来填入『出发地』这个槽中?比如,如果能读到我的日程表,发现我明天会去杭州,那是不是就应该用『杭州』而不是『我现在所在的位置』来填『出发地』这个槽了?
从中我们能发现什么呢?同一个槽,可能会存在多种填槽方式。
我将可能包含多种填槽方式的槽称为槽组,槽组下面可能存在任意多个槽位,也即任意多种填槽方式,而每个槽位又都对应着『词槽』与『接口槽』两种槽位类型之一。
本质上来讲,槽组(也即上文中提到的『槽』),对应着一种信息,而几乎不会有哪种信息的获取方式只有一种。所以一个『槽』会同时对应多种填槽方式也就是自然而然的了。
依照上文,同一种信息会有多种获取方式,也即同一个槽组会对应多种填槽方式(槽位)。那不同填槽方式之间必然会存在优先级的概念。
就如同上文『订票』的例子,『出发地』槽包含三种填写方式,一种词槽、两种接口槽,自然的,词槽的优先级最高,『日程表中隐含的出发地』次之,『我当前所在的位置』再次。
如果将其与前文提到过的必填/非必填结合起来,其填槽过程应当遵循以下步骤:
尝试填写词槽若失败,尝试填写第一接口槽『用户日程表中隐含的出发地』若失败,尝试填写第二接口槽『用户当前所在位置』若失败,判断是否该槽必填若必填,反问用户,重填词槽*若非必填,则针对该槽组的填槽过程结束我们需要知道,必填/非必填在逻辑上与槽组而不是槽位平级,只有信息才会分为必要/非必要,填槽方式不做这种区分。而且是否必填实际上与接口槽无关,只取决于是否需要与用户进行交互。
澄清话术与槽组也即与一种信息平级的概念还有一个,叫做澄清话术。
澄清话术是对话机器人希望获取某种信息时所使用的问句。比如『目的地』对应的澄清话术就是『您想从哪出发呢?』,『出发时间』对应的澄清话术就是『您想什么时间出发呢?』。
显而易见的,澄清话术与槽组而不是槽位平级。
槽的填写上文讲到,一个槽组可能会有多个槽位,槽位存在词槽与接口槽之分。
先说词槽。
词槽信息的抽取其实还是有些麻烦的,不过这属于解析的问题,不在本文探讨的范围内,这里只是简单提一下,举两个例子:
用户表达『不』,可能会有『不行』、『不是』、『算了』、『没有』等一系列说法。用户话中有多个符合条件的关键词,我们整套多轮对话中有多个槽,每个槽填一个还是多个值?哪个槽与哪个词对应?同义词典、规则、双向LSTM+CRF,各有各的方法。
再说接口槽。
接口槽与词槽相比,额外存在一个问题,就是:接口返回的结果就是用户需要的结果吗?
这里需要分成两种情况来讨论,一种是:我们明确知道接口的返回值可以直接填入槽位(不是槽/槽组)中,不需要向用户确认。
特别的,这里还要明确一点,即便是上述情况,也并不意味着当前槽/槽组只有该特定接口槽这一个槽位。有两种情况存在:一种是该槽组下只有这一个槽位,该接口的返回值直接填入槽位中,也相当于填入了槽/槽组中;或者该槽位下有多个槽位,接口槽的填入值并不一定最终作为槽/槽组的填入值。
另一种是:我们知道接口的返回值只能作为参考,需要用户的协助才能进行槽位的填写。
这种情况下,需要提供选项,让用户最终决定该槽位的填入值,与词槽一样,这里同样需要处理单值/多值的问题。单值/多值在逻辑上与槽组平级。
此外,这里还要注意一个否认选项的问题,比如我对阿里小蜜说,我忘记密码了,它会通过接口拿到我的当前账号,然后将其提供选项给我,问『你是忘记了哪个账号的密码?』,不过,除了我当前账号之外,还有一个选项也被提供出来了,就是『不,不是这个账号』。
这代表了一类问题的存在,用户的意图并不一定包含在接口的全部返回值之中。所以就必然会有这样一种类似『不要/不是/不』的选项,我将其叫做否认选项。
用户选择否认选项后,即意味着该槽位的填写失败了,需要填入一个特殊值代表失败。用户选择否认选项的失败,可以与接口调用失败等其它意外情况合并处理,因为这都意味着该槽位填写失败,意味着该种信息获取方式未能成功获取信息。
如果该槽组下只有这一个槽位,这个特殊的失败表征值就应当作为整个槽组的填入值,如果还有其他槽位值,则根据槽位间优先级最终确定槽组填入值。
平级槽和依赖槽上面说到底都在讲一个槽组的填写,也即一种信息的获取,但多轮对话的目的是将初步用户意图转化为明确用户指令,这其中所需要的信息通常都不只有一种。
谈完了槽组与槽位之间的关系,接下来谈一下槽组与槽组之间的关系,也即信息与信息之间的关系。
为了便于理解,我先举两个例子来代表两种多轮对话中所包含的极端情况。
第一种:订车票,你需要知道用户出发的时间、地点、目的地、座位种类。这四个槽组之间,没有任何依赖关系。换言之,你只需要确定好这四个槽组中必填槽组之间的澄清顺序,接收到用户问句后,对还未填充完成的必填槽组依次进行澄清即可。我将这四个槽组之间的关系称为平级槽关系。
另一种,不知道读者玩没玩过橙光,或者其它多结局的剧情类游戏。它们的特点是什么呢?每一个选择都会有影响到后续剧情发展也即 每个槽组的填写结果会影响其它槽组的填写。换言之,部分槽组依赖前序槽组的填写结果,在其依赖的前序槽组填写完成之前,该槽组都无法进行填写。我将槽组间的这种关系称为依赖槽关系。
这种情况下,整个多轮对话过程就形成了一棵树,极端情况下,这棵树是满的。树上的每个节点放置着一个会对后续对话走向产生影响的槽组。
槽关系的选择要根据实际业务场景来确定。
如果错将平级槽采用依赖槽关系来管理,就会出现信息的丢失。比如A、B、C,三者本为平级槽关系,但却将其用A->B->C的依赖槽关系来管理,那即便用户问句中包含填写B、C槽组的信息,也可能会由于A槽组的未填写而造成B、C槽组的填写失败。
如果错将依赖槽采用平级槽的关系来管理,就会出现信息的冗余,比如A、B、C三者的关系为A、A1->B、A2->C,那即便用户将值A1填入槽组A后,却仍然需要向用户询问本不需要的C槽组的填写信息。
上述两种情况属于全平级槽关系与全依赖槽关系的特殊情况,在实际的业务场景中,这两种关系会是同时存在的,不同槽组间,既有平级槽关系,又有依赖槽关系。
实际业务场景中,完整的多轮对话过程通常会以树的形式存在,每个节点存在一个或多个槽组,用于获取一种或多种信息,节点间的槽组为依赖关系,节点内的槽组为平级关系。
上文将多轮对话定义为一件事情的处理,槽组/槽定义为一种信息的获取,槽位定义为信息的一种获取方式。这里我倾向于将多轮对话树结构中的一个节点定义为处理事情的一个步骤。
一件事情的处理包含多个步骤,每个步骤中需要补全一种或多种信息,每种信息存在一种或多种获取方式。
上述定义和组里算法大佬的定义有些分歧,不过谁让这是我的文章呢:)就按我的来。
填槽意义结合上文,我们需要了解到,填槽的意义有两个:作条件分支多轮对话、作信息补全用户意图。换言之,填槽不仅是补全用户意图的方式,而且前序槽位的填写还会起到指导后续信息补全走向的作用。
准入条件上文我们讲到,完整的多轮对话过程通常会以树的形式存在,树中包含多个节点,代表处理这件事情的一个步骤。
而每个节点,都应当有其特别的准入条件。树的根节点往往需要限制 NLU模块的输出,也即明确什么样的用户意图将会由该棵多轮对话树来处理;树的中间及叶子节点往往需要根据前序槽组的填槽结果以及其他背景信息进行条件限制。(如果将所有信息,比如NLU模块输出,或是其他背景信息都看做前序槽组的填写结果,那就能得到统一的槽组-条件-槽组-条件······形式,槽组用于获取信息,条件用于信息限制)
我尝试从两个角度来描述一套完备的准入条件体系。
一个是多条件的组织形式,准入条件在逻辑上应该支持条件间的与或非,百度的UNIT平台提供了一种相对成熟的组织形式,将准入条件整体划分为条件和条件组,条件包含在条件组中,组内条件间是且关系,条件组之间是或关系(当然这里的且与或可以根据自身业务情况对调),条件本身支持非关系。
一个是单条件的限制能力,准入条件应当同时支持对前序槽组填写值、填写方式、填写状态进行限制。也即需要有针对值的条件、针对类型的条件和针对状态的条件。简单的讲,状态就是『填了吗』,类型就是『谁填的』,值就是『填了什么』。
不同业务场景下我们会需要不同角度的限制条件。比如,上文中提到填槽的意义包含两种:作条件分支多轮对话、作信息补全用户意图,如果仅仅作信息,那我们通常就只关心『填了吗』,只要填写完成就进行后续步骤,并不关系『谁填的』以及『填了什么』;但是如果槽组内的填入值会影响后续多轮对话走向,那我们就倾向于通过槽组的填入方式或填入值来作多轮对话的分支。
答案系统先明确一个观点,多轮对话树的节点属于对话节点而不是答案节点,同一份答案可能会出现在多个对话节点中。
答案系统和多轮过程应当是解耦的,答案系统中的每份答案都应当设置好自己的触发条件。举个例子,若存在ABC三个槽,A=A1、B=B3、C=C1提供答案一,A=A2、B=B1、C=C2或A=A3、B=B2、C=C1提供答案二。
另外,答案的种类也不应仅局限于文本,富文本、接口、话题切换,都可以视为合理的答案形式。
话题切换话题切换指用户与用户的对话从一个多轮过程切换至另一个多轮过程,话题切换有主动切换和被动切换之分。
上文提到的作为答案的话题切换,就可以理解为主动的话题切换。
被动的话题切换是指,系统发现无法从用户的问句中抽取信息以继续当前的多轮对话,只好将其作为一条全新的问句重新进行解析和话题识别。
话题切换,尤其是主动的话题切换会涉及到一个新问题:槽继承。
举个例子:
我:『我明天要坐高铁从杭州到北京』我:『算了,还是坐飞机吧』
这种情况下,机器人不应当重复询问『出发地』、『出发时间』和『目的地』。
除了槽继承,还有一个与之相对的问题叫做槽记忆,这通常适用在被动式的话题切换中。由于解析失误,或者其他原因,使得用户跳出了原话题,当用户在一定时间内重新回到原话题时,不应让用户重复进行填槽,该技术已被用于阿里小蜜,不过他们似乎称之为『多轮状态记忆』。
举个例子:
我:帮我订张从杭州到北京的机票。VPA:请问您希望哪天出发呢?我:明天杭州下雨吗?VPA:明天杭州有雷阵雨。我:后天呢?VPA:后天杭州天气晴。我:机票订后天的。VPA:好的,已帮你预定后天从杭州到北京的机票。
状态切换我们还需要思考这样一个问题,既然话题可以切换,也即一个多轮过程可以切换到另一个多轮过程,那多轮过程中的对话状态是否可以切换?
我举两个例子:
第一个:
我:帮我订张机票,从杭州出发。VPA:请问你想去哪呢?我:(发现明天杭州有雷阵雨)换出发地。VPA:请问你想从哪出发呢?我:上海。
多轮对话应当允许回到前序节点。
第二个:
我:我想买个杯子。VPA:以下是为您推荐的杯子。(展示结果一)我:换一换。VPA:以下是为您推荐的杯子。(展示结果二)
多轮对话应当允许重复进入同一节点。
作者:我偏笑_NSNirvana链接:https://www.jianshu.com/p/b0aa00f7095e來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
对话系统 NLU/DM 任务详解
摘要:在很多场景下,对话用户界面(CUI-ConversationalUserInterface)比图形用户界面(GUI-GraphicalUserInterface)更加自然和高效。过去一年中,CUI得到了大量的关注,也取得了迅速的发展。微软提出了对话即平台的战略,FacebookMessenger上出现了各种对话机器人(chatbot),很多和CUI相关的创业公司也应运而生。本期分享主要介绍对话系统的原理和实践,包括对话系统中语义理解、对话管理等模块的技术原理,以及如何搭建一个可靠、可用的对话系统。
outline这是今天分享的大纲。主要包括四个部分:首先介绍对话系统的背景和整体架构;然后介绍对话系统中的两个关键部分,分别是自然语言理解(NLU)和对话管理(DM);最后再讲讲助理来也在打造对话系统中的思考和尝试。
whatisdialoguesystem什么是对话系统?我们先来定义什么是对话。实际上,在生活和工作中每天我们都在通过对话来获取信息、表达观点、抒发情绪。对话有几个特征:1)角色切换:对话中通常有两个甚至多个角色,各角色交替进行表达;2)连贯性:对话的内容前后是有关联的、有逻辑的;3)多模态:语音、文字、图片都可以成为对话中传递信息的方式。那么,对话系统的定义就是能与人进行连贯对话的计算机系统。从另一个角度来理解,对话系统让一种新的人机交互方式成为可能,即基于对话的交互(CUI:ConversationalUserInterface)。
dialoguesystemuseful对话系统在三类场景下有明显的优势:1)当不方便使用手进行鼠标或触屏操作时,比如开车的时候,用语音交互是最方便的;2)当基于自然语言的交互比基于图形的交互更高效时,以打车为例,用户说「叫车从公司回家」比打开APP输入起点终点再点击下单要更高效;3)在现有的人与人之间对话的场景下,对话系统能帮助提高效率、降低成本,比如客服与用户之间的对话。
examplesfordialoguesystem我们再来看几个对话系统的具体应用。Siri大家都很熟悉,每个iOS上都有。Cortana和Siri类似,是微软推出的个人助理应用,主要在Windows系统中。亚马逊的Echo是最近一年很火的智能音箱,销量超过500万台,用户可以通过语音交互获取信息、商品和服务。最后一个例子是助理来也,我们采用AI+HI的方式,主打懂你和高完成度。这些产品后面都使用到了对话系统。
dialoguecomponents对话系统由五个主要部分组成:1)语音识别(ASR)将原始的语音信号转换成文本信息;2)自然语言理解(NLU)将识别出来的文本信息转换为机器可以理解的语义表示;3)对话管理(DM)基于对话的状态判断系统应该采取什么动作,这里的动作可以理解为机器需要表达什么意思;4)自然语言生成(NLG)将系统动作转变成自然语言文本;5)语音合成(TTS)将自然语言文本变成语音输出给用户。当然,有些对话系统的输入输出不一定是语音,可以是文本,因此不是每个对话系统中都包含语音识别和语音合成这两个模块。
dialoguearchitecture这是对话系统的架构图。图中的1、2、3、4、5分别为刚刚介绍的对话系统中的五个模块。这个架构图能更清晰的看到每个模块的输入输出,以及各模块之间的协作关系。接下来我们重点介绍自然语言理解(NLU)和对话管理(DM)这两个模块,也就是图中红框标出的两个模块。
自然语言理解(NLU)的目标是将文本信息转换为可被机器处理的语义表示。因为同样的意思有很多种不同的表达方式,对机器而言,理解一句话里每个词的确切含义并不重要,重要的是理解这句话表达的意思。上面的例子中,三句话在字面上完全不同,但表达了类似的意思,即用户想预约上门保洁服务。
NLUchallengeNLU面临几个挑战。首先,语音识别错误率通常在10-20%,这会影响语义理解的准确性。其次,通过自然语言表达的语义存在不确定性,同一句话在不同语境下的语义可能完全不同。比如,用户说「肯德基到家」,这是可能外卖需求,也可能是叫车需求,需要上下文语境才能更好的理解。再比如,用户说「明早8点叫我起床」,如果发生在23:59「明早」指的是「第二天早上」,如果发生在00:01「明早」很有可能指的就是「当天早上」。最后,在自然语言中往往存在不流畅性,存在错误、重复等情况。
NLUequalsintentplusslots刚刚提到,机器在理解一句话时,每个词的确切含义并不重要,重要的是这句话的意思。为了让机器能够处理,我们用语义表示来代表自然语言的意思。语义表示可以用意图+槽位的方式来描述。意图即这句话所表达的含义,槽位即表达这个意图所需要的具体参数,用slot和value对的方式表示。比如,「预约这周日上午的保洁阿姨」这句话的意图是「发起请求」,槽位是「服务类型=保洁,服务日期=20161127」。NLU要做的事情就是将自然语言转化成这种结构化的语义表示。
Rule-basedNLUapproach下面介绍NLU的几种方法。第一种是基于规则的方法,大致的思路是定义很多语法规则,即表达某种特定意思的具体方式,然后根据规则去解析输入的文本。上图中展示了一个订机票场景下基于规则的NLU模块。这个方法的好处是非常灵活,可以定义各种各样的规则,而且不依赖训练数据。当然缺点也很明显,就是复杂的场景下需要很多规则,而这些规则几乎无法穷举。因此,基于规则的NLU只适合在相对简单的场景,适合快速的做出一个简单可用的语义理解模块。当数据积累到一定程度,就可以使用基于统计的方法了。
NLUcomponentstask基于统计的NLU使用数据驱动的方法来解决意图识别和实体抽取的问题。意图识别可以描述成一个分类问题,输入是文本特征,输出是它所属的意图分类。传统的机器学习模型,如SVM、Adaboost都可以用来解决该问题。实体抽取则可以描述成一个序列标注问题,输入是文本特征,输出是每个词或每个字属于实体的概率。
传统的机器学习模型,如HMM、CRF都可以用来解决该问题。如果数据量够大,也可以使用基于神经网络的方法来做意图识别和实体抽取,通常可以取得更好的效果。和基于规则的NLU相比,基于统计的方法完全靠数据驱动,数据越多效果越好,同时模型也更加健壮。缺点是需要训练数据,尤其是如果使用深度学习,需要大量的数据。在实践中,这两种方法通常结合起来使用:1)没有数据的时候先基于规则,有数据了逐渐转为统计模型;2)基于统计的方法覆盖绝大多数场景,在一些极端的场景下用基于规则的方法来保证效果。
NLUasservice可以说,NLU是所有对话系统的基础,目前有一些公司将NLU作为一种云服务提供,方便其他产品快速的具备语义理解能力。比如Facebook的wit.ai、Google的api.ai和微软的luis.ai,都是类似的服务平台,使用者上传数据,平台根据数据训练出模型并提供接口供使用者调用。使用这类服务的好处是能够快速的搭建出数据驱动的NLU模块,坏处是这些平台因为强调通用性,所以灵活性不够,如果有定制化的需求,就很难被满足。
LUIS.AI这是一个luis.ai提供的NLU服务的例子。输入是「11月28号下午3点在公司开会」,返回的结果中能正确的将意图识别为创建日程,而对应实体,如日期、时间、地点都能被准确的抽取出来。
下面来介绍对话系统中另一个重要的模块:对话管理(DM)。DM是对话系统的大脑,它主要干两件事情:1)维护和更新对话的状态。对话状态是一种机器能够处理的数据表征,包含所有可能会影响到接下来决策的信息,如NLU模块的输出、用户的特征等;2)基于当前的对话状态,选择接下来合适的动作。举一个具体的例子,用户说「帮我叫一辆车回家」,此时对话状态包括NLU模块的输出、用户的位置、历史行为等特征。在这个状态下,系统接下来的动作可能有几种:1)向用户询问起点,如「请问从哪里出发」;2)向用户确认起点,如「请问从公司出发吗」;3)直接为用户叫车,「马上为你叫车从公司回家」。
常见的DM也有几种。第一种是基于有限状态机(FSM),显示的定义出对话系统应有的状态。DM每次有新的输入时,对话状态都根据输入进行跳转。跳转到下一个状态后,都会有对应的动作被执行。上图中展示了一个控制物体前后左右移动或停止的对话系统中的基于FSM的DM,大家可以清晰的看到各中状态的定义和状态间的跳转逻辑。基于FSM的DM,优点是简单易用,缺点是状态的定义以及每个状态下对应的动作都要靠人工设计,因此不适合复杂的场景。
另一种DM采用基于统计的方法。简单来说,它将对话表示成一个部分可见的马尔可夫决策过程。所谓部分可见,是因为DM的输入是存在不确定性的,例如NLU的结果可能是错误的。因此,对话状态不再是特定的马尔可夫链中特定的状态,而是针对所有状态的概率分布。在每个状态下,系统执行某个动作都会有对应的回报(reward)。基于此,在每个对话状态下,选择下一步动作的策略即为选择期望回报最大的那个动作。这个方法有以下几个优点:1)只需定义马尔可夫决策过程中的状态和动作,状态间的转移关系可以通过学习得到;2)使用强化学习可以在线学习出最优的动作选择策略。当然,这个方法也存在缺点,即仍然需要人工定义状态,因此在不同的领域下该方法的通用性不强。
最后一种DM方法是基于神经网络的。它的基本思路是直接使用神经网络去学习动作选择的策略,即将NLU的输出等其他特征都作为神经网络的输入,将动作选择作为神经网络的输出。这样做的好处是,对话状态直接被神经网络的隐向量所表征,不再需要人工去显式的定义对话状态。当然这种方法的问题时需要大量的数据去训练神经网络,其实际的效果也还有待大规模应用的验证。助理来也的对话系统中有尝试用该方法,但更多的还是传统机器学习方法和基于深度学习的方法结合。
刚刚介绍了对话系统中的两个重要模块:自然语言理解(NLU)和对话管理(DM)。实践中搭建和使用对话系统时,存在以下几个挑战:1)用户对错误的容忍度很低。因为自然语言的表达方式非常灵活多变,目前纯自动的对话系统往往达不到用户的预期,比如Siri在很多时候还是不能很好地理解用户说的话;2)有些场景下,如果只使用语音或者文字的对话系统,交互效率不一定是最高的;3)基于对话的人机交互目前还不是一种主流的交互方式,大多数用户还不习惯。下面我想针对这三点挑战,讲讲来也在搭建和使用对话系统时的一些思路和尝试。
首先,为了提升对话系统的可靠性,我们使用AI+HI的方法,此处HI表示HumanIntelligence,即真人智能。AI+HI表示机器助理和真人助理结合起来,为用户提供优质的体验。为什么要这么做呢?因为当真人能够和机器配合时,能产生一个正反馈:真人纠正机器的错误->更好的用户体验->更多的活跃用户->获取更高质量的数据->训练更好地模型->机器更好地辅助真人。
HI和AI如何无缝的配合呢?我们通过群聊将用户、AI和HI放在一个群里。由AI根据置信度来判断,什么情况下需要将HI加入群内,将什么样的HI加入群内,以及什么时候HI来干预。AI和HI的配合分为三种:1)AI置信度较高时,无需HI干预,对话系统完全由AI来执行动作;2)AI置信度不高时,AI生成候选动作辅助HI来动作;3)AI不确定性很高时,完全由HI接管来执行动作。
在基于AI+HI的对话系统中,HI扮演三种角色:1)为AI提供反馈,如NLU出现错误时,HI可以纠正,然后AI在纠正后的对话状态下继续工作;2)在AI的辅助下执行动作,比如AI生成候选动作但不执行,由HI进行判断最终来执行;3)产生标注数据使AI不断进化,例如HI每一次纠错、执行动作都是一个标注的样本,可以用于训练AI。
刚刚提到第二个挑战是仅用语音和文字,有时候交互效率不够高。例如,用户通过自然语言叫车,然后想知道司机的实时位置,我们如果通过自然语言去描述司机位置「司机在XXX路距离你YY米」,这个体验会很差。我们解决这个问题的方案是使用多模态交互,即在语音和文字的基础上增加更多的交互形式,如图形化的交互界面。上面的例子展示了用户通过自然语言交互叫车、查看司机位置、取消用车的全过程。很显然,通过一个地图来展示司机位置比使用自然语言去描述司机位置更精确和高效。我们将文本消息和webapp结合起来,用户既可以使用对话式的交互,也可以使用图形式的交互。
刚刚提到第三个挑战是对话式的交互目前还不是主流,用户并不适应。为了让用户更接受对话式的交互,我们可以将对话系统和推荐系统结合起来,这样对话系统不仅仅是被动的回复用户,还可以基于情景向用户进行推荐,主动和用户进行沟通。上面的图片展示了,助理来也通过分析用户的习惯和喜好,在合适的场景下向用户主动推荐打车、咖啡等服务。这种情况下,用户往往不需要再进输入任何东西,即可得到需求的满足。同时,因为用户收到的推荐是基于场景的,是个性化的,用户不会觉得被打扰,转化率也不错。
Q&A
Q1:目前,人工智能聊天机器人能在多大程度上代替企业客服?
A1:聊天机器人在基于特定知识库的客服场景下,已经能取得不错的效果。比如淘宝和京东上的客服机器人,已经能回答很多问题。当然,前提是语料足够多,质量足够高。
Q2:如何快速构建简单场景的chatbot?
A2:首先需要一个懂AI的产品经理明确的定义出你的对话场景,包括意图、实体、动作等。其次想办法收集到一批对话数据,进行标注,越多越好。最后可以使用现有的NLU服务搭建一个简单的chatbot。
人工智能的三次浪潮与三种模式
■史爱武
谈到人工智能,人工智能的定义到底是什么?
达特茅斯会议上对人工智能的定义是:使一部机器的反应方式就像是一个人在行动时所依据的智能。
百度百科上对人工智能的定义是:它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
尽管人工智能现在还没有非常严格准确或者所有人都接受的定义,但是有一些约定俗成的说法。通常人工智能是指机器智能,让机器达到人智能所实现的一些功能。人工智能既然是机器智能,就不是机械智能,那么这个机器是指什么呢?是指计算机,用计算机仿真出来的人的智能行为就可以叫作人工智能。
2017年7月,国务院印发了《新一代人工智能发展规划》。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。这一国家级战略和社会流行趋势标志着,人工智能发展进入了新阶段,我国要抢抓人工智能发展的重大战略机遇,构筑人工智能发展的先发优势,加快建设创新型国家和世界科技强国。
人工智能的三次浪潮
自1956年开始,人工智能经历了三起三落,出现了几次浪潮,现在人工智能已经是处于第三次浪潮了。
第一次浪潮(1956-1976年,20年),最核心的是逻辑主义
逻辑主义主要是用机器证明的办法去证明和推理一些知识,比如用机器证明一个数学定理。要想证明这些问题,需要把原来的条件和定义从形式化变成逻辑表达,然后用逻辑的方法去证明最后的结论是对的还是错的,也叫做逻辑证明。
早期的计算机人工智能实际上都是沿着这条路在走。当时很多专家系统,比如医学专家系统,用语言文字输入一些症状,在机器里面变换成逻辑表达,用符号演算的办法推理出大概得了什么病。所以当时的主要研究都集中在逻辑抽象、逻辑运算和逻辑表达等方面。
在第一次浪潮中,数学定理证明实际上是实现效果最好的,当时有很多数学家用定理思路证明了数学定理。为了更好地完成定理证明工作,当时出了很多和逻辑证明相关的逻辑程序语言,比如很有名的Prolog。
虽然当时的成果已经能够解开拼图或实现简单的游戏,却几乎无法解决任何实用的问题。
第二次浪潮(1976—2006年,30年),联结主义盛行
在第一次浪潮期间,逻辑主义和以人工神经网络为代表的联结主义相比,逻辑主义是完全占上风的,联结主义那时候不太吃香。然而逻辑主义最后无法解决实用的问题,达不到人们对它的期望,引起了大家的反思,这时候人工神经网络(也就是联结主义)就慢慢占了上风。
在70年代末,整个神经元联结网络、模型都有突飞猛进的进步,最重要的是BP前馈神经网络。1986年BP前馈神经网络刚出来的时候解决了不少问题,后来大家往更大的领域应用,实现了比较大的成果。在很多模式识别的领域、手写文字的识别、字符识别、简单的人脸识别也开始用起来,这个领域一下子就热起来,一时之间,人们感觉人工智能大有可为。随后十几年人们发现神经网络可以解决一些单一问题,解决复杂问题却有些力不从心。训练学习的时候,数据量太大,有很多结果到一定程度就不再往上升了。
这时期所进行的研究,是以灌输“专家知识”作为规则,来协助解决特定问题的“专家系统”为主。虽然有一些实际的商业应用案例,应用范畴却很有限,第二次热潮也就慢慢趋于消退。
第三次浪潮(2006—现在),基于互联网大数据的深度学习的突破
如果按照技术分类来讲,第二次和第三次浪潮都是神经网络技术的发展,不同的是,第三次浪潮是多层神经网络的成功,也就是深度学习取得突破。这里既有硬件的进步,也有卷积神经网络模型与参数训练技巧的进步。
若观察脑的内部,会发现有大量称为“神经元”的神经细胞彼此相连。一个神经元从其他神经元那里接收的电气信号量达某一定值以上,就会兴奋(神经冲动);在某一定值以下,就不会兴奋。兴奋起来的神经元,会将电气信号传送给下一个相连的神经元。下一个神经元同样会因此兴奋或不兴奋。简单来说,彼此相连的神经元,会形成联合传递行为。我们透过将这种相连的结构来数学模型化,便形成了人工神经网络。
经模型化的人工神经网络,是由“输入层”“隐藏层”及“输出层”等三层构成。深度学习往往意味着有多个隐藏层,也就是多层神经网络。另外,学习数据则是由输入数据以及相对应的正确解答来组成。
为了让输出层的值跟各个输入数据所对应的正解数据相等,会对各个神经元的输入计算出适当的“权重”值。通过神经网络,深度学习便成为了“只要将数据输入神经网络,它就能自行抽出特征”的人工智能。
伴随着高性能计算机、云计算、大数据、传感器的普及,以及计算成本的下降,“深度学习”随之兴起。它通过模仿人脑的“神经网络”来学习大量数据的方法,使它可以像人类一样辨识声音及影像,或是针对问题做出合适的判断。在第三次浪潮中,人工智能技术及应用有了很大的提高,深度学习算法的突破居功至伟。
深度学习最擅长的是能辨识图像数据或波形数据这类无法符号化的数据。自2010年以来,Apple、Microsoft及Google等国际知名IT企业,都投入大量人力物力财力开展深度学习的研究。例如AppleSiri的语音识别,Microsoft搜索引擎Bing的影像搜寻等等,而Google的深度学习项目也已超过1500项。
深度学习如此快速的成长和应用,也要归功于硬件设备的提升。图形处理器(GPU)大厂英伟达(NVIDIA)利用该公司的图形适配器、连接库(Library)和框架(Frame⁃work)产品来提升深度学习的性能,并积极开设研讨课程。另外,Google也公开了框架TensorFlow,可以将深度学习应用于大数据分析。
人工智能的3种模式
人工智能的概念很宽泛,根据人工智能的实力可以分成3大类,也称为3种模式。
(1)弱人工智能:擅长于单个方面的人工智能,也叫专业人工智能。比如战胜世界围棋冠军的人工智能AlphaGo,它只会下围棋,如果让它下国际象棋或分辨一下人脸,它可能就会犯迷糊,就不知道怎么做了。当前我们实现的几乎全是弱人工智能。
(2)强人工智能:是指在各方面都能和人类比肩的人工智能,这是类似人类级别的人工智能,也叫通用人工智能。人类能干的脑力活,它都能干,创造强人工智能比创造弱人工智能难得多,目前我们还做不到。
(3)超人工智能:知名人工智能思想家NickBostrom把超级智能定义为“在几乎所有领域都比最聪明的人类大脑都聪明很多,包括科学创新、通识和社交技能”。超人工智能可以是各方面都比人类强点,也可以是各方面都比人类强很多倍。超人工智能现在还不存在,很多人也希望它永远不要存在。否则,可能像好莱坞大片里面的超级智能机器一样,对人类也会带来一些威胁或者颠覆。
我们现在处于一个充满弱人工智能的世界。比如,垃圾邮件分类系统是个帮助我们筛选垃圾邮件的弱人工智能;Google翻译是可以帮助我们翻译英文的弱人工智能等等。这些弱人工智能算法不断地加强创新,每一个弱人工智能的创新,都是迈向强人工智能和超人工智能的进步。正如人工智能科学家AaronSaenz所说,现在的弱人工智能就像地球早期软泥中的氨基酸,可能突然之间就形成了生命。如世界发展的规律看来,超人工智能也是未来可期的!