查看原文
其他

Google要逆天!Google Wear 2.0 最新离线AI技术解析

2017-02-21 林师授 51CTO博客

近几年,人工智能领域显得异常的活跃。除了传统的机构学术圈外,Google、Microsoft、Facebook、苹果以及国内的百度、阿里等等优秀的互联网企业也纷纷成立了相关的研究团队,并取得了很多令人瞩目的成果。


Google的AlphaGo向全世界展示了强大的运算能力,Siri和Google Now中的语音识别能力,国内百度的小度机器人在“最强大脑”上展现的语音、图像识别能力,这些优秀的项目都极大的反应了人类在人工智能领域的飞速发展。但是,无论是语音还是图像识别,很大程度上都依赖于云计算来满足大量的运算和存储,而移动、PC设备,都需要时时刻刻通过互联网的连接,获取计算资源来达到人工智能的目的。


不过近期,在Google发布的Android Wear 2.0中,除了允许手表脱离手机直接使用外,更加让人震惊的是“智能回复”(Smart Reply)能力,官方技术团队认为,这是基于离线AI实现的,无需接入网络去寻求云计算帮助,就能够实现自我学习的目的。


(图片来自 engadget)


在此之前,包括作者在内,都认为对于智能手表这样的移动设备,在有限的计算能力和内存容量上,如果不连接云端就能够拥有自我学习,“智能回复”等能力,这几乎是不可能的事情。直到Google的一支名为“Expander”的AI研发团队做到了,并移植到Android Wear 2.0上且得到很好的效果!他们通过重新设计了一套更加轻量、全新的机器学习框架,不仅能驱动 Android Wear 2.0 上的 Smart Reply,还可以给更多其他离线移动应用带来巨大的帮助。不过在此之前,他们也尝试了很多比较流行的神经网络和图形学习技术,但是建立的模型并不适合应用在移动平台,限制回复的数量也打不到预期效果。通过这套轻量,简单的系统,可以将预期回复相似的消息,比如“你最近好吗?”“过得怎么样?” 迅速归类到一起,以此减轻Smart Reply给内存带来的压力。


在此之间,作者联系到了在Google 负责Android工作的梁宇凌老师,他介绍说,AI一般指的都是机器学习,主要分为训练和预测两个流程。训练时需要海量数据和强大的计算能力,因此通常还是在云端进行训练。训练结束以后得到的模型,进行单次预测时不需要海量数据和计算能力,所谓的离线AI,往往是指把网上训练好的模型存在移动设备上,进行预测。因此技术难点往往在于如何把模型的size缩小,以及减少预测时的计算量和加快预测速度。这方面有很多办法,现在很热的AI芯片加速就是其中一种办法。


其实Android Wear 2.0的离线AI技术并没有采用深度学习,而是通过一种叫semi-supervised graph learning(半监督图学习[1])的技术,其中技术核心部分在于对设备上的信息内容(例如聊天,短信等等)高效地映射到相应可能的自动回复。而在Smart Reply中采用了一套全新、且比较轻量化的机器学习架构,他不仅仅能够满足智能回复功能,将来还会在很多离线的移动应用中带来巨大的帮助。


接下来,作者整合了梁老师的建议以及Google官方技术团队的博客,具体分析Android Wear 2.0离线AI技术的实践思路。


Google wear 2.0 智能回复


学习与投射

建立轻量级会话模型的一个简单的策略是,在设备上创建的内容是常见的、且有规则的小字典(比如输入→回复映射),并且在推理时使用一种较为朴素的查询策略。这里牵涉到使用几个特征的一小组类预测任务,(比如二元情感分类,“我爱这部电影”传递了一种积极的情感,而“演得很糟糕”这句话传递了消极的情感)。但是,它缺乏良好的扩展性,无法支持聊天消息中常见的丰富词汇和众多复杂的语言变化。另一方面,递归神经网络(比如LTSM)等机器学习模型是功能极其强大的工具,适用于自然语言理解任务中的复杂序列学习,包括“智能回复”。然而,压缩这类丰富的模型用来适应很小的内存设备,并通过降低计算成本获得可靠的预测(迅速按照需要处理),那非常有挑战性。Android Wear 2.0团队早期尝试通过限制模型、只预测一小批回复,或者使用量化(quantization)或字符级模型(character-level model)等技术,但是都未能获得很好的结果。


最后,通过为设备端机器学习系统构建一套不同的解决方案。思路是,先使用一种快速、高效的机制,将相似的消息分成一组,并将它们投射到相似(“邻近”)的位向量表示。虽然有几个方法可以执行这个投射步骤,比如使用单词嵌入或者编码器网络,但最后Android Wear 2.0采用了一种经过改动的局部敏感哈希算法(LSH), 将维度从数百万个独特的单词简化为短小的、固定长度的位序列。这样能够非常快地为消息即时计算投射,并且在设备上占用的内存空间更小,因为不需要存储消息、单词嵌入或者甚至是用来训练的整个模型。



投射步骤:相似的消息分到一组,被投射到邻近向量。比如说,“hey, how's it going?”和“How's it going buddy?”这两条信息有着相似的内容,可能被投射到同一个11100011。另一个相关的信息“Howdy, everything going well?”被映射到只相差2位的邻近向量11100110。


接下来,系统通过消息及其投射后,共同训练成“消息投射模型”,该模型学会使用半监督式图形学习框架,预测可能合适的回复。图形学习框架想要训练成一个可靠的模型,其办法是结合来自多个来源的语义关系(消息/回复交互、单词/短语相似性、语义聚类信息),并且学习有用的投射操作,这些投射操作可以映射到出色的回复预测。



学习步骤:(上面)消息连同投射和相应回复一起用于机器学习框架,共同学习一个“消息投射模型”。(下面)消息投射模型学会将回复与相应的消息投射关联起来。比如说,该模型将两个不同的消息:“Howdy, everything going well?”和“How’s it going buddy?”(底部中间)投射到邻近位向量,并学习将其映射到相关回复(底部右边)。


上述值得一提的是,虽然可以使用复杂机器学习和云计算的能力,训练消息投射模型,但是模型本身驻留在设备上,而且完全在设备上执行并推理。设备上运行的应用程序可以传递用户的消息,并从设备端模型接收回复预测,而数据不用离开设备。而且还可以改动该模型,以适应用户的书写风格和个人偏好,从而提升个性化的体验。



推理步骤:该模型将学到的投射运用于消息(或消息序列),并建议相关的不同回复。推理工作在设备上执行,让模型得以适应用户数据和个性化书写风格。


为了让设备端系统能够开箱即用,Android Wear团队也不得不进行几个额外的改进,比如专门进行了优化,以便加快设备端计算,以及从模型生成丰富多样的回复。


离线AI从手表交流到应用

从一开始,Google Wear团队开始踏上从零开始开发这项技术时,对于模型的预测是否有用和准确率其实心里没底。但是完成整个项目后,他们惊奇的发现这项技术在即便在计算能力和存储资源非常有限的Android可穿戴设备上效果能够达到预期,这使得整个团队都非常的兴奋。接下来他们还会继续改进模型,为用户提供更出色的会话体验,也会充分利用这个设备端机器学习平台,带来全新的应用,类似此前Google推出基于人工智能应用Allo 的APP,让沟通更加简单,工作效率更高。



因此,Android Wear团队还提供了非常丰富的API接口,为第三方使用Wear的设备接入并使用Smart Reply能力,比如,如果想要对您的通知操作启动Smart Reply,需要执行以下操作:

  • 使用NotificationCompat.MessagingStyle

  • 对通知操作调用setAllowGeneratedReplies(true)

  • 确保通知操作具有RemoteInput(相应驻留)


以下示例为如何使用智能回复响应创建MessagingStyle通知:

// Create an intent for the reply action 

Intent replyIntent = new Intent(this, ReplyActivity.class); 

PendingIntent replyPendingIntent = 

 PendingIntent.getActivity(this, 0, replyIntent, 

  PendingIntent.FLAG_UPDATE_CURRENT); 

 

// Create the reply action and add the remote input 

NotificationCompat.Action action = 

 new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, 

  getString(R.string.label), replyPendingIntent) 

 .addRemoteInput(remoteInput) 

 

// 1) allow generated replies 

.setAllowGeneratedReplies(true) 

 .build(); 

 

Notification noti = new NotificationCompat.Builder() 

 .setContentTitle(messages.length + " new messages with " + sender.toString()) 

 .setContentText(subject) 

 .setSmallIcon(R.drawable.new_message) 

 .setLargeIcon(aBitmap) 

 // 2) set the style to MessagingStyle 

 .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name)) 

 .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender()) 

 .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender())) 

 

 

// 3) add an action with RemoteInput 

.extend(new WearableExtender().addAction(action)).build(); 


如果想要接入更多的扩展能力,需要进入>>

https://developer.android.com/wear/


最后,梁老师还跟作者表示,Google现在有好几个项目都有离线AI,例如Google翻译。但针对不同应用场景,具体的实现技术有所不同,例如Google翻译上的方法和Wear 2.0的Smart Reply用的就不是同一种技术。针对Smart Reply是否能够开源的问题,梁老师没有去评论,不过他建议大家可以关注一下刚刚发布的TensorFlow 1.0版本[2],里面演示了在Android和ios上实现基于深度学习的图像识别的能力,也有非常好的例子。


[1]:https://arxiv.org/pdf/1512.01752

[2]:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存