張競丹 韓俊剛
(西安郵電大學(xué)計算機學(xué)院 西安 710100)
近年來,移動端圖形處理單元(Graphic Processing Units,GPU)已經(jīng)開始在低功耗的片上系統(tǒng)(system-on-a-chip,SoC)設(shè)備中使用,因其通用計算性能和軟件棧的發(fā)展使得人們開始致力于研究移動設(shè)備的加速能力。隨著人工智能狂潮的到來,大數(shù)據(jù)異構(gòu)計算再次興起,由蘋果、AMD 和IBM 等公司聯(lián)合開發(fā)的一個通用開放API——OpenCL,因其普適性和易于理解的良好性能成為搭建移動異構(gòu)計算的最佳選擇,它為異構(gòu)計算系統(tǒng)上的并行編程提供了工業(yè)標準[1]。在最初,Android 官方?jīng)]有明確聲稱移動設(shè)備可以支持OpenCL,但直到2014年左右,Android 移動設(shè)備供應(yīng)商開始提供OpenCL SDK,這種轉(zhuǎn)變是由于MaliT604 和高通Adreno 320移動端GPU 的產(chǎn)生。由于種種限制,OpenCL 在移動 GPU 上的編程存在很多挑戰(zhàn)[2]。OpenCL 是一個基于C 語言的軟件庫,在Android 系統(tǒng)中必須通過Android NDK(Native Development Kit,NDK)交叉編譯在生成動態(tài)庫并在應(yīng)用程序中調(diào)用。
說話人識別是根據(jù)收集到的語音信號鑒別說話人身份的技術(shù)。根據(jù)識別對象,說話人識別可以分為文本相關(guān)(text-dependent)的和文本無關(guān)的(text-dependent)兩種類型[3]。在文本相關(guān)的說話人識別中,在訓(xùn)練和識別階段說話內(nèi)容都要保持一致,文本無關(guān)的說話人識別則在訓(xùn)練和測試階段說話的內(nèi)容不影響系統(tǒng)的判別。從另一方面,根據(jù)待識別的說話人是否在已知集合內(nèi),可以分為閉集識別問題和開集識別問題,前者待識別的人在集合內(nèi),判斷測試語音是否屬于集合內(nèi)的某個說活人;后者待識別的人不一定在集合內(nèi),判斷待測試語音是否屬于集合內(nèi)的某個說話人[4]。按照識別任務(wù)來區(qū)分,說話人識別還可以分為說話人辨認(Speaker Identification,SI)和說話人確認(Speaker Verification,SV),SI 根據(jù)說話人的語音確定其為待選的多個說話人中的某一個;SV 則是證實說話人的身份與其聲明的身份是否相同。本文的說話人識別系統(tǒng),是文本無關(guān)的閉集合內(nèi)的說話人辨認系統(tǒng),在Matlab 上實現(xiàn)后,將系統(tǒng)重寫成C 語言移植于Andoid 端,通過OpenCL 并行加速,將加速前后的系統(tǒng)運行時間做對比。Android 端實驗結(jié)果表明,通過OpenCL加速后的加速比1.5左右。
說話人識別系統(tǒng)通常分為三個模塊:1)特征提取;2)說話人模型訓(xùn)練;3)說話人打分[5]。文章中,輸入的語音信號經(jīng)過預(yù)加重后按20ms 幀長,10ms幀移進行分幀,使用漢明窗進行幀加窗減小截斷效應(yīng),對每個短時分析窗通過FFT變換得到對應(yīng)幀頻譜,再將幀頻譜通過Mel 濾波器組映射到Mel 頻譜中,最后在Mel 頻譜上進行倒譜分析(取對數(shù),DCT逆變換)[6]獲得 13 維 MFCCs。由于 MFCCs 反映的是說話人頻譜包絡(luò)靜態(tài)特征,有實驗表明,二次特征提取的動態(tài)特征有利于更充分地表示說話人特征,所以加入MFCCs 一階、二階差分值,共24 維特征。為了反映出說話人相對較長時域的特征,本文中不單獨使用一個幀長的MFCCs,而是根據(jù)[7]中的方法,將相鄰的7 個MFCCs(左邊3 個,右邊3 個)拼接起來,通過 LDA(Linear Discrimination Analysis,LDA)將高維樣本特征投影到最佳鑒別矢量空間,投影后保證樣本在新的子空間有最大類別間距和最小類內(nèi)間距。具體算法為[8]
其中B為類間方差矩陣,W 為類內(nèi)方差矩陣,N為樣點總數(shù),k 為類別數(shù),nk為第k 類樣點數(shù),式(4)、(5)是第k 類樣本和所有樣本的均值向量。將連接的 7 幀共 168 維 MFCCs 根據(jù)式(6)進行 LDA 投影為47維特征向量。
式(6)中p 為幀數(shù);m 為特征維數(shù);U 是最優(yōu)線性變換矩陣。
典型的說話人模型分為兩種,即模板模型和隨機模型[9]。前者將訓(xùn)練特征參數(shù)和測試特征參數(shù)進行比較,兩者間的失真作為相似度;后者用一個概率密度函數(shù)模擬說話人,訓(xùn)練過程用于預(yù)測概率密度函數(shù)的參數(shù),匹配過程通過計算相應(yīng)模型的測試語句相似度來完成。本文中采用文獻[10]的方法,用含有一層隱藏層的前饋神經(jīng)網(wǎng)絡(luò)作為說話人的模板模型。文獻[10]中指出,該模型的表現(xiàn)比基于碼本(codebook)的模型較好,但略遜色于較大的模型。在網(wǎng)絡(luò)的訓(xùn)練過程中,將樣本隨機打亂后,采用batch 梯度下降學(xué)習方法進行參數(shù)更新[11],batch大小取值128。
本文系統(tǒng)在Matlab 上進行仿真。實驗數(shù)據(jù)使用TIMIT數(shù)據(jù)庫中隨機抽取的20個說話人,其中男人10個,女人10個,每人使用6條語音訓(xùn)練,4條語音測試。每條語音時長約為3s 左右。根據(jù)2 中的方法提取說話人特征。
在準備數(shù)據(jù)過程中,訓(xùn)練正樣本為目標說話人的語音,訓(xùn)練負樣本為其余19 人非目標說話人,但這樣會導(dǎo)致正負樣本比例不平衡。本文中采用SMOTE[12]過采樣算法對正例進行插值來增加樣本,同時隨機抽取負樣本使得正負樣本比例保持在1∶1左右。
在網(wǎng)絡(luò)搭建過程中,最重要的是要確定網(wǎng)絡(luò)隱藏層節(jié)點數(shù)。本文對不同的隱藏層神經(jīng)網(wǎng)絡(luò)的分類能力做了詳細的實驗,用ROC 曲線下的面積指標來判定哪一個隱層節(jié)點數(shù)下的網(wǎng)絡(luò)分類能力較好。通過實驗,發(fā)現(xiàn)隱層節(jié)點數(shù)取值為20 時,ROC曲線面積最大,如表1所示。
表1 Roc面積對比
在網(wǎng)絡(luò)訓(xùn)練過程中,學(xué)習率是影響梯度下降過程中收斂到全局最小值的關(guān)鍵因素。在實驗中,學(xué)習率過大,驗證集誤差值震蕩不收斂,如對比圖1和圖2;學(xué)習率較小導(dǎo)致訓(xùn)練時間長,所以只有選擇合適的學(xué)習率才能是模型很好的工作。在本文中,采用以10 倍的比例減小學(xué)習率,觀察loss 曲線圖找到最佳學(xué)習率。
圖1 學(xué)習率為0.5的訓(xùn)練誤差
圖2 學(xué)習率為0.0005的訓(xùn)練誤差
最終的網(wǎng)絡(luò)結(jié)構(gòu)如表2所示。
表2 網(wǎng)絡(luò)結(jié)構(gòu)
實驗采用等錯誤率(Equal Error Rate,EER)[15]對實驗結(jié)果進行評判。本文系統(tǒng)在該數(shù)據(jù)集上EER值為10.6%。
本文代碼實現(xiàn)運行在高通Adreno 530 GPU下,Adreno 530 可以支持完整 OpenCL 2.0 標準[13]。本文代碼中,將上述說話人識別系統(tǒng)改寫成c 代碼,通過Android NDK 將c 代碼編譯成動態(tài)庫在java 中通過接口調(diào)用并一起打包生成APK。
由于BP訓(xùn)練算法在正向傳播和反向傳播的過程涉及大量矩陣運算,且在迭代過程中每個batch size 內(nèi)的數(shù)據(jù)相關(guān)性較小,所以本文中分別針對前向傳播和反向傳播的數(shù)據(jù)流各設(shè)計一個kernel 函數(shù)進行并行計算[14]。
在前向傳播中,每次計算輸入特征值到輸出誤差的計算過程中,各個特征值之間沒有依賴性,所以設(shè)計kernel1 來實現(xiàn)隱藏層輸入輸出以和輸出層輸入輸出及輸出誤差,并開啟batch size 個線程并行計算。在反向傳播中由于隱藏層和輸出層的連接權(quán)重、輸入層和隱藏層的連接權(quán)重可以分別單獨計算,所以設(shè)計kernel2 實現(xiàn)對單個權(quán)重進行計算,并以線程的global_id標識每個權(quán)重,達到并行加速的目的。設(shè)計中kernel2需要等待kernel1的結(jié)果計算 batch size 的累積誤差,cpu 端通過 OpenCL 接口clEnqueueNDRangeKernel()函數(shù)指定 kernel2 等待kernel1的event事件。Android端實驗結(jié)果如表3所示。表中分別對比了一層隱層和兩層隱層的網(wǎng)絡(luò)訓(xùn)練速度。
表3 Android端試驗結(jié)果對比 (單位:s)
通過試驗發(fā)現(xiàn)OpenCL 加速后,系統(tǒng)的運行時間有了一定的提升,加速比1.5 左右。在隨著硬件廠商對移動端OpenCL 支持逐步完善,以及GPU 性能的提升,可以很好地利用OpenCL對應(yīng)用加速。
在近些年興起的移動平臺,并行計算已經(jīng)在移動平臺具備硬件條件和編程標準的支持,而并行化又可以帶來提升設(shè)備硬件利用效率,同時GPU 的低主頻特性又可以在一定程度上降低功耗,因此在智能手機等移動平臺實現(xiàn)并行計算具有巨大的潛在價值,特別在當前手機續(xù)航時間不能滿足用戶要求的背景下,并行化的特性顯得尤為重要。將并行計算與機器學(xué)習算法相結(jié)合,將理論落實到應(yīng)用才能進一步響應(yīng)“AI革命”的號召。