:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

锐眼洞察 | 关于机器学习移动端训练的思考

cialis erfaring cialis i norge hva er kamagra cialis efeitos secundarios cialis bula viagra effekt viagra norge viagra på nett viagra nettbutikk viagra infarmed levitra comprimidos cialis uten resept cialis pris levitra eller cialis kamagra gel comprar viagra farmacia
Tech

锐眼洞察 | 关于机器学习移动端训练的思考

作者:TalkingData 研发工程师  张永超

本文为TalkingData原创,未经授权禁止转载。申请授权请在评论中留言联系!

毫无疑问,目前在移动设备上,机器学习以及机器学习应用正在强力发酵。苹果在WWDC 2017 的各类主题演讲中,大概提到了机器学习百次左右。所有的关于机器学习的框架、架构层出不穷,各个开发者也正在争先恐后地将机器学习添加到他们的应用程序中。

然而事实却并不像我们想象的那样?目前,大多数这些将机器学习添加到应用中的情况,却仅仅是用于机器学习中的最后一个阶段——预测、推理,而这个阶段只是使用一套固有的知识进行预测。尽管各处都宣扬使用了“机器学习”这个专业名词,但是实际上这些都没有将机器学习的核心——模型内部的知识——直接在设备上进行学习

可能有一个很大的原因是,训练一个机器学习模型需要大量的计算资源和计算能力,而对于移动设备来说,资源有限,而且速度并不理想。对比服务端进行离线的模型学习、训练,并在每次应用更新中更新其所包含的模型更为实用。

但是这种方式却有一个致命的弱点:模型的学习训练需要时间、应用的开发测试需要时间、应用的上架审核需要时间等等,诸如此类耗时的任务直接导致了应用更新的滞后,甚至失去一些用户(例如由于模型有误,导致识别结果大相径庭,但是需要更新修复这个模型,需要经历上述几个耗时的任务流程)。

也就是说,对于那些包含了机器学习的应用来说,在设备上直接进行模型的学习训练的确有意义,而且意义重大。相信在设备上直接训练机器学习模型与在设备上使用模型进行推理预测相同,仅仅是时间问题。从无到有、从有能力到能力强势等。

Now. Just 推理&预测

如今的iPhone已经不同于以往任何时期的移动智能设备,硬件上,苹果有自研的处理器和协处理器等,软件上,iOS 系统已经更新迭代到了 iOS 11,iPhone的每次版本升级都带来了业界无与伦比的惊叹和体验。日前,iPhone X的问世,更是吸引眼球无数,从全面屏的设计开始,各种技术的革新也让业界惊叹,从指纹识别到面部识别、从普通相机到高效智能颜值相机,无不体现了苹果的设计理念等。而吸引所有开发者的是应用在相机、照片、视频中的机器学习技术,这一技术被称为计算机视觉

但是机器学习并不仅仅使用与图像和视频,还可用于音频、语言、时间序列和其他许许多多类型的数据。当下的智能手机,附带着少则好几个,多则十几个不同的传感器设备,已经更加快速的互联网接入能力,使得大量的数据源源不断地产生,机器学习所要处理的数据也时刻在变化。例如 iOS 设备上,相机和照片应用中的人脸检测Hey Siri汉字手写识别等,都使用了机器学习技术来实现。

但是,需要注意的是,这些机器学习技术也只是使用了机器学习最后的一个阶段 — 预测、推理,模型并没有在设备上实时的对用户的使用情况进行学习。

目前,大多数开源的移动端机器学习框架,例如 MPSCNN、TensorFlow Lite、Caffe2等也都只支持推理预测,也就说,开发者可以使用这些模型,并根据用户的数据或者行为进行预测,但不能让这些模型在设备上从用户的数据或者行为中学习新的东西。

目前,在机器学习模型构建的过程中,通常会使用拥有大量GPU的服务器群进行训练,并且需要大量的数据。例如CNN,要使用数千万的图像进行训练,从开始训练到一个模型输出,在拥有多个GPU资源的服务器上可能要花费数天,在一台PC上,可能要花费数周,在移动设备上可能就不仅仅是时间和电量的问题了。

另外,在高端服务器中进行模型训练并不是每个人、每个公司都能够hold住的,不仅是money的投入,还需要专业人员,当下最常使用的方式是,每个应用程序中都会有一个模型存在,并且模型是完全一样的,当需要模型进行版本更新时,就重新发布该应用程序的版本,或者由应用程序从云端下载新的模型或者参数等。

今天看来,在移动端进行模型的训练时不可行的,但是并不意味着永远不可能。当模型的体量有现在普遍的几十兆甚至上百兆压缩到只有几兆,模型的训练不需要大量的计算资源,仅仅小部分的资源就可以进行的时候,在设备上进行模型训练就不是难事了。

为什么要在设备上训练?

在设备上进行模型训练,有一下几个好处:

  • 应用程序可以直接从用户的数据或者行为中学习;
  • 数据永远不会离开设备,利于隐私保护;
  • 在设备上直接训练模型,也省去了租用或者购买大型服务器的费用;
  • 可以随时进行学习和更新模型

以上好处虽然并不适用于所有开发的情况,但是在设备上训练无疑是受用的。另外在设备上直接训练学习还有一个更重要的好处:每个模型对于用户来说都是独特的,也就说是用户定制的模型

说了这么多,难道就没有在设备上直接进行学习的应用么?搜集到如下的iOS应用程序已经在设备上进行学习训练了:

  • 键盘:手机上的键盘从你的历史输入中进行学习,并对句子的下一个单词提出建议。这就属于一个个人定制模型,模型是专为你训练的,并不适用于其他人。由于学习训练是在设备上直接进行的,因此无论你输入什么内容,都不会发送到服务端,保护了你的隐私。
  • 照片:照片应用会自动将图像进行归类。这个应用使用了人脸检测API来检测照片中的人脸,然后将相似的人脸组合在一起,另外你可能已经发现,你可以人为的对归类的照片进行纠正,有相同的照片出现时,照片会归类到你纠正的那类中去。猜想这里使用了无监督学习方式,但是无论算法是什么?以及算法是如何工作的?照片应用会根据用户的数据再次进行学习训练。
  • 指纹识别、面部识别:这两类都会根据你输入的指纹、人脸不断的进行学习。例如指纹识别,加入某次我们进行指纹识别失败了,iPhone会让你通过密码解锁,而同样的指纹在下次进行解锁时,就顺利通过了,同样的面部识别也是这样。

或许还有一些应用有在设备上直接进行学习训练,但是不管是那种应用,这都是一种全新的尝试,相信会有越来越多类似的应用程序,具备直接在设备上进行学习的能力。

我们能走多远?

如果在设备上进行学习训练的目标是使得机器学习模型能够适应特定用户的需求或者使用模式,那么我们可以使用这种方式做什么呢?

GitHub上有一个有意思的例子,是一个简单的神经网络, 把手势变成表情符号,它可以通过你画出的几个不同的形状,学习训练模型来检测形状的神似表情符号:

Screen_Shot_2017-12-03_at_3.02_.05_PM_.png

如果对这个项目感兴趣,你可以参考 Understanding How Machines Learn, Through Prototyping,对此神经网络是如何工作的,进行了描述。

这个神经网络是一个简单的2层圣经网络,并且实现了在设备上训练。这个项目很像iPhone X上Animoji,通过面部识别构建用户的面部3D模型,然后根据用户的面部表情来选择一个面部符号,并会同步你的动作。

那么还有那些机器学习模型可以类似这样的方式呢?

  • 智能回复:Google日前推出了一个Smart Reply模型,用于分析传入的文本或者邮件,并提供一个适当的回复内容。这个模型目前还不能在设备上学习训练,因此不同用户如果有类似的输入,它会为每个用户推荐相同类型的回复。假设这个模型可以在设备上直接学习,那么每个人得到的回复就会根据这个人的语言习惯而定了。
  • 手写检测:将书写的内容转化为文字,可能并不是新鲜事,但是几乎没有那两个人书写的方式是相同的,如果在同一个设备上,两个用户的书写方式不同,那么这个模型或者叫标准模型的输出就可能会犯错。假设手写检测模型是一个由用户自定义的模型,可以从你的书写风格中进行学习,识别特定的细微差别,那么两个不同书写风格的书写,就不会简单的由标准模型去输入了(重新学习或者再次学习)。
  • 语音识别:常规的语言识别要求输入都是标准普通话,但是中国地大人广,各个地方的方言不尽相同,对于不同的输入,标准模型往往错误连连。假设能够针对每个人进行模型的学习训练,该模型就成为了个人的定制模型,对你的输入敏感,识别命中率也会提升了。
  • 睡眠跟踪、健身:这类应用目前是需要将数据上传到服务端进行分析,然后再给出建议的。假设这些数据不需要上传到服务端,直接在设备上进行学习训练,然后给出建议结果,你的数据就不会离开设备,保护了你的隐私。
  • 个性化的会话:聊天机器人的发展如今已是如火如荼,但是我们在和聊天机器人交谈的时候,希望机器人能够适应我们,包括语言风格、个性等。假设聊天机器人能够不断的学习你如何说话以及说话的风格,并且能够定制机器人的反应,那么聊天机器人就能够适应你的个性和说话风格了。
  • 更好的广告:没有人喜欢广告,但是机器学习可以减少这个烦扰和干扰,但是广告商却更有利可图。假设广告SDK可以了解你经常点击和关注的广告,并在本地进行学习训练,得到你喜欢哪些广告,然后请求只适合你这个特定用户的广告来展示。
  • 推荐:推荐系统一直是机器学习中重要的体系。例如电商、博客、新闻等等,会根据你的历史收听进行学习训练,并推荐接下来的内容,但是目前这些都是基于云的。假设没有云,那么这样的应用程序该怎么办呢?可能只有本地模型能够解决这个问题。
  • 助残类应用:假设应用程序可以了解残障人士的环境,以帮助他们进行导航,这对于此类人群来说可谓帮助巨大。

在使用机器学习模型上,每个人可能都是不同的,所以我们使用机器学习模型经常是与场景想联系的,以便适应我们特定的需求,而不是去构建一个万能的模型。

不同场景下的模型训练

在对机器学习模型进行部署使用前,往往需要先进行学习训练。之后,会不断的完善模型,相信在设备上进行训练的最大好处就是为每个用户定制模型,而关键的是在特定用户的数据上进行训练,而不是使用通用的数据集。

以下是集中模型训练的不同场景:

  • 直接不使用用户的数据:收集自己的数据或者使用公开的数据集来构建一个通用模型。无论何时改进模型,都需要发布新的应用或者下载新的参数。这就是目前机器学习功能应用的现状:离线训练,只使用模型进行推理预测。
  • 进行中央化学习:假设你的应用程序或者服务已经收集到了用户的数据,那么你就可以在服务器上进行学习训练,这些是可以的。将用户的数据发送到服务器,并保存在服务器上,之后从这些数据中挖掘信息进行学习训练,得到模型,可能改模型是一个标准模型,也可能是一个定制模型。Facebook目前就采用的是这种方式。但是这个方法都有一个缺点:需要不断扩展的存储空间,以确保数据有地可存。我想这也是在设备上学习训练的意义所在。
  • 联合学习:这一概念是Google在Federated Learning: Collaborative Machine Learning without Centralized Training Data一文中提出的方式,每个用户训练模型中的一小部分,然后共享给其他用户,以便其他人也能够从你的数据中进行学习。更详细的说明,可参考 《分布式机器学习时代即将来临?谷歌推出“Federated Learning”》一文。
  • 每个用户都训练他们自己的模型:每个用户在自己的设备上进行模型训练,模型可以从零开始训练,也可以使用一个预先训练好的模型,然后根据自己的数据进行微调,不断的改进模型。例如键盘的预测,以一种特定的语言训练的通用模型开始,然后根据用户的输入进行模型改进,以适应用户的输入习惯等。但是这种方式的缺点是,其他用户无法从你的学习训练过程中受益。另外还有一个问题是你可能拥有不止一台设备,如何在这些设备之间进行模型共享以及训练也是个挑战。

最后

以上内容只是一些对现状的描述和思考,在不断的技术革新过程中,说不准还会出现另一种更加友好的机器学习移动化方案,因此在软件设计的过程中,我们要不断的进行技术学习,以及时刻准备着革新。

参考资料

 

Leave a comment

随时欢迎您 联系我们