WWDC 2018:初探 Create ML

故胤道長發表於2018-06-11

本文是 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。我想這其中重要的原因是影像識別的機器學習模型比較成熟,蘋果官方主頁上也有現成的模型可供下載。

WWDC 2018:初探 Create ML

我們知道 Core ML 的工作模式是獲取模型、匯入模型、生成介面、進行呼叫,其中匯入模型、生成介面、進行呼叫這3步在去年就有了比較簡單直接的解決方案。而機器學習模型的獲取方式卻乏善可陳,主要有以下兩種:

  • 從蘋果的官方主頁進行下載。去年有4個現成的模型,今年有6個,可以說沒什麼進步。

  • 用第三方的框架生成模型,再用 Core ML Tools 轉成 Core ML 模型。2017年蘋果宣佈支援的框架有5個,包括 Caffee、Keras。今年宣佈支援的第三方框架增加到了11個,包括了最知名的 TensorFlow、IBM Watson、MXNet,數量和質量都有大幅提升。

官網的現成模型數量有限;而通過第三方機器學習框架生成模型再進行轉換這種方式,一來比較麻煩,二來模型的數量和質量都要受制於人,三來為了生成模型,第三方框架得到了 App 開發者的訓練資料,相當於是蘋果在機器學習上間接成全了谷歌、亞馬遜、臉書、IBM 等競爭對手。

基於效率、安全、競爭方面的考慮,蘋果推出了 Create ML——生成機器學習模型的原生官方手段。

Create ML 是什麼

Create ML 是蘋果開發的、生成機器學習模型的框架。它有三個特點:使用 Swift 進行操作;用 Playground 訓練和生成模型;在 Mac OS 上完成所有工作,可以說是集原生態和便攜性於一體。使用 Create ML 的流程如下:

WWDC 2018:初探 Create ML

  1. 確認場景。在使用 Create ML 前,我們必須確定當前問題可以用機器學習來解決:即問題對應的資料存在關聯和規律。例如某電商網站通過分析使用者特徵和歷史資料來判斷其購物偏好,這類問題就可以機器學習解決;而諸如通過收集彩票中獎歷史記錄來預判下一期中獎號碼則不可以通過機器學習解決,因為彩票開獎是隨機的,其歷史記錄並無規律。

  2. 收集資料。這一步驟中,開發者不僅需要收集大量的訓練資料,還要收集部分測試資料。目前 Create ML 支援三種型別的資料:圖片、文字、表格。其中圖片對應的模型 API 是 MLImageClassifier,而後兩者則對應MLTextClassifier (對一大段文字進行分析)和 MLWordTagger(對單個單詞進行分析)。

  3. 訓練模型。目前 Create ML 提供兩種訓練模型方式:拖拽和程式碼形式。拖拽是這樣完成的:在 Playground 中可以用 LiveView 直接開啟訓練的 UI 介面,然後將準備好的訓練資料放入對應的訓練框中,Playground 就自動開始訓練模型了。程式碼形式則是呼叫相應的 API 進行操作,我們會在稍後詳談。

WWDC 2018:初探 Create ML

  1. 評估模型。具體步驟和訓練模型類似。差別在於這次用的是測試資料,我們會根據測試資料返回的準確度去判斷模型的可靠性。上圖中我們可以看到,在測試資料評估之後,水果分類模型的準確度為92%。

  2. 儲存模型。在 UI 介面中可以直接拖拽模型將其儲存在桌面或其它位置。若是 API 操作,可以手動指定儲存路徑,再將其儲存。

注意 Create ML 生成的模型是基於現有模型和專用資料而生成的定製化模型。例如上圖中我們看到的水果圖片分類模型,就是基於蘋果的圖片分類模型,配合水果圖片而生成的專用模型。它只針對具體的使用場景,所以在尺寸和時間上都優化到了極致。例如上文中的水果圖片分類模型就只有83KB,訓練時間也在1分鐘以內。

WWDC 2018:初探 Create ML

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 開發上的巨大潛力。

相關文章