WWDC 2018:初探 Create ML

本文是 WWDC 2018 Session 703的读后感,其视频及配套 PDF 文稿链接如下:Introducing Create ML
本文从机器学习在 iOS 平台的发展说起,借此引出 Create ML。之后详细介绍了 Create ML 的使用方法,并给出相应示范。

Create ML 的提出

2017年可谓是机器学习在 iOS 平台上的元年:苹果在 WWDC 上推出了全新的 Core ML 框架,旨在为开发者提供一套完整的机器学习部署方案,从而让 App 更加智能。2018年的 WWDC 上,我们发现使用 Core ML 的 App 多达182个,其中最多的是拍照和照片编辑应用,包括大名鼎鼎的 Snapchat。我想这其中重要的原因是图像识别的机器学习模型比较成熟,苹果官方主页上也有现成的模型可供下载。

我们知道 Core ML 的工作模式是获取模型、导入模型、生成接口、进行调用,其中导入模型、生成接口、进行调用这3步在去年就有了比较简单直接的解决方案。而机器学习模型的获取方式却乏善可陈,主要有以下两种:

  • 从苹果的官方主页进行下载。去年有4个现成的模型,今年有6个,可以说没什么进步。

  • 用第三方的框架生成模型,再用 Core ML Tools 转成 Core ML 模型。2017年苹果宣布支持的框架有6个,包括 Caffee、Keras。今年宣布支持的第三方框架增加到了11个,包括了最知名的 TensorFlow、IBM Watson、MXNet,数量和质量都有大幅提升。

官网的现成模型数量有限;而通过第三方机器学习框架生成模型再进行转换这种方式,一来比较麻烦,二来模型的数量和质量都要受制于人,三来为了生成模型,第三方框架得到了 App 开发者的训练数据,相当于是苹果在机器学习上间接成全了谷歌、亚马逊、脸书、IBM 等竞争对手。

基于效率、安全、竞争方面的考虑,苹果推出了 Create ML——生成机器学习模型的原生官方手段。

Create ML 是什么

Create ML 是苹果开发的、生成机器学习模型的框架。它有三个特点:使用 Swift 进行操作;用 Playground 训练和生成模型;在 Mac OS 上完成所有工作,可以说是集原生态和便携性于一体。使用 Create ML 的流程如下:

  1. 确认场景。在使用 Create ML 前,我们必须确定当前问题可以用机器学习来解决:即问题对应的数据存在关联和规律。例如某电商网站通过分析用户特征和历史数据来判断其购物偏好,这类问题就可以机器学习解决;而诸如通过收集彩票中奖历史记录来预判下一期中奖号码则不可以通过机器学习解决,因为彩票开奖是随机的,其历史记录并无规律。

  2. 收集数据。这一步骤中,开发者不仅需要收集大量的训练数据,还要收集部分测试数据。目前 Create ML 支持三种类型的数据:图片、文字、表格。其中图片对应的模型 API 是 MLImageClassifier,而后两者则对应MLTextClassifier (对一大段文字进行分析)和 MLWordTagger(对单个单词进行分析)。

  3. 训练模型。目前 Create ML 提供两种训练模型方式:拖拽和代码形式。拖拽是这样完成的:在 Playground 中可以用 LiveView 直接打开训练的 UI 界面,然后将准备好的训练数据放入对应的训练框中,Playground 就自动开始训练模型了。代码形式则是调用相应的 API 进行操作,我们会在稍后详谈。

  1. 评估模型。具体步骤和训练模型类似。差别在于这次用的是测试数据,我们会根据测试数据返回的准确度去判断模型的可靠性。上图中我们可以看到,在测试数据评估之后,水果分类模型的准确度为92%。

  2. 保存模型。在 UI 界面中可以直接拖拽模型将其保存在桌面或其它位置。若是 API 操作,可以手动指定存储路径,再将其保存。

注意 Create ML 生成的模型是基于现有模型和专用数据而生成的定制化模型。例如上图中我们看到的水果图片分类模型,就是基于苹果的图片分类模型,配合水果图片而生成的专用模型。它只针对具体的使用场景,所以在尺寸和时间上都优化到了极致。例如上文中的水果图片分类模型就只有83KB,训练时间也在1分钟以内。

Create ML 的使用示范

在 WWDC 上,苹果工程师展示了如何使用 Create ML 生成图片分类模型、文本分类模型、表格分类模型。除了直接拖拽的方式,我们来看看用代码如何操作生成图片分类模型:

import Foundation
import CreateML

// 定义数据源
let trainDirectory = URL(fileURLWithPath: "/Users/createml/Desktop/Fruits")
let testDirectory = URL(fileURLWithPath: "/Users/createml/Desktop/TestFruits")

// 训练模型
let model = try MLImageClassifier(trainingData: .labeledDirectories(at: trainDirectory))

// 评估模型
let evaluation = model.evaluation(on: .labeledDirectories(at: testDirectory))

// 保存模型
try model.write(to: URL(fileURLWithPath: "/Users/createml/Desktop/FruitClassifier.mlmodel"))

在第一步是导入 Create ML 框架之后,我们需要定义数据源的信息,这里训练数据和测试数据皆是一系列水果的图片,被存放在桌面对应的文件夹中。文件夹内部又包含多个子目录,而 Create ML 能帮我们从中提取出有用的图片信息。

Fruits文件夹中的内容

接下来我们就要用对应的训练数据 trainDirectorytestDirectory来训练和评估模型。由于 Playground 可以实时显示执行结果,我们可以观察到训练进度(100%为模型训练完成)和评估准确度(100%为完美匹配)。其中evaluation方法返回的是 MLClassifierMetrics 结构体,其中的confusion属性对应了评估结果和实际结果不同的数据。

最后我们将生成的模型存入指定的位置。注意这里用try的原因是有可能写入的操作会抛出异常,如磁盘已满、当前目录不允许写操作等。

除了图片分类模型,苹果还展示了文本和表格信息的模型生成方式。其中文本模型与图片模型的生成过程大同小异;我们重点看下表格信息模型生成的 Create ML 示范代码:

// 定义数据源
let trainingCSV = URL(fileURLWithPath: “/Users/createml/HouseData.csv”)
let houseData = MLDataTable(contentsOf: trainingCSV)
let (trainingData,testData) = houseData.randomSplit(by: 0.8, seed: 0)

// 训练模型
let classifier = try MLRegressor(trainingData: houseData, targetColumn: "price")

// 评估模型
let metrics = try classifier.testingMetrics(on: testData)

// 保存模型
try classifier.write(to: URL(fileURLWithPath: "/Users/createml/HousePricer.mlmodel"))

在定义数据源上,我们可以用 CSV 格式的表格数据,也可以用 JSON 数据。另外,表格数据由专用的 MLDataTable 结构体来处理。最后,使用randomSplit(by:seed:)方法可以随机得将原 MLDataTable 根据比例拆分成两个 MLDataTable,来分别对应训练和测试数据。

在训练模型上,苹果提供了线性回归、决策树、随机森林等多种算法来生成模型,而 MLRegressor 则是将算法分析交给苹果,系统会自动选择较好的算法生成模型。虽然 MLRegressor 在普适性上高于其他方法,但相对的精度和效率比之其他具体算法会略显不足。

// 用线性回归算法生成模型
let classifier = try MLLinearRegressor(trainingData: houseData, targetColumn: "price")

// 用随机森林算法生成模型
let classifier = try MLRandomForestRegressor(trainingData: houseData, targetColumn: "price")

// 用 MLRegressor 生成模型
let classifier = try MLRegressor(trainingData: houseData, targetColumn: "price")

在评估模型上,不同于 MLImageClassifier 返回的 MLClassifierMetrics,这里表格模型评估返回的是 MLRegressorMetrics 结构体,其中的maximumError属性对应的是最坏情况下,评估结果和实际结果的方差;相应的均方误差则用rootMeanSquaredError属性来查看。对于如何利用 Metrics 来提高模型的准确性,苹果则给出了官方说明:Improving Your Model’s Accuracy

总结

Create ML 的出现解决了 iOS 平台上机器学习模型数量少的问题。其灵活的 API 和原生系统的支持使得 App 开发者可以更自由得定义和使用机器学习。然而相比于 TensorFlow,Create ML 不够成熟:模型生成的局限在特定的数据,对于其他数据诸如声音、图像依然无法支持,而且也无法处理图片、文字混合数据。尽管如此,Create ML 提供了简洁易用的 API,与 Core ML 一起构成了苹果的机器学习生态,展示了机器学习在 iOS 开发上的巨大潜力。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容