『英語流利說』移動端深度神經網路優化
本文介紹在『英語流利說』語音評測演算法中深度神經網路在移動端離線實時計算的優化。
『英語流利說』是一款英語口語學習 APP,利用語音評測技術給口語實時打分、反饋,幫助糾正發音,提高口語能力。流利說語音評測演算法將近年人工智慧領域取得重大突破的深度神經網路(DNN)模型應用到語音評測系統中,相比傳統建模方法,大幅提升各項 benchmark 準確率。
DNN 模型參數通常在千萬量級,模型訓練需要藉助 GPU、CPU 集群才能完成,在計算能力遠小於 PC 的移動端更是難以利用,業界做法是把數據(語音、圖像等)通過網路傳送到服務端計算,再將結果傳回移動端。
深度學習(Deep Learning)
深度學習是機器學習的一個分支,近年,深度學習的復興引領了一波大眾「人工」智能熱(泡沫),催生大批人工智慧磚家。
主流深度學習模型結構有 Deep Feed Forward Neural Networks (DNN), deep Convolutional Neural Networks(CNN) deep (Long Short-Term Memory) Recurrent Neural Networks ((LSTM)RNN),通常也以 DNN 統稱 DNN、CNN、RNN。
本文介紹 FeedForward DNN 的 FeedForward 優化,對如何做模型訓練不予闡述,優化技巧對 DNN、CNN、RNN 多是通用的。
DNN
上圖引用自CS231n Convolutional Neural Networks for Visual RecognitionFeedForward
Let a_0 = input vector
For i in 1, 2 ... layers:
通常 是 或 函數
分類任務輸出層通常為 ,代表 input 屬於各類的概率。
絕大部分的運算在 上,如果一次僅有一個輸入,則 的內容為向量, 若一次輸入多個(圖像batch處理, 語音多幀音頻特徵), 的內容為矩陣。
故在給定 DNN 模型參數的情況下,計算的核心是矩陣運算,矩陣*矩陣 或 矩陣*向量,本文重點介紹 矩陣*向量 的優化。
Basic Linear Algebra Subprograms(BLAS)
回想一下,矩陣概念是在線性代數課程引入的,BLAS 是基礎線性代數程序集的應用程序介面標準,用以規範發布基礎線性代數操作的數值庫(如向量或矩陣乘法)。在高性能計算領域,BLAS 被廣泛使用。著名的開源 BLAS 實現有 OpenBLAS 和 ATLAS。
BLAS 按照功能被分為三個級別:
Level 1:向量-向量運算
Level 2:矩陣-向量運算
Level 3:矩陣-矩陣運算
BLAS 中 gemv 為非特殊結構的 矩陣*向量 標準 API:
DNN 計算優化
1.合併、移除 不必要的計算
合併特徵歸一化
機器學習演算法通常需要對輸入特徵做歸一化處理,
其中 為均值, 為標準方差;
將上式移入到第一層的中,
令 ,, 則在保證數學運算結果一致的情況下,減少了特徵歸一化帶來的運算
移除 Softmax 計算
在語音領域並不直接使用 輸出的概率值,通常使用 ,則有
實際上
在解碼階段每一幀是否減去 並不會改變競爭條件 :
故模型訓練完成後可以移除 層,直接使用最後一層 的 .
圖像領域的應用,如果不需要概率值,也可以不計算 ,是否計算 不會改變 的大小順序。
2.gemv 計算優化
以單線程單精度sgemv 為例,分析多種優化方法,以 OpenBLAS sgemv 為對照。
通常 , 其中 。
測試環境:MacBook Pro, 2.5 GHz Intel Core i7, 16 GB 1600 MHz DDR3, clang -O2
註:以下以方陣(M=N)為例, 運行1000次取計算時間平均值,每次運行結果略有不同。
2.0 native實現
實現一:baseline
實現二:利用 稀疏性,可以避免不必要的計算;
在矩陣 以行主元存儲的時候,y(i) += α * A(i, j) * x(j); 會成為計算的瓶頸:對 A(i,j) 的內存間隔讀取導致太多 Cache Misses;第一個實現雖提高了緩存命中率,但在 稀疏的情況下,卻無法利用這個屬性避免不必要的計算(稀疏性下面還會提到)。
Fig0. dense/sparse gemv對比(非以上兩種實現的對比,這裡gemv_ft0為第二個實現)
2.1 列主元存儲
若矩陣A以列主元存儲,便可避免 Cache Misses:
Fig1. 列主元存儲(gemv_ft1)
可見,通過列主元存儲的方式,無論是 dense/sparse,性能均大幅度提升,矩陣維數越大,提升越明顯。
2.2 增加緩存命中率
Fig2. 增加緩存命中率(gemv_ft2)
通過增加緩存命中率,gemv 性能再次大幅提升。
Fig3. FineTuning
通過優化,gemv 有1-3倍的性能提升,維數越大,提升越明顯。
2.3 Fixpoint 定點化, ARM NEON 指令集加速
手機設備的處理器絕大多數是 ARM 架構,浮點數運算能力弱;針對ARM架構,對DNN參數做 Fixpoint 定點化,並使用 NEON 指令集做運算加速。這部分的性能對比,不再列出。
2.4 其他
預先分配內存、內存對齊、指針移位代替索引計算、矩陣轉置等;編譯器優化選項設置對ARM代碼的影響很大。
3.DNN 模型設計
gemv 的運算複雜度為 O(M*N),減小神經網路節點數目可以有效降低運算量,如此亦會降低神經網路的準確率。能否在壓縮 DNN 模型大小的同時,保證準確率不下降呢?
- 模型裁剪、再訓練:恢復準確率
裁剪「不重要」的神經網路節點,通過再訓練的方式,恢復模型準確率。
- teacher-student 訓練方法, Dark knowledge(Hinton)
t 利用大的神經網路訓練更小的神經網路,使之逼近大神經網路準確率
- SVD 分解矩陣降低運算量、模型壓縮等
近年相關文章已經很多了,簡要參考 FasterDNN。
4.聯合優化
在 2.0 提到, 的計算可以利用 的稀疏性來避免不必要的計算,那麼在 DNN 激活函數選擇 就可以使得激活向量 稀疏(約50%),從而大幅減少 的運算量,而且 通常比 有更高的準確率。
5.Skip Frame 跳幀計算
在移動端的測試,只簡單做了 Android 平台,測得實時率遠低於1,就沒再繼續優化。在上線 DNN 評測模型時,反饋 iPhone 4/itouch4 比較卡卡卡。忽然想起已經實現的跳幀計算還沒有開啟。跳幀計算利用語音信號的特點,運算量減半,準確率幾乎無損失。
Fig4. Baseline 為2.0的baseline
語音評測 benchmark 提升
DNN 相比傳統建模方法,大幅提升了聲學模型的準確率、抗噪能力。語音評測的一個重點就是發音維度評測,與聲學模型練習緊密,DNN 聲學模型的應用,全面提升了語音評測 benchmark。基於DNN的語音評測系統上線一年有餘。
Voice Activity Detection(VAD)
自動停止錄音功能根據停頓時長判斷是否結束錄音,使得語音交互更流暢。基於 DNN 模型的 VAD 模型有效提升了該功能的準確性和靈敏度。
總結
通過模型壓縮、計算等價性變換、矩陣計算優化等方法完成 DNN 模型在移動端的運行時編碼、計算優化,全面提升了語音評測性能。相比網路傳輸服務端計算的方式,離線計算對用戶網路環境要求低,可以給予用戶實時反饋。由於單核 CPU 已做到實時計算,「多核 CPU、Mobile GPU 加速」沒有繼續探索。
據所知,『英語流利說』仍是為數不多可以離線計算深度神經網路模型的手機應用。
保守地說,在當時『英語流利說』是全球首款配備深度神經網路的教育 APP。
首發『英語流利說』離線深度神經網路優化(勘誤:入職日期應為2014年12月),這裡保持原味、略作修改。
推薦閱讀:
TAG:深度学习DeepLearning | 神经网络 | 人工智能 |