大家好,我叫郭靖,虫门科技的创始人,一个AI应用领域创业者,自我定义是全栈AI产品经理,对技术、算法有一定了解(可以用tensorflow搭主流CNN、RNN,可以手推LSTM反向传播),这些业余时间学习的技术知识虽然不构成作为AIPM的必要条件,却也给了我一个独特的视角,在跟产品朋友交流的时候成为一个我可以输出的小价值。
为了能够给"AI产品经理大本营“这个community贡献一份力量,我准备从今天开始分享系列文章,名称叫做“AI产品脑洞系列”,因为是第一篇,所以想多说说写这个系列的目的:
【AI产品脑洞系列的写作目的】
首先,产品经理作为技能偏软的职业,能打的野怪不多,除了使用基本工具梳理流程、撰写文档、规划版本、管理进度以外,能够称之为 “技能”的东西很少,同行间更多交流的其实是案例与背后的设计原则。而每个产品中体现的“方法”,更像是电影的表达手法。故事换了,氛围换了,这个手法可以借鉴,但没法直接放到你的技能包里。
而AI PM作为一个新兴领域,还不存在足够的案例和足够的时间形成原则。这个时候,除了分享案例与背后的思考,分享一些话题与大方向的认知,我觉得,可能还存在一个有趣的角度,就是周期性的“产品定义”“产品分解”角度的刻意练习。
另外,作为AI应用领域的创业者,一直以来我相信新的技术进步后,总是需要好的产品经理,以该技术为边界,找到与应用场景的美妙结合。定义产品的黄金时期,往往出现在新技术表现出力量后的某个特定时期。这个特定时期大概呈现为:技术关键点出现重大突破,基础设施正在快速完善,在某些场景下已出现10 times better的应用,但大量的场景刚刚或还没见到该技术商用的苗头。
具有潜力的技术进步到应用发展,简化的路径大约是:
基础技术—基础设施—应用—应用上的应用……
比如:
电力革命—输电系统—通用电气/电灯—夜总会/广播电视台……
移动互联网—运营商—appstore—微信—小程序—你的小程序……
有足够颠覆性的技术突破会从根本上改变人们的生活方式,这意味着,它会创造全新的场景可能性空间(而不仅仅是一些场景)。这个可能性的空间会大到无法仅仅通过一两家公司来完成所有场景的应用,它因此需要一个应用的生态来填充,理想情况下,生态中会出现超级应用及超级应用上的生态。后一个生态寄生在前一个生态上,甚至可能更强大(也许有天会出现某个小程序可以威胁到微信本身,就好比超级app对appstore的威胁,搜索引擎对掌握浏览器的操作系统的威胁)。
在这个路径当中,每一个应用生态刚刚出现的时候,都是定义产品的黄金时期,这可能不取决于基础技术是否是崭新的。(比如现在的小程序上无论是冷饭热炒还是全新形态的游戏、app都有可能成为killer app,创新门槛像不像移动互联网初期的水平?)
那么,作为AIPM,我们观察一下目前处于技术-应用路径当中的哪个环节,拿NLP来举例:
NLP技术—语音语义API—Alexa—skills……
我们也许处在第二环到第三环之间,基础设施不够完善,但正在快速完善当中。第一层应用还没有出现killer app,也还没形成可以承载生态的超级app。逻辑上,这个时代的AIPM,都有定义与Alexa/Google Assistant同一层级(入口级)应用的机会。虽然我们现在看来无论是对话机器人本身,还是作为其载体音箱,都只能是大玩家才能参与的游戏。但谁又能知道,真正意义的入口级AI应用,形态就一定是对话机器人呢?
说了这么多,核心是想表达,在这样的timing,也许一个巨大的应用场景的可能性空间将被摆在这个时代的PM面前,但以过去的眼光看未来,总是觉得这事儿难以想象。那么,不如我们一起锻炼一下“想象力”,每期一起做一个完整而精致的脑洞实验。好比是健身达人每天发朋友圈打开,我也希望写作这个系列仅能当作自己与有幸交流的朋友一起练习、打卡的载体,这应该很有趣吧。
所以,每期我会拿出一个场景(需求/痛点),试图在AI的工具箱当中找到解决方案(拿着钉子找找锤子)。或者拿出一个有趣的AI产品,拆解一下他可能的技术实现手段,用了什么方法,输入输出是什么(分析锤子),并探讨它解决了什么样的问题,满足了什么需求(拿着锤子找找钉子)。进而引申出它可能的商业逻辑,竞争环境的分析(为什么一定是他),作为创业者的思考等等。
1
第一期内容:关于Duplex
作为第一期 ,本来我准备了不同的内容,但最近有个超级火的话题,就是Google在I/O大会上发布的可以跟人类打电话的Duplex系统,它的语音语气和对话的顺畅程度令人震惊,触发了很多人的恐怖谷效应。我对此也非常好奇,因此这次蹭个热度,拆解一下Google Duplex。
很多同学看到I/O会场演示的第一感觉是“纳尼,已经到这个程度了吗”?最近看到很多媒体文章讨论Duplex,对其表现出的as human as a human(跟人一样像人)深表震惊甚至是恐惧,甚至从社会伦理与道德安全角度去讨论Duplex的隐患(techcrunch上一篇很长的文章题目叫“Duplex shows google failing at ethical and creative AI design”)。其威力可见一斑。
目前能看到的比较详细的解释只有谷歌官方博客上的那篇博文。这篇blog十分简略,但还是有一些关键线索,加上I/O大会上Pichai说了什么(以及刻意没有说什么)等信息,以及自己对现有技术边界的有限理解和自己在智能助理上的实践经验,还是可以产生一些有趣的猜测。
为何此前不存在一个对话系统可以给人这样的感觉?Duplex到底越过了哪个临界点,使得它突然一下子跃入了人类的恐怖谷,又是怎样越过的?
“感觉非常像人”,其实可以拆解成两个大的部分:1.Duplex与真人沟通对话的过程中,可以准确理解人类语言,并根据任务目标,做出合理自然的应答;2.Duplex说话时的声音、语气等语音听起来很像真人。
从Google官方博客中Duplex网络架构的示意图中,也可以大概看出上述两个模块的组合形成了Duplex的基本结构(吐槽:这图的粗略程度只能算示意图)
(图1:谷歌博客上关于Duplex网络架构的示意图)
(图2:两个大的黑盒子组成了Duplex)
接下来,我们开始分别进入这两个模块,猜想一下细节,并提出疑问。
2
模块一:自然语言理解与对话模块
这一部分代表了作为任务导向对话系统(task-oriented dialogue system)的Duplex的核心,如果Duplex能做到其I/O大会上展示的Demo那样的程度,单独这一模块就足够吓人。假设我们将“听起来像人类”的语音合成部分去掉,换上最机械的用预置录音片段拼接的方式,仍然不影响Duplex顺畅的完成它的任务。而这样程度的对话系统,以目前可见的技术,即使在官方强调的“特定领域”(而且是“订位置”这种有明确任务完成指标的简单领域),也是很难单纯依靠其博客中示意的某个单一模型实现的。
为什么这么说呢?在猜想之前,首先简单介绍一下目前这类任务导向的对话系统的主要实现方式。
任务对话系统的实现架构主要有两种,一种我们暂称它为“模块拼接式”,还有一种称为“端到端”。大致的区别在于“模块拼接式”的架构将其要实现的目标拆解成多个有独立输入输出的模块,将模块们组合成完整的对话系统,完成任务。而“端到端”的任务对话系统则企图将用户的输入语言直接映射到系统的回答上,而这一映射通过头尾连接可训练的神经网络组成。好比生产一个桌子,可以是通过生产不同的零件拼装而成,也可能是直接“一体成型”的。而通常“端到端”不是绝对的“一体成型”,大多是主要部分一体成型,再拼接上一些其余的零件。
1、模块拼接式任务对话系统简介
“模块拼接式”的任务对话系统,大致结构如下(实际有很多模块划分的方式,学术论文中与商业应用中的架构也会有所不同):
(图3:模型拼接式智能助理的模块示意)
当用户的一个问题通过语音信号进入到系统时,系统先将语音转化为文字(ASR),这条文字(可能结合语音一起)会被送入“语言理解”(SLU)模块,将非结构化的自然语言转化成结构化的形式语言(意图识别)。这一步将无限种可能的自然语言映射到有限种语言模板上。而语言模板的设计则需要根据对话所在的领域、用户需求、对话目标等判断,来斟酌模板颗粒度、一致性等问题。除此之外,SLU识别出用户语言中是否包含该对话系统关心的关键实体及实体的值(或称为插槽slot与槽值value)。SLU中一般是典型的分类模型,其训练数据来源于在该领域真实对话中,对用户语言的意图及涉及实体的标注。实际部署时还需要结合一些规则,来保障系统的判断。
SLU只负责识别当前一轮用户说的话本身包含的信息,并不会根据上下文推断用户真实的目标。而这一职责由“对话状态追踪”(DST)部分完成。其接受到SLU识别的形式语言后,结合之前的对话历史记录,判断用户的真实目标,并更新一些系统状态参数以表达目标的变化。这些参数会交给“决策”(policy)模块处理,“决策”出下一步行动的形式化表达。这一形式化的表达中,通常也会包含系统要回复给用户的语言模板,而语言模板将被交给“语言生成”(SLG)模块转化为自然语言,再交给“文本转语音”(TTS)模块合成语音回复给用户。
在设计这样的架构时,可以首先做如下思考:“假设用户是聋哑人,你的系统与用户的交流只能通过一组有限的卡牌(比如50张)进行,每张卡牌代表一句形式语言模板。用户与系统是否可以通过轮流出牌的方式达成用户的目标”。这有利于思考设计多少张牌(语言模板颗粒度),如何设计每张牌(语言模板一致性),用什么方法打好牌(对话管理)。牌的设计一旦确定,更改的成本可能包括对训练数据的重新标注、模型重新训练、规则大幅度调整等。
2、端到端的任务对话系统简介
因为“模块拼接式”对话系统下一个模块的决策质量非常依赖于上一个模块的输出。这导致了系统出现问题时往往很难找到是谁的责任,导致比较不容易优化。同时,因为每个模块有各自的目标,也就意味着训练数据需要基于每个模块的目标进行标注,并且当这个系统迁移到其他领域时,还要根据新领域的各种设计重新标注数据,非常费力。
理想情况是,如果能用一个单一的模块,将当前轮用户输入的对话以及历史对话记录的信息作为输入,直接映射到系统应该回答的自然语言(或者系统应该执行的动作)作为输出。那么,对于这样的系统,真实对话数据当中助理方每一句话,都可以直接当做是基于当前历史状态,该轮对话应该说什么的标注数据。从而不需要针对每个模块单独的标注,可以说,就不再需要标注数据了。
另外,这样的系统因为是“一体成型”的单一模型,因此也不会涉及到当系统需要优化时,找不到应该优化哪个模块的问题。系统的优化直接体现为对这个单一模型的训练。
这种架构被称为“端到端”可训练的对话系统:
(图4:“端到端”可训练任务导向对话系统的示意图)
简单的理解是,将用户该轮对话涉及的所有信息(语音、文本、上下文)一股脑输入给模型,让模型输出下一步的语言或行为。根据模型的输出与真实数据的区别,训练模型改进自身的参数,以更好的拟合真实数据。直觉上,这中间又太多不可控的因素,也因此这样的架构更多应用在非任务导向的对话系统当中,也就是机器的回答“没有对错,像人就行”这样的场景下。但近几年对其应用于任务对话系统的研究也越来越多,这样的方式从原理上讲,为什么存在执行明确目标任务的可能呢?
其实对于神经网络,上一层的输出就是下一层的输入。而图3中的“模块拼装式”对话系统,其每个模块的输出也作为了下一个模块的输入。但区别在于,系统最右端输出的结果与真实数据之间比较而产生的误差信息,不会一直向左传导以帮助每个模块进行改进。因此,也需要每个模块根据自己的输入输出构建训练目标,标注训练数据。
那么,能否像神经网络一样,把图3中每个模块相连的部分直接相接,拼成一个大模型,直接基于第一个模块的输入,和最后一个模块的输出来训练之间的映射关系呢?答案是可以的(理论上)。
其实对于神经网络,每一层的输出可以理解为是一个向量(或者一个数组,或者一堆排在一起的数字),这个向量作为下一层的输入数据。而图3中,某个模块的输出,其实也是一个向量。比如SLU模块将用户的语言识别为三种可选语言模板中的第二种,那它的输出一般为(0,1,0)。但这是一个信息表达较为系数也非常离散的向量,是为了让人能理解,为了去对应人类可以理解的训练目标(3类中的第2类)。也因此牺牲了很多信息。因此实际的端到端模型中,仍然是基于类似图3中的某一种模块拼接的思路去定义对话系统的结构,只不过每一个模块的输出不再是一个“人类可以看得懂的”稀疏向量,取而代之的是一个更加稠密的向量(长这样:(1.5, 2.33, 3.8)),是一个机器学习出的,对于这个模块输出结果的编码,这种思想被称为encoding。而这个encoding的向量具备足够的信息,直接作为下一个模块的网络结构的输入。由此,训练时也不需要针对每个模块的目标单独准备训练数据,只需让模型直接学习最终要执行什么或说些什么,由于模型仍然由类似图3的不同网络组合而成,以每个网络输出的encoding向量相连,这个结构是死的,迫使模型只能学习出让encoding向量表达意图、实体、对话状态的方法,这从结果上,实现了图3中严谨的信息传递结构,但又规避了“模块拼接式”对话系统之前提到的诸多弊端。
归根结底,相比“模块拼接式”,人类的大脑更像是“端到端”的,即使被分成很多区域,不同区域管理不同的认知,而其联系的方式也更可能是神经链路上信号的连续分布式表征,人类更可能是依靠这些分布式的电信号意识到概念,而概念并不以物理形态存在于神经网络中(否则如何解释概念模糊的边界和人类善于想象却容易出错的特性)。
听起来,“端到端”可训练的任务对话系统这么好,那它有啥毛病吗?最主要的问题叫做“难以收敛”。我们拿造一台车打个比方,传统的“模块拼接式”对话系统,好比是有个老师告诉AI,车需要发动机、传动系统和车轮。给它一堆零件,并监督它学习好如何设计发动机,等它学好了,再把监督它去学习如何把发动机输出的动力传输给车轮,每个模块学好后,它一个个造出来,拼一起,车造完了。而“端到端”架构则好比是告诉AI,车分3部分,分别是A、B、C,后者依赖前者,然后给它一堆零件,直接告诉它,我要一台能跑的东西,叫“车”,你造吧,造不出来揍你。一直揍到它自己学会把车造出来为止。
这样的“教育”方式一旦成功了,教出的学生肯定是具备很强的举一反三以及自我学习的能力。也就是泛化能力和实时学习的能力。但因为自然语言本身的复杂性,往往把这个学生揍死,它也学不会怎么造车。表现到模型上就叫做不收敛。因此,搭建这样的系统,往往面临几个问题:
1. 需要大量的训练数据:相比“模块拼接式”每个模块的训练都有人类的监督,“端到端”的模型只能通过最终的输出学习出各个模块的参数是否应该调整,应该怎样调整,相对来讲规律的层级更多更隐含,这需要更大量的数据,才足以将这种隐含的高层级的规律表现出来。就如同CNN的每一层从像素、边缘、棱角到器官,不断学习出更高层级的抽象特征,这些特征在低层级(比如像素级)是很不同的(两个人脸照片里的鼻子但从像素数值来讲,看不出有什么共性),但在越高的层级,展示出越多的共性,而越高层级的共性也就需要更大的数据量去表现出来。
2. 难以冷启动:搭建一个基于规则的对话系统,上线后不断与真人对话,进而不断收集数据,以训练更好的模型。这样的冷启动方法很难使用在“端到端”的模型搭建中。因为这样收集的数据缺乏真实语言的海量变化,因此也无法体现背后的高层级共性信息,基本无法用于“端到端”模型的训练。所以,除非具备谷歌这样直接拿到大量真人预订电话录音数据的能力,否则很难冷启动。
3. 在复杂领域里很难有用:像刚才比喻的,“端到端”的方法教学生造辆车估计打死也教不会,但是也许教它造个扳手啥的,听起来就有点可能了。(也因此Duplex只是在特定领域下的应用)
3、Duplex对话系统架构猜想
铺垫了这么多,主要还是想说,如果前述两种任务导向对话系统我们的理解是一致的,这里我们应该能够达成共识的是,“模型拼接式”方法的瓶颈使得依靠其实现Duplex是比较困难的,从官方博客透露的那张示意图也大概可以猜到,Duplex的对话系统是基于“端到端”的方式打造的。
(图5:Duplex对话部分,将用户的语言直接映射到系统的回答语言)
而根据官方博客上透露的一些Duplex与真人对话的录音,大概猜测其模型的架构类似下图:
(图6:Duplex对话架构的猜测)
首先,这个猜测只涉及模块层面,并不涉及模型本身的结构。另外,因为现在能够依据的信息太少,这也真的只是靠“猜”的。难以称得上有依据或者严谨。但它其中仍然包含一些逻辑。
在这个猜想的架构中,用户的语音通过ASR识别为文字后,会通过预设的规则转化为形式语言,将重要实体用形式模板代替。这样形式化后的文本与语音、上文的形式文本一起送入一个encoder模型,其将这些原始信息编码成两个语义信息向量,一个代表本轮用户的语言,另一个代表上几轮对话。
同时,通过ASR识别的文本还会与上几轮对话的文本、通过google assistant传来的条件参数(代表对话的目标,用户本身的信息等大前提)一起进入另一个网络,其根据输入的信息输出一个代表当前对话状态信息的向量。这一网络很可能具备每一轮对话为一个step的循环结构,意味着这个对话状态信息的更新会参考前一轮对话状态的信息。
这解释了,为何Duplex会在每一轮对话都可以意识到自己任务执行到了怎样的程度。比如,在预订剪头发的对话过程中,Duplex接收到的任务是预订5月3号上午10-12点时间段,而它先说“我要预订五月3号的”,这时对方问“你要预订大概几点的?”,它才回答“大约12点”。也就是说,它的某些结构需要记忆任务已经完成的进度,并据此而更新下一步的行为。否则,如果它不具备记录这一能力,当说完预订日期后,对方直接说“好的”,并安排了一个下午5点的位置,它也不具备区分这一情况对错的能力。
截止到这一步,获得了对本轮人类语言、上文语言、对话状态的表征,将三者送入另一个模型,输出关于Duplex要回答什么语言以及实体信息的表征向量,再将其解码,并拼装成最终要回答的语言。至此,完成了一轮从人类语言输入到Duplex回答语言生成的对话。
说实话,我不太相信基于端到端的架构,可以达到Duplex展示的Demo当中一半的对话水平(单说对话部分,暂时不包含语音合成)。举个简单的例子,当对方说“We don’t have a 12 pm available. The closest we have to that is 1:15”,从Duplex的表现可以看出,它是知道1:15作为一个时间,晚于其任务中指定的时间段10:00-12:00,并给出了准确的提问“Do you have anything between 10 am to 12 pm?”。而这一对于人类很简单的常识性概念推理,在Duplex的架构中又存在于什么地方呢?或者说,其信息是从哪里体现和传递的呢?
如果说这一信息直接体现在人类一方问题的字面上,因为她说了“We don’t have a 12 pm available.”那这是否意味着,如果人类只是简单说“Sorry, the closest we have is 1:15”。这背后隐藏的逻辑推理问题将难以被Duplex学习到呢?那这系统也太不健壮了。
另一种可能是,虽然Duplex并没有真正理解人类所说中体现了1:15晚于10:00-12:00的内在逻辑,但因为基于大量的数据学习,它只是模仿了人类在遇到此类情况时(在某个任务条件下)惯常的回答而已。我觉得这个方式也不靠谱,这意味着对于“最接近的只有1:15有位置”,“最接近的只有1:16有位置”,“最接近的只有1:17有位置”这些情况,Duplex都要当作他们是各自不同的情况独立学习。这将使得模型更加难以收敛,需要更大量的数据。想象一下即使在这个剪发预约的垂直领域里,也会存在不少这类需要常识结合逻辑的情况,每个情况的学习都会对训练数据的需求翻倍增加,几个情况加一起,可能需要的数据量级是天文数字。
更有可能是,基于一个知识图谱,预设好实体与实体间的关系,在架构当中包含对该知识图谱检索信息,如下图:
(图7:Duplex对话架构的不负责任的猜测2,加入知识图谱)
这里面有很多细节值得商榷,比如如何将用户与系统的对话语言映射为知识图数据库的检索query?是通过模型还是rule-based?加入知识图谱结构又如何实现端到端可训练等等,在这里就不展开了(毕竟我们只是基于瞎猜的 :P)。
说实话,还有一种更大的可能,就是类似上述这种具备推理能力的对话,以及Duplex其他具备常识推演与深刻理解能力的对话,其实都是基于规则的补丁为模型的随意性在做着保障。用规则补丁结合巧妙筛选人类一方的话术,反复实验,再cherry picking,采集少许完美的特例,收割一波舆论。好听点叫hack,难听点叫fake。
至此我们聊完了构成Duplex“听起来像人”两大因素中的第一个,它的自然语言理解和对话能力。最终我的感觉是,以目前的技术,几乎很难robust地实现Duplex在demo中展示的对话能力(达到其水平的一半都很难),很大可能demo是做了巧妙的hack,并cherry picking了最好的特例来展示,很难普遍地达到那样的对话水平(希望几个月后证明我是错的)。
3
模块二:文本转语音模块
如果不幸被我说中,对话部分并没有本质的突破,那Duplex在展示什么呢?这就要回到之前我们提过的两大致使Duplex“像人”的原因,除了上述我们分析的“自然语言理解与对话能力”,还有另一个,就是“语音合成能力”,它使得Duplex说出的语音在语调、语气以及一些语言习惯上,听起来很像人。很多细节使我不禁觉得,Duplex这次的展示,实际上最主要的目的是为了凸显其文本转语音(TTS)技术最近一年里的突破进展,以及秀一秀将这一技术在工程上进行漂亮整合的样板。(而为了让观众能get the point, 总不能配一个智障一样的对话系统,因此在对话部分做了必要的hack)
在谷歌的官方博客中,提到Duplex的文本转语音(TTS)是使用了concatenative TTS,synthesis TTS engine的结合(注:Tacotron: http://t.cn/R1QUquM 和 WaveNet: http://t.cn/Rc5bAUM ),由此来控制不同情况下的语调。我们首先来简单了解一下这三种TTS技术的大概原理。
1、三种TTS方法的介绍
首先concatenative TTS翻译为联结式文本转语音,构建一个concatenative TTS系统,首先需要录制大量的语音数据,然后根据语音中停顿的点将他们切碎成小的片段,这些小的片段构成了海量的可选语音片段。
而模型学习的任务就变成,给定一段文字的序列,如何在这海量的可选语音片段中,选择出一个语音片段的序列,其联结在一起后组成的语音与真实数据中该段文字对应的语音最接近。
(图8:concatenative synthesis示意)
而Tacotron代表了另外一类方法,这类方法不再将语音合成问题转化成在语音片段库当中做选择,而是希望能够直接建立模型,将文字映射为声音。
但是,文字直接映射为声音最开始非常难以建模,于是问题被转化成了首先将文字映射到语言特征,再将语言特征映射到声学特征,最后将声学特征映射到声音。而这每一个环节的转化,都可以单独训练模型完成(比如:从文字到语言特征可以是抽取文字当中的part of speech或者semantic parsing这些语义信息,而这样既是单独训练文字映射到语言特征的传统NLP任务),也可以整体从输入到输出训练端到端的模型,部分环节还可以基于规则(比如一些声学特征到声音的映射关系是直接基于数学变换的)。
(图9)
从Tacotron的架构可以看出,它是采用文字-语言特征-声学特征-声音的映射方法。通过character embedding和几层网络,将文字编码成带有语言特征信息的向量,再将这个语言特征向量通过几层网络转化成mel spectrogram这一音频信号检测当中常用的声学特征,最后这一声学特征被通过网络转化为音频(我只找到了Tacotron2的架构图,而在2当中,将spectrogram转化到waveform的网络使用的是一个类似wavenet的结构,但这里我们先不用在意,不管什么结构,总之就是做了一次转换)。显然Tacotron是端到端可训练的。
(图10: Tacotron的架构)
WaveNet则更进一步的去思考,是否可以直接将文字映射到音频(raw waveform),而不通过声学特征进行中间转化。音频实际可以看做一组非常长的数字序列。以普通的16khz采样率来说,16khz采样的意思就是,从1秒钟的音频数据当中,记录16k个也就是16000个样本(平均每隔1/16000秒记录一个),记录的是什么?是当下时刻这个音频的强度(有多响)。由此,将连续的音频数据转化成离散的强度的序列。
那么我们立刻想到,既然一段音频可以表示成一个长长的数字序列,那我们用序列已有的数字去预测下一步的数字,不就可以给音频进行建模了吗?RNN家族不就是干这个的吗?
不能,因为比如人类说话,其音频的依赖关系大约在200毫秒的范围内,如果1秒有16000个数字,那200毫秒就是3200个数字,RNN要有3200步那么长,这么长的RNN没法训练。因此呢,WaveNet使用了一种结构叫causal dilate convolution layer,使得3200这么长的依赖关系可以被建模。
(图11:causal dilate convolution layer结构示意)
而其架构如下图所示,大概是将一段音频有重叠的切分成200毫秒的片段,将这些片段分别送到基本类似图11这样的结构(Residual block)当中,将这些block输出合一起,再加工加工,做几次转化,最终预测这段音频的下1/16000秒的那个音频点的强度是多大(从0到255中选1个,为分类问题)。
(图12:wavenet架构示意)
目前为止它还只是一个音频模型,如果用它做文本转语音,还需要给他文本信息。如下图所示,将每个时间步的文本进行embedding,将embedding的结果分别喂给不同的residual block,剩下的结构与图12中没有文本信息的结构一样,这样学习的模型会变成以文本信息为条件的音频强度条件概率分布,也就是说,具备了基于文本信息合成语音的能力。
(图13:wavenet用于TTS示意)
2、Duplex在TTS中使用的一些工程,产品trick
作者提到,wavenet的好处是它不再基于对人类语音服从某些潜在概率分布的假设,也就不再试图去将声音向这些假设的分布去拟合,这样出来的效果会更加自然。但它的坏处也很明显,需要大量的训练数据,很长的训练时间和计算资源,同时生成的时候也非常慢(费那么大劲生成1个音频的sample,而合成1秒钟的音频需要16000个这样的sample)。生成一段音频所需要的计算时间比这段生成出来的音频本身的时长还长。试想一下如果只用wavenet做语音合成,在实际应用中是什么效果。
也因此,在Duplex的使用当中,需要对这三者进行结合。同时使用了一些工程上的trick来整合这三种方法。比如有趣的停顿词(“额..”“哦…”这些)的使用。
根据我们前面的介绍,可以看出concatenative TTS是显然要快于后两种尤其是wavenet的,但其因为是将本不在一起的音频片段硬拼在一起,所以flow不够自然。所以Duplex的concatenative TTS在联结两个相差较大的音频片段时,加入这些停词,让其更自然(听起来,这些停词也是预先录制好的音频片段,而且是基于规则再预先训练好的TTS模型基础上增加上去的,因此也没有去训练学习在不同的flow下选择怎样的停词音频)。而停词的另外一个用法,则是在等待Tacotron 和 WaveNet合成语音时,帮助Duplex缓解尴尬。
值得注意的是,博客中提到,Duplex系统的延迟会去匹配人类的预期,比如当人类说“hello?”的时候,显然期待更低延迟的回复。因此,他们会在系统前面套一个简单的模型,这个简单模型的任务是用来区分人类目前是否可以接受高延迟。如果不能,这轮对话进入的也许就不是上述的Duplex系统,而是一个不那么复杂的模型。
基于谷歌博客中Duplex架构的示意图(图1),可以看到其TTS部分只依赖于本轮系统决定要说的话的文本信息,而并不基于任何对话历史,甚至刚刚一轮人类说了什么。由此,Duplex又是如何如其demo展示的那般,控制自己的语调以匹配人类的问题呢?如果将上一轮对话的信息也作为Duplex TTS模型的输入,那每一条训练数据必须包含了这句话的文字、语音以及之前对话的内容。这样的数据如何获取呢?单纯依靠电话订餐领域的录音足够训练出具有通用语音合成能力的TTS模型吗?
当Duplex真正上线时,假设我们有幸接到它的电话,可以试试在它说完一句话后,问它“你能放慢速度重复一遍刚才的话吗?”也许就知道答案了。
在博客中还提到,Duplex上线部署后,会有一个人工监督系统辅助其适应全新的对话领域,直到Duplex自己可以在新领域里达到一定水平。这个事情在“模块拼接式”的对话系统当中的实现方式是非常直观的,因为每个模块的输出都是一组预测以及对应的概率,比如SLU模块输出的是对用户该语言属于哪个语言模板的预测,它会给出几个可能的选项,并且每个选项给一个概率(置信度)。我们可以设计一个系统,当这个概率低于某个阈值的时候,呼叫人类客服介入审核,客服会将这句话准确的分到对应的语言模板,系统将客服的选择递送到下一步,继续执行下一步工作。当某些模块的备选项中没有对应的选择(比如用户说了跳出该对话系统所在领域的内容时,超出了AI的理解范围),客服甚至可以直接接管,与用户进行沟通。这样的方式在保障系统服务质量的同时,可以实时生成、标注数据,一举两得。而在端到端的模型当中,因为没有分拆的模块和独立的输出,模型整体是一个黑盒,人类可以实时监督的只有模型最终的输出,这样的实时辅导系统的效力会降低一些。
至此我们聊完了Duplex的大致原理,最后说说观点。首先我不太看好依靠博客中的简单架构可以实现Duplex的demo中展示出的对话能力。不是google不强大,而是不依靠symbolic的方法,很难完成较为复杂的常识与逻辑计算。可以想一想,是否有哪种统计学习模型可以依据文本信息学会四则运算,比如“1136123142 x 9037856812=126523535525235 ”,基于大量这类四则运算的文本,是否有哪种统计学习模型的结构,可以完成根据等式左边的文本,生成等式右边文本的能力呢(虽然存在很多用模型学习四则运算的paper,但基本都使用了非常针对性的特殊结构或者symbolic的输入,缺少通用性)?而人类语言当中蕴含的逻辑信息,结合常识信息,是超越于语言文本本身信息以上的高层信息,逻辑都可以被抽象表达为运算,也就是我们每一句带有逻辑推理的语言背后都潜藏着一个运算公式,而运算本身是无限的,但运算的法则是有限的,人学会1+1=2就学会了所有整数的加法,就可以产出无限个加法等式的文本sample。而机器通过运算本身表现出的文本信息,学习运算的法则,这样的抽象能力可能要比CNN将图片像素抽象出鼻子眼睛还难得多。而这在我看来等同于通过文本信息学习逻辑的难度。这也是目前的对话系统还都是“人工智障”的一个原因。而Duplex在这个层面有重大突破,使得多轮对话不再智障,我表示怀疑。
4
结尾闲聊
这是AI产品脑洞实验的第一篇文章,基于对Duplex的好奇,进行了一些拆解,主要着重于实现的原理,一下子超了预期的篇幅,也就并没有再关于它的应用场景以及商业化进行讨论。后续的文章侧重应用场景、痛点需求分析或者实现原理,还是商业化,会根据每期选择主题(可能是一个产品,或者一个场景,也可能是一个demo)的不同而不同。也希望大家能够多多关注,跟我一起完成周期性的刻意练习,一起开启头脑风暴,或者侦查模式。
最后的最后,虽然这篇没聊商业化的部分,但还是说一个有趣的事,关乎到技术商用发展的灰度问题:想一下,如果Duplex实现了顺畅的帮主人打电话预订餐厅和剪头发,那么实现帮餐厅和理发店老板接听预订电话也应该很容易吧。那时,大家用电话沟通的琐事都交给自己的机器人助理,每时每刻都有机器在互相通着电话。可是,如果机器只需要跟机器通话,那他们为什么要使用人类的语言?又为什么还要通过电话?直接用清晰的业务逻辑通过互联网交换信息不就行了吗?那这是啥?这不就是现在的线上预订系统吗?(这么说,美团才是Duplex的终极形态 :p)
类似的还包括,AI要足够智能,自动驾驶才能学会处理各种复杂的交通情况,才有可能普及,才有可能每辆车都是自动驾驶的,而每辆车都是自动驾驶了,交通情况就不复杂了,反而精确可控了,AI也不用太智能了。
这个问题留给大家茶余饭后讨论了,我的感觉是路径的选择比终局的思考更有价值,毕竟这个世界是具有不可预测性的。
注:本文5月24日首发于饭团“AI产品经理大本营” ——黄钊hanniman建立的、行业内第一个“AI产品经理成长交流社区”,通过每天干货分享、每月线下交流、每季职位内推等方式,帮助大家完成“AI产品经理成长的实操路径”;详情可点击“阅读原文”查看。
赞赏金额,会转给本文原作者
---------------------
作者:黄钊hanniman,图灵机器人-人才战略官,前腾讯产品经理,6年AI实战经验,9年互联网背景,微信公众号/知乎/在行ID“hanniman”,饭团“AI产品经理大本营”,分享人工智能相关原创干货,200页PPT《人工智能产品经理的新起点》被业内广泛好评,下载量1万+。