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 能幫我們從中提取出有用的圖片信息。

接下來我們就要用對應的訓練數據 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 開發上的巨大潛力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章