Apple在机器学习领域都做了什么

众所周知,在WWDC2018上提出的Create CoreML让很多iOS开发者徘徊在入门人工智能的门槛前减少了一些顾虑,Apple正在为我们提供更加简单的方式来使用人工智能解决问题。不得不承认,这是苹果一贯的作风:将复杂问题简单化。而在WWDC2017的时候就推出了Core ML这个机器学习框架,不过由于当时的注意点不在人工智能上,而是新推出的iOS11系统以及iPhone X的适配,当时仅仅是看了一下session,没有细致的学习,时隔一年再次接触Core ML发现,系统提供的Core ML的友好程度是其他第三方无法提供的,虽然Core ML还有诸多的不足,但是官方现在正在一步步的进行优化中。

下面就对Apple这几年公布的涉及到人工智能的框架进行一个梳理,即作为对这一段时间的学习总结,也为身为iOS开发人员如何无痛的进入人工智能列举一些学习资源。

Machine learning

人工智能是一个广泛的术语,包括许多子领域,其中一个子领域是机器学习(ML),ML是一种能够学习和预测数据的算法。一般来说,ML的任务分为三大类:

  • 监督学习:算法从我们提供的标记示例中学习。算法然后使用这些例子作为一个类比来决定无标记的数据

  • 无监督学习:算法从没有提供标签的例子中学习,让算法自己去发现数据的结构和意义

  • 强化学习:算法与动态环境相互作用,在动态环境中,算法必须执行某个目标,而没有老师明确地告诉它是否接近目标

人工智能软件可以从图像或文本、经验、进化或其他研究人员的发明等数据中学习,机器学习(ML)作为当下人工智能领域中最热门的一个子领域,其主流的应用场景有:知识图谱自然语言处理翻译声音识别计算机视觉图像识别等。自20世纪50年代以来,AI 研究人员开发了许多机器学习方法,包括但不限于神经网络树组合支持向量机广义线性模型特征工程流水线模型等。

神经网络为例,神经网络尝试用节点层来模拟人脑流程,并将节点层用不同的方式连接在一起。每增加一层都需要增加大量计算,这些计算基本上都是矩阵乘法,用GPU 来处理会非常高效,同时GPU 成本的下降也使得能够创建更多层深度神经网络,比如Inception v3这个对象识别模型就有48层以及大约2000万个参数。

传统的机器学习任务从开始到建模到预测的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测、分类。神经网络需要大量的训练数据,这些训练数据理想化地代表了全部可能性。训练模型意味着给神经网络提供训练数据,并让它计算公式,此公式组合输入参数以产生输出。训练是离线的,通常在具有多个 GPU 的机器上,由于移动设备的处理能力还打不到这样的需求,因此不适合在移动设备上进行训练。当有了一个经过训练的模型之后,就可以使用它进行推论了,推论仍然需要大量计算,以从新的输入计算输出,不过由于有了像 Metal 这样的框架,现在可以在移动设备上进行这些计算。

卷积神经网络是神经网络的一种,这个名词听起来很难理解,并且它的实现架构也随着时间越来越多,性能更加高效,导致实现算法也越来越多。目前很多的视频、书籍都有介绍神经网络,但是对于一个人工智能领域的麻瓜来说,如何通俗的解释神经网络这个概念是一个很困难的事情,因此,最好的办法还是抛却网上那些文章,深入书本中去学习理解神经网络的原理。Apple也提供了一个关于机器学习的博客,主要都是一些Apple内部对于机器学习的实现应用,不过里面的内容并不适合初学者,但是可以了解一下手机中的Siri和Photo是如何使用机器学习更加智能的。

第三方

除了Apple推出自己的机器学习框架(BNNS、MPSCNN以及Core ML)之外,社区中有很多使用swift、objective-c、c++等实现的学习库,他们对于机器学习中常用的算法,比如SVM、多层神经网络、线性回归、K-Means、遗传算法等等都有进行实现。这些第三方框架或多或少的实现了机械学习中的特性,他们有的很确实很棒,能够引起很多想要投身于人工智能开发工作人员的共鸣,有的很有趣,内部的实现逻辑可以作为iOS开发人员学习人工智能最友好的源码工具库。这些工具包基本上是基于Apple提供的Accelerate框架以及Metal框架进行开发的,Accelerate是一组数学函数,可以充分利用CPU的快速向量指令,而Metal是运行在GPU上的优秀计算内核库,这两个库赋予了开发者进行CPU、GPU编程的能力。

除了以上这些专门针对于iOS、Mac OS系统开发的工具包之外,还有很多有名的的平台也推出了支持移动设备的版本,像Google发布的专门针对于移动设备的工具Tensorflow Lite也因为TensorFlow的原因关注度很高。除了谷歌,Facebook以前发布了一个叫做Caffe2GO的架构,这个框架提供了一个风格转换的功能,而在2017年的F8大会上则是进一步发布了Caffe2,开始正式支持移动平台。而除此之外,MxNet 深度学习框架也支持多个平台,包括移动设备。除了国外的大厂,国内的诸如百度腾讯都有推出自己的机器学习框架,由于兼顾安卓和iOS,他们都是使用C++实现的,并且支持的模型转换也不是很全面。

即使这样,这些第三方框架也没有获得到太大的呼声(至少在iOS开发圈里),不像在WWDC2017中初次亮相的Core ML那么惊艳,几乎让所有对人工智能有兴趣的iOS开发者集体高潮了,我估计是机器学习的知识面太广、知识深度太深,对于有兴趣的人来说,上手成本比较高,而Apple推出的这个易上手的框架恰巧降低了学习成本。

BNNS and MPSCNN

在WWDC16中,苹果推出了很多令人惊叹的创新api,涉及到的领域也很前卫,基本上都是人工智能方向的,比如语音识别、主动应用、机器学习、用户意图和神经网络。所有的这些都是基于两个框架来实现的:BNNS和MPS。

BNNS

Basic neural network subroutines (BNNS) is a collection of functions that you use to implement and run neural networks, using previously obtained training data.

BNNS支持实现和操作神经网络进行推理,使用以前从训练中获得的输入数据。BNNS不做培训,它的目的是在已经训练好的神经网络上提供非常高的性能推断。

神经网络是一组层的序列,每一层在其输入上执行一个过滤操作,并将结果作为输入传递给下一层。最后一层的输出是来自初始输入的推断:例如,初始输入可能是一个图像,而推断可能是一个恐龙的图像。

一个层由一个过滤器加上来自训练的数据和一个激活函数组成。过滤器的设计目的是利用训练数据转换输入。例如,在卷积层中,滤波器将训练数据作为卷积核中的权重。

激活函数应用于过滤器后的输出数据。您可以从BNNSActivationFunction枚举类型在bnns.h中提供的一组简单函数中选择激活函数。一些激活函数接受您指定的一个或两个浮点参数。

Metal Performance Shaders

iOS 8 出了 Metal,提供了对设备 GPU 的底层访问。

Apple推出的这两个库是接下来完成Core ML的基础,

CoreML

Core ML是Apple在WWDC2017上推出的框架,仅仅支持iOS11系统以及以后使用,是基于Accelerate以及MPS框架构建的。在推出这个框架之前,Apple一系列的动作,比如BNNS和MPSCNN的发布都是可见的准备工作,虽然使用BNNS或者MPSCNN也可以实现一系列机器学习中的算法,完成一些任务,但是需要编写偏底层的神经网络层代码,官方针还出了一些使用MPSCNN来构建卷积神经网络的

除了官方的一些动作之外,像大热的深度学习框架(软件包):TensorFlow、Caffe之类的项目都可以用来在iOS系统上实现机器学习。但是对于这些框架来说,由于本身不是为了iOS系统服务的,要想在iOS行运行,还是需要很多的步骤来进行准备。就拿TensorFlow来说,不算训练模型的步骤,生成的模型就有40M左右,还需要对其进行裁剪,去掉不需要的部分;将一个训练好的模型应用到iOS上就需要将模型进行freeze,因为一些功能并不支持C++;可以在iOS上使用之后,编写的代码还必须使用C++,在后来,TF的开发人员在开源的swift下维护了一个分支用来实现TensorFlow相关的功能;并且TensorFlow是基于Accelerate运行在CPU上,并不可以在GPU上运行,这对于一些深度学习模型来说,会导致手机过热而“爆炸”。

Core ML将以前在iOS上实现机器学习的坑都填好了,并且不会给使用者带来一丝困难,除了功能比较少这一点。Core ML将训练好的模型以一种面向对象的方式提供给开发者,在Xcode中可以查看模型的信息,以及这个类的接口。对于如何训练模型,Core ML并没有提供这个功能,但是官方提供了一些训练好的模型可以供免费下载,并且随着Core ML Tools的使用,社区中也有了很多的免费训练好的模型

在WWDC2017的时候,一个模型的大小根据网络层数不同而不同,尺寸通通常还是很大的,40M都是常态。到了WWDC2018,在优化了一年之后,基于Core ML Tools提供的一些功能,模型的大小可以减小到10M以下,有的甚至可以达到1M以下。另外Core ML不像其他的框架生成的模型那样只能够在CPU上运行,它会在CPU以及GPU之间切换,主要是要考虑手机电池的使用寿命。不过可以选择设置仅仅在CPU上运行,这主要是为了解决Metal框架不能在模拟器上运行的问题。在WWDC2018上,官方终于为Core ML增加了可以自定义层的功能,这样有能力自己编写神经网络的开发者使用Core ML将更加的自由。

使用Core ML之后,开发者需要做的事就只有两件了:加载一个训练过的模型、根据模型进行预测,所需要的代码书写量不会超过10行。

虽然Core ML已经很好用,但是对一个框架提出高要求永远是使用者不变的诉求,Core ML现在主要的问题就是支持的层数有限,而在市面上的其他框架已经没有了层数的限制。除了这个问题之外那估计就是支持的功能了,内部实现的算法并不是很多,看了官方提供的Create CoreML工具可以知道,Core ML是有监督的学习方式,并且只有监督学习,不支持无监督学习,甚至是强化学习。

需要强调的一点是Core ML目前不支持训练模型,训练模型可以使用Keras、TensorFlow、Caffe这些流行的深度学习软件包来进行,或者使用自家的Create CoreML框架来训练一些简单的模型。抛去对模型的训练,在AI环境中使用移动设备执行神经网络也是很吸引人的,别忘了曾经的网红App-Prisma。移动端的机器学习框架的主要目的就是让每位开发者都能更轻松地在iOS上执行预训练的神经网络,基于Apple一贯将复杂问题简单化的作风,我认为Core ML是现阶段最好的iOS端机器学习框架。

Vision

Vision 是 Apple 在 WWDC 2017 推出的可以进行计算机视觉处理的框架,可以完成诸如人脸识别、物体追踪、文本识别、机器学习分析等。通过上面提到的可以知道,Vision是基于Core ML构建的,更底层是基于 Metal 构建的,Vision内部就自带了很多训练好的模型,这些模型主要的功能就是诸如人脸识别、文本识别、条形码检测等。在Vision推出之前,系统有很多种框架可以用来完成人脸识别,比如Core Image、AV Capture,但是基于机器学习开发的Vision在精确度、耗时、耗电量这些方面都比这两位优秀,这也是源于Vision内部大部分时间都是使用GPU来完成神经网络的原因。

Vision是一个非常面向对象的库,即使不是图像处理专家,也可以很轻易的上手,基本操作被简化为:handle一个request,然后在handle的回调中得出observation。这样的设计思路可以将不同的诉求使用不同的request来实现,其实就是使用request包装起来不同的模型。

既然Vision是基于Core ML构建的,那么就可以在Vision中使用自己训练好的模型,这一部分系统也有相应的接口,

NLP

Apple在iOS5就引入了一个用于处理自然语言的框架:NSLinguisticTagger ,可以用来将自然语言字符串标记成文字,然后确定词性,进一步的提取诸如人名、地名、组织这些有用的信息。直到WWDC2017的时候,才对这个框架进行了重新设计,内部结合机器学习提供了更高的性能,对于文本的处理更加的多样化,为不同国家的语言提供了更好的兼容,这也是目前Apple在自然语言处理领域中对NSLinguisticTagger的最后一次更新了。接下来在WWDC2018中,基于NSLinguisticTagger推出的Natural Language框架使得对于自然语言处理更加高效,结合Core ML可以使用自己训练的模型来完成NLP相关领域的功能。新的Natural Language框架将文本处理中的分割、语义分析等都简化在框架内部,开发者可以使用自己的数据集来进行有监督的学习训练模型,除了对文本的token分析,还可以实现文本分类。

曾然,NLP领域中需要掌握的知识有很多,Natural Language框架提供的功能虽然能够完成基本的需求,但是对于更加特殊的需求,还是需要自己深入研究NLP相关的技术,去实现相应的模型。

Core ML Tools

Apple在Core ML框架加入到生态圈之后一个很大的缺点就是它仅支持有限数量的神经网络层类型,另外则是无法扩展Core ML的功能。不过直到iOS 11.2,开始支持自定义图层,这使得Core ML的使用效率提高了很多,在这之前,对一个第三方的模型进行转换还必须使用那些没有自定义层的模型,类型也不是市面上所有的模型。另一方面,使用MPS这个框架,可以实现全部可控的神经网络构建。

通常在机器学习中使用的模型都是使用Keras、TensorFlow、Caffe这些流行的深度学习软件包训练得到的,因此为了兼容这些阵营的开发者,Apple提供了Core ML Tools来让这些模型转化成Core ML模型,在WWDC2017中支持的有cCaffe、Keras、LIBSVM、scikit-learn、XGBoost,至于其他的框架下的模型可以通过第三方转换器Core ML Specification来进行转换,比如Turicreate、TensorFlow、MXNet、Torch7、CatBoost。

在WWDC2018中,Apple团队为Core ML框架进行了优化,主要有减小模型大小合并多模型模型的序列化操作等,这些操作都依赖于更新过后的Core ML Tools来完成,并且也支持了其他的深度学习软件包,这让Core ML Tools更加的通用。

Create ML

Create ML是一个新的框架,主要用来减少创建MLModel的成本,以及隐藏训练的过程,通过playground将训练集数据进行拖入就可以生成对应的模型。由于MAC强大的GPU处理功能,这个过程会很快,不需要再搭建环境来进行模型的训练,开发者仅仅需要做的就是准备好数据然后等待训练的结果,目前支持三种分类:图片分类、文本分类以及表格数据分类。整个训练过程既可以拖入训练集、也可以使用代码完成,两种方法都很简单,最简单的还是拖入到PG中训练,训练过后的模型还可以直观的看到对应的评估结果、尺寸等信息。

在之前都是使用其他机器学习框架进行训练模型,然后使用工具转化成mlmodel,即使现在已经支持了所有著名的平台模型的转化,但是这对于一项求简的Apple来说,也不在乎多开发一个框架来完成训练这一个机器学习中重要的操作。由于目前所有Apple提供的机器学习方法都是有监督的学习,所以需要为训练的数据提供label,结合Vision和Natural Language框架,这在Create ML中进行训练将会更加简单。而且基于这一年的优化,生成的模型速度更快,模型的尺寸也更加的小。

在对Tabler Data的训练部分,框架实现了机器学习中很多的分类算法,这提供给开发者可选择何种算法来生成自己的模型,但是Apple更进一步,直接使用一个MLRegressor类就可以内部自动选择最佳的算法来完成分类操作,并不需要开发者去了解这n多种算法。

写在后面

当算法细节从机器学习环境中消失时,会有什么影响呢?对于许多数据科学家来说,这些细节恰巧是提高性能、创新的机会所在,在这个领域最前沿的社区中,提升几个百分点的准确性可以说是一个大新闻了。然而,对于许多开发人员而言,最高的准确性并不是最终目的,他们关心的是只需能够获取自己的数据并轻松地从0到达90%范围内的任何精度都是完成了任务。对于许多应用程序来说,开发自定义模型现在简化为收集数据以及使用工具训练数据,这也让机器学习技术本身不再是障碍。

对于想要进入人工智能领域的iOS开发人员来说,掌握了Apple提供的一系列工具和框架仅仅是一个开始,Apple的这些易于上手的框架对机器学习中很多的常用算法、概念进行了内部封装实现,对于想要在人工智能的的领域中走的更远的开发者来说,是远远不够的。需要从基础的数学函数开始,理解每一个算法的实现原理,掌握概率论统计以及相关的课程等等,这显然是一个很大的工程,毕竟高等数学这一门课程就够很多开发人员头疼了,我这里列举一些在学习过程中收集的学习资料,以供参考。

Session

  • WWDC 2016 Session 605 What’s New in Metal, Part 2:
  • WWDC 2017 Session 703 IntroducingCore ML
  • WWDC 2017 Session 710 Core ML in depth
  • WWDC 2017 Session 506 Vision Framework: Building on Core ML
  • WWDC 2017 session 208 Natural Language Processing and your Apps
  • WWDC 2018 session717-Vision with Core ML
  • WWDC 2018 session716-Object Tracking in Vision
  • WWDC 2018 session703-Introducing Create ML
  • WWDC 2018 session708-What’s New in Core ML,part1
  • WWDC 2018 session709-What’s New in Core ML,part2
  • WWDC 2018 session713-Introducing NLP Framework

书籍

Samplecode & Tutorial

https://developer.apple.com/library/archive/samplecode/MPSCNNHelloWorld/Introduction/Intro.html

https://developer.apple.com/library/archive/samplecode/MetalImageRecognition/Introduction/Intro.html

https://developer.apple.com/sample-code/wwdc/2017/ImageClassificationwithVisionandCoreML.zip

https://www.invasivecode.com/weblog/convolutional-neural-networks-ios-10-macos-sierra/

http://machinethink.net/blog/apple-deep-learning-bnns-versus-metal-cnn/ 翻译

http://machinethink.net/blog/object-detection-with-yolo/

http://machinethink.net/blog/the-hello-world-of-neural-networks/

http://machinethink.net/blog/tensorflow-on-ios/

http://machinethink.net/blog/coreml-custom-layers/

http://machinethink.net/blog/ios-11-machine-learning-for-everyone/