WWDC 2019: 機器學習移動端的崢嶸初現 Core ML 3.0

本文是 WWDC 2018 Session 704 的讀後感,其視頻及配套 PDF 文稿鏈接如下:
Core ML 3 Framework。本文會首先回顧 Core ML 的發展歷史,其後着重介紹 Core ML 本次的更新和使用場景。
查閱全部 WWDC 2019 專欄內容,點擊此處前往小專欄。

Core ML 發展史

Core ML 是蘋果在2017年推出的機器學習框架。旨在爲 App 開發提供一套完整的機器學習方案,包括模型獲取、模型部署、使用模型三個部分。

其中模型獲取在 Create ML 章節中已有深入探討和介紹,感興趣的朋友可以查閱 WWDC 2018:初探 Create ML

而模型部署和使用方面,則完全是由 Core ML 負責。Core ML 1.0 的模型可以直接在 Xcode 中導入 App 中,然後自動生成 API 接口。Core ML 2.0 在此基礎上,進行了 API 的擴展和改進;對輸入量化了權重,對輸出增加了定製化精度的功能;模型的神經網絡層也可以定製化替換。這一系列的改進使得 Core ML 的靈活性大幅提成、性能更是提高了30%。可以說 Core ML 2.0 做到了更小、更快、定製化的目標。

至此,蘋果已經在移動端機器學習領域完成了從0到1的計劃。今年 Core ML 3.0 的發展,在筆者看來,則是從1到N的第一步。


Core ML 新功能和使用場景

今年的更新主要有三個:本地模型個性化、神經網絡的優化和支持、性能優化和更多種類的數據支持。

本地模型個性化

之前的 Core ML 模型,只能處理普遍的、共性的數據。例如,它可以判斷一張照片中的動物是不是狗,但無法針對不同的狗主人,判斷照片中的狗是否屬於當前使用模型的主人。要解決這個問題,有以下幾個方案:

  1. 針對不同的狗主人訓練不同的模型。這樣做的問題是擴展性太差:如果有10000個狗主人,那這個識別主人的 App 就要發佈10000個版本,每個版本有不同的模型,每個用戶要去下載各自的版本。這樣做顯然不現實。

  2. 將照片上傳至雲端處理。服務器端的模型可以提取相應的特徵,然後根據大數據確定狗主人的信息,再將信息返回至移動端。這樣做的問題首先是有延時,網絡情況會直接影響 App 性能;其次是有隱私泄露的可能,畢竟照片和狗主人的信息會在上傳和下載的同時被竊取。

  3. 在本地更新模型,適配不同的用戶。所有用戶一開始拿到的都是同一個模型,之後模型會根據用戶輸入的圖片,自動更新參數,生成新的本地模型。新的模型會根據當前用戶的照片,判斷該狗是否屬於主人。

Core ML 3.0 目前採取的就是方案3。這樣做的唯一疑慮就是性能問題:只能快捷得處理簡單任務,複雜的就捉襟見肘。這是由於手機硬件性能和優化不足導致的瓶頸。

具體的實現原理是,蘋果在原來的 Core ML 模型中加入了更新接口,用於接收新的輸入數據,並更新對應的模型參數,這樣就可以生成新的本地化模型。就上文的小狗(狗主人)識別模型爲例,現在的 Core ML 3.0 模型有以下4個接口:

// 模型類
class DogClassifier

// 輸入類,用於接收帶分類數據
class DogClassifierInput

// 輸出類,用於輸出分類結果
class DogClassifierOutput

// 相比於 Core ML 2.0 新增的輸入類,用於接收新的訓練數據,用以改變模型參數
class DogClassifierTrainingInput

根據新提供的接口,我們可以根據以下步驟更新原來的模型:

// 1. 提供原模型的信息
let bundle = Bundle(for: DogClassifier.self)
let updatableModelURL = bundle.url(forResource: "DogClassifier",
withExtension: "mlmodelc")!

// 2. 提供新的訓練數據
let trainingData = prepareTrainingData(from: trainingSamples)

// 3. 開始更新模型
let updateTask = try MLUpdateTask(forModelAt: updatableModelURL,
                                  trainingData: trainingData,
                                  configuration: configuration,
                                  completionHandler: { context in
                                    // 使用新的模型
                                    self.dogClassifier.model = context.model
                                  })
updateTask.resume()

實際模型中更新的只是部分層級:它們必須是全連接的卷積神經網絡層,其更新損失經過均方差和交叉熵計算後通過 Adam 和 SGD 方法優化,使得參數變化在一個固定範圍,變化比較平穩。

神經網絡的優化和支持

蘋果的神經網絡模型主要是由兩部分組成:

  1. 卷積層。負責加權疊加輸入數據。簡單的講,就是對於一個數據不同的特徵,你要計算出一個結果,就得將這些特徵拉到一個維度。卷積層的工作就是把特徵一個個提取出來,放在一個向量中。
  2. 激活函數。負責將神卷積層輸出的結果(向量)加上一個非線性變換。可以這樣理解,這時候所有的特徵被揉在一起,最後輸出的是一個全局特徵值。

Core ML 的模型,原來只能一層層的定向傳輸數據。現在 Core ML 3.0 增加了動態的神經網絡層,可以根據不同條件,進行不同層之間選擇性的傳輸、在固定層之間數據循環傳輸。目前,Core ML 3.0 可以支持多達100多種神經網絡。

蘋果現場展示了一款集合聲音識別、自然語言處理、聲音合成三大模型的應用。首先模型接受一篇長文,然後根據用戶的提問,在長文中提取關鍵信息回答提問。這裏 Core ML 3.0 可以將多個神經網絡層動態結合形成一個綜合性能的模型,可以接收不同類型的數據進行處理並輸出精準的結果。


性能優化和更多種類數據支持

如往常一樣,蘋果在 Core ML 3.0 中優化了使用性能,例如用在不同圖片分類器中,底層的邏輯被提取出來,做成了引用——這樣多個模型就不用每次拷貝同一份底層邏輯,這也使得每個模型的大小縮小了一半左右。


基於 Core ML 爲自然語言處理定製的 NLP 框架和爲圖像定製的 Vision 框架也進行了不小的更新。NLP 中,蘋果增加了單詞的上下文語義理解;Vision中,蘋果引入了圖片內文字檢索和預測圖片關注度的顯著性預測功能。iOS 13 的圖片 App 中,蘋果還將 Vision 框架用於圖片搜索功能,以提高搜索的準確性和相關度。

最後,本次 Core ML 新增了兩種新的數據類型:聲音和活動。聲音方面,既可以文字轉聲音、也可以聲音轉文字,配合 NLP 框架效果更好。使用實例即是蘋果自己的 Siri 和 Accessbility 語音功能(用戶可以通過語音操控各種 App)。活動方面的應用主要集中在 Apple Watch,通過相關模型可以更好地幫助運動員判斷姿勢是否正確、是否需要調整訓練計劃等。

總結

Core ML 3.0 如期而至,WWDC 相關的 Session 由去年的8個增加到了10個。可以說蘋果在此穩步投資,其功能的增加和性能的優化使得其使用場景進一步擴大,採用 Core ML 的 App 數量目前也已經增加到了300個以上。相信下一步 Core ML 將會繼續專注於多種輸入數據和模型之間的聯繫,例如增加多語種的支持;同時,移動端性能的優化也是其一個重要的方向。可以料想到,Core ML 將會在2年左右成爲所有主流 App 的標配。

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