精度 vs 效率:模型越小,精度就一定越低嗎?

精度 vs 效率:模型越小,精度就一定越低嗎?

以下是我最近在倫敦 O’Reilly AI Conference 和 DroidCon 上的兩次談話的改編。

今年早些時候,NVIDIA 的研究人員發佈了 MegatronLM。這是一個擁有 83 億個參數(比 BERT 大 24 倍)的大型 transformer 模型,它在各種語言任務上都達到了最先進的性能。雖然這無疑是一項令人印象深刻的技術成就,但我不禁要問自己:深度學習是否朝著正確的方向發展?

單是這些參數在磁盤上的權重就超過了 33GB,訓練最終的模型需要 512v100 GPU 連續運行 9.2 天。考慮到每張卡的能量需求,訓練這一模型所用的能量量是美國平均年能源消耗量的 3 倍多。

我不想單獨列出這個項目。有許多例子表明,大量的模型正在被訓練,以便在各種基準上獲得更高的精度。儘管 MegatronLM 比 BERT 大 24 倍,但它在語言建模方面只比 BERT 強 34%。作為演示新硬件性能的一次性實驗,這裡沒有太大的危害。但從長遠來看,這一趨勢將導致一些問題。

首先,它阻礙了民主化。如果我們相信,在這個世界上,數以百萬計的工程師將使用深度學習來改進每一個應用程序和設備,那麼我們就不會擁有需要大量時間和金錢來訓練的大型模型。

其次,它限制了規模。世界上每一個公共和私有云中可能只有不到 1 億個處理器,但現在已經有 30 億部手機、120 億部物聯網設備和 1500 億個微控制器。從長遠來看,正是這些小型、低功耗的設備最需要深度學習,大規模的模型根本不會是一個選擇。

精度 vs 效率:模型越小,精度就一定越低吗?

為了確保深度學習實現其承諾,我們需要重新對研究進行定位,不要追求最高的準確性和最先進的效率。我們需要關心的是,模型是否能夠讓最大數量的人使用,是否能夠在大多數設備上用最少的資源儘可能快地迭代。

好消息是,我們正在努力使深度學習模型更小、更快、更高效。早期的回報令人難以置信,例如,Han 等人 2015 年的一篇論文得出了這樣一個結果。

「在 ImageNet 數據集上,我們的方法將 AlexNet 所需的存儲空間減少了 35 倍——從 240MB 減少到 6.9MB,而且不失準確性。我們的方法將 VGG-16 的大小從 552MB 減少到 11.3MB,減少了 49 倍,同樣沒有精度損失。」

為了達到這樣的效果,我們必須考慮從模型選擇、訓練到部署的整個機器學習生命週期。在本文的其餘部分,我們將深入到這些階段,並研究如何創建更小、更快、更高效的模型。

模型選擇

精度 vs 效率:模型越小,精度就一定越低吗?

以更小、更高效的模式結束的最好方法是開始一個模型的建立。上圖描繪了各種模型架構的大致大小(兆字節)。我已經覆蓋了表示移動應用程序的典型大小(包括代碼)以及嵌入式設備中可用的 SRAM 數量。

Y 軸上的對數刻度軟化了視覺打擊,但不幸的事實是,大多數模型架構對於除了數據中心的任何地方來說,數量級都太大了。

令人難以置信的是,右邊較小的架構的性能並沒有比左邊的大架構差多少。像 VGG-16 這樣的架構(300-500MB)的性能和 MobileNet(20MB)的差不多,儘管它的體積小了近 25 倍。

精度 vs 效率:模型越小,精度就一定越低吗?

是什麼讓 MobileNet 和 SquezeNet 這樣的小型架構如此高效?基於 Iandola 等人(SquezeNet)、Howard 等人(MobileNet3)和 Chen 等人(DeepLab V3)的實驗,一些答案存在於模型的宏觀和微觀結構中。

宏體系結構指的是模型使用的層的類型,以及如何將它們排列成模塊和塊。要生成高效的宏架構,請執行以下操作:

  • 通過降採樣或使用空洞卷積保持激活圖的大小

  • 使用更多的通道,更少的層

  • 在計算過程中使用跳接和剩餘連接來提高精度,重複使用參數

  • 用可分離的標準卷積替換

模型的微觀結構與各個層相關。最佳做法包括:

  • 使輸入和輸出塊儘可能高效,因為它們通常佔模型計算成本的 15-25%

  • 減小卷積核的大小

  • 添加一個寬度倍增器,用超參數 alpha 控制每次卷積的通道數

  • 排列圖層,以便可以融合參數(例如偏差和批量標準化)

模型訓練

在選擇了模型架構之後,要縮小它並使其在訓練期間更有效,仍然有很多工作可以做。如果還不明顯的話,大多數神經網絡都是參數化的,許多經過訓練的權重對整體精度影響很小,可以去除。Frankle 等人發現,在許多網絡中,80-90% 的網絡權值可以被移除,同時這些權值中的大多數精度也可以被移除,而精度損失很小。

尋找和移除這些參數的策略主要有三種:知識蒸餾、剪枝和量化。它們可以一起使用,也可以單獨使用。

知識蒸餾

精度 vs 效率:模型越小,精度就一定越低吗?

知識蒸餾採用較大的「教師」模型來訓練較小的「學生」模型。這項技術最初由 Hinton 等人於 2015 年提出,其關鍵在於兩個損失項:一個是學生模型的硬預測,另一個是基於學生在所有班級,產生相同分數分佈的能力。

Polino 等人能夠在 CIFAR10 上訓練的 ResNet 模型的大小減少 46 倍,精度損失只有 10%;在 ImageNet 上,大小減少 2 倍,精度損失只有 2%。最近,Jiao 等人蒸餾 BERT 來製造 TinyBERT:小 7.5 倍,快 9.4 倍,並且精確度只降低了 3% 。有一些很好的開源庫實現了蒸餾框架,包括 Distiller 和用於 transformer 的 Distil。

剪枝

縮小模型的第二種技術是剪枝。剪枝包括評估模型中權重的重要性,並刪除那些對整體模型精度貢獻最小的權重。剪枝可以在一個網絡的多個尺度上進行,最小的模型是通過在單獨的權重級別上剪枝來實現的,小量級的權重設置為零,當模型被壓縮或以稀疏格式存儲時,其存儲效率非常高。

Han 等人使用這種方法將普通的計算機視覺體系結構縮小了 9~13 倍,精度變化可以忽略不計。不幸的是,缺少對快速稀疏矩陣操作的支持意味著權重級別的剪枝也不會提高運行速度。

要創建更小、更快的模型,需要在濾波器或層級別進行剪枝,例如,刪除對總體預測精度貢獻最小的卷積層的濾波器。在濾波器級別剪枝的模型並沒有那麼小,但通常速度更快。Li 等人使用該技術能夠將 VGG 模型的大小和運行時間減少 34%,而不損失準確性。

最後,值得注意的是,對於是否最好從更大的模型開始,從零開始剪枝或訓練更小的模型,Liu 等人的結果好壞參半。

量化

精度 vs 效率:模型越小,精度就一定越低吗?

圖源:https://medium.com/@kaustavtamuly/compressing-and-accelerating-high-dimensional-neural-networks-6b501983c0c8

模型經過訓練後,需要為部署做好準備。這裡也有一些技術可以對模型進行更多的優化。通常,模型的權重存儲為 32 位浮點數,但對於大多數應用程序,這遠比所需的精度高。我們可以通過量化這些權重來節省空間和時間,同時對精度產生最小的影響。

量化將每個浮點權重映射到一個固定精度的整數,該整數包含的 bit 數少於原始值。雖然有許多量化技術,但最重要的兩個因素是最終模型的 bit 深度和訓練期間或之後是否量化權重。

最後,量化權重和激活對於加快模型的運行是很重要的。激活函數是自然產生浮點數的數學運算,如果不修改這些函數來產生量化的輸出,那麼由於需要轉換,模型甚至可能運行得更慢。

在一篇精彩的測評文中,Krishnamoorthi 測試了許多量化方案和配置,以提供一組最佳實踐:

結果如下:

  • 後訓練通常可以應用到 8 位,模型減小 4 倍,模型精度損失小於 2%

  • 訓練感知量化,以最小的精度損失將位深度減少到 4 或 2 位(模型減小 8~16 倍)

  • 量化權重和激活可以使 CPU 的速度提高 2-3 倍

部署

這些技術中的一個共同點是,它們生成了一個連續的模型,每個模型都有不同的形狀、大小和精度。雖然這會產生一些管理和組織問題,但它很好地映射到了各種各樣的硬件和軟件條件的模型將面臨的問題。

精度 vs 效率:模型越小,精度就一定越低吗?

上圖顯示了 MobileNetV2 模型在各種智能手機上的運行速度,最低端和最高端設備之間可能存在 80 倍的速度差。為了給用戶提供一致的體驗,在正確的設備上放置正確的型號是很重要的,這意味著訓練多個模型,並根據可用資源將它們部署到不同的設備上。

通常,最佳的設備性能是通過以下方式實現的:

  • 使用本機格式和框架(例如 iOS 上的 Core ML 和 Android 上的 TFLite)

  • 利用任何可用的加速器,如 GPU 或 DSP

  • 監視設備的性能,確定模型瓶頸,並迭代特定硬件的體系結構

當然,監視和管理所有模型的不同版本並不總是那麼容易。

總結

通過應用這些技術,可以將大多數模型縮小並加速至少一個數量級。下面引用到目前為止討論過的幾篇論文:

  • 「TinyBERT 在經驗上是有效的,並且在 GLUE 數據集中取得了與 BERT 相當的結果,同時比 BERT 小了 7.5 倍,推理速度快了 9.4 倍。」—Jiao 等人

  • 「我們的方法將 VGG-16 的大小從 552MB 減少到 11.3MB,減少了 49 倍,沒有精度損失。」—Han 等人

  • 「模型本身佔用的閃存空間不到 20KB……而且它只需要 30KB 的 RAM 就可以運行。」—Peter Warden 在 TensorFlow Dev Summit 2019 上如是說

為了證明普通人也可以完成這件事情,我冒昧地創建了一個小的 17KB 風格的傳輸模型,它只包含 11686 個參數,但仍然產生了與 160 萬個參數的模型一樣好的結果。

精度 vs 效率:模型越小,精度就一定越低吗?

左:原始圖像;中:我們 17KB 的小模型的樣式化圖像;右:更大的 7MB 模型的樣式化圖像

我一直認為這樣的結果很容易實現,但並不是每一篇論文都採用了標準的過程。如果我們不改變我們的實踐,我擔心我們會浪費時間、金錢和資源,同時無法將深度學習用到可能從中受益的應用程序和設備中。

不過,好消息是,大模型的邊際效益似乎正在下降,而且由於這裡概述的這些技術,我們也可以對其大小和速度進行優化,而不會犧牲太多的準確性。

額外資源:

  • Distiller— A library for optimizing PyTorch models

  • TensorFlow Model Optimization Toolkit

  • Keras Tuner— Hyperparameter optimization for Keras

  • TinyML — Group dedicated to embedded ML

精度 vs 效率:模型越小,精度就一定越低吗?

via:https://heartbeat.fritz.ai/deep-learning-has-a-size-problem-ea601304cd8

雷鋒網雷鋒網雷鋒網


分享到:


相關文章: