- 產品
- 產品解決方案
- 行業解決方案
- 案例
- 數據資產入表
- 賦能中心
- 伙伴
- 關于
時間:2022-04-05來源:徐長卿瀏覽數:377次

導讀:大家好,很榮幸有機會為大家分享AI技術在有道詞典筆上的應用實踐。有道詞典筆是輔助學生查詞、翻譯、學習英語的一款智能硬件產品。今天的分享中將會介紹有道詞典筆的功能,處理用戶掃描和點查的功能圖像技術,無網絡下進行翻譯的離線翻譯技術,以及支持各類AI技術在智能硬件上應用的高性能端側機器學習的計算庫EMLL(Edge ML Library)。
今日分享主要包括以下幾個部分:
有道詞典筆介紹
掃描和點查
離線翻譯
EMLL(Edge ML Library)
01有道詞典筆介紹

有道詞典筆從外觀看是一個小巧的、類似筆狀的、可以握在手里的智能硬件。筆頭部分安有一塊超大廣角的攝像頭,用來掃描圖像和文字,從而接收用戶的輸入。筆身有一塊高清顯示屏,顯示用戶查詢的單詞或翻譯。顯示屏還可以用來交互,幫助孩子學習繪本以及其它的一些功能。先來通過下面的小視頻看看有道詞典筆是如何工作的。
通過視頻可以看到詞典筆有掃描和點查功能。掃描功能是支持跨行整句掃描的。當用戶需要的內容被分隔成很多行時,詞典筆通過換行整句掃描將其拼接成一整句文本,掃描的準確率為98%。同時,掃描的文字支持整句翻譯。我們也將離線翻譯的服務部署到詞典筆上,在沒有wifi的情況下也可以翻譯。此外,詞典筆極大地提升了查詞效率。過去查詞需要翻閱紙質詞典,這種方式的效率比較低。現在使用有道詞典筆點擊想要查詢的單詞即可查詞,效率提升很明顯。詞典筆安裝了屏幕,支持互動點讀。在繪本上點擊即可和詞典筆進行交互學習。除了以上功能外,詞典筆還有語音合成和輔助的發音訓練等其它功能。

為了支持詞典筆的這些功能,用到了很多技術。今天主要介紹:處理掃描和點查的圖像技術,將翻譯服務部署到詞典筆的模型壓縮技術,以及支撐這些技術在端側智能硬件上快速運行的高性能端側機器學習庫EMLL。
02掃描和點查詞典筆的掃描識別和常見的字符識別場景不同。通常字符識別場景的輸入是一張完整圖像。詞典筆掃描的輸入是用戶手持詞典筆在在圖片或文字掃描時攝像頭拍攝下來的圖像。詞典筆的攝像頭每次只能看到一個小窗口的圖像,在掃描的過程中需要不斷進行拍攝。

在掃描時大概每秒會獲得100張圖像。掃描算法需要從圖像中快速提取出用戶想要使用詞典筆處理的文字。

全景拼接是掃描識別中最重要的步驟。這一步驟要從拍攝的100多張圖像中找到要識別的文本行。好的拼接算法對后續識別的影響很大。如果拼接的不好,如PPT下側的示意內容,后續的識別算法也很難得到正確的輸出。

全景拼接算法分為三個階段:
像素級檢測:對每個像素位置進行文字和背景的分類;
中心組行:基于分類結果和位置信息,將掃描的中心文字鏈接并組合成行;
糾正切行:將文本行從復雜的背景中切分出來,送到后續的識別模塊。

除了全景拼接之外,還會遇到用戶使用詞典筆在不同的物體或者彎曲的表面進行識別的情況。此外,掃描識別到的文字可能是特殊字體、形近字,以及復雜物體表面的背景都會干擾識別結果。

因此,對識別算法進行了優化。在常規識別模塊的基礎上,算法新增了糾正模塊。在掃描場景中,可能發現某個字符出錯。比如,將“breakfast”中的“a”識別為“d”。在糾正模塊中,加入了字符級別的語言模型,該模型可以對識別結果進行修正,將“bredkfast”字符“d”糾正為字符“a”。

為了快速查詞,詞典筆增加了超快點查的功能,通過點擊就可以得到完整的單詞。為了增加這個功能,需要對硬件進行調整。詞典筆新增了超大廣角攝像頭,一次就可以將完整、超長的單詞拍下來。但由于廣角鏡頭拍攝的范圍比較大,會導致廣角畸變;此外,不同位置的光照可能不完全相同,這也帶來了光照不均的問題。為了解決這一問題,我們對算法進行了一些調整:用廣角攝像頭預先拍攝一些圖像,基于拍攝的圖像和正確的圖像可以得到廣角圖像和真實圖像之間的變換參數;之后將廣角鏡頭采集到的圖像進行逆變換得到無畸變的圖像;對光照中的陰影部分進行補償進而得到增強圖像。最后將獲得的增強圖像送入OCR(文字檢測識別)模塊得到最終的識別結果。通過以上的方式,可以使識別結果達到98%的準確率。

接下來介紹一下自然語言處理離線翻譯。
有道詞典筆的定位是一個學習產品,客觀上存在無網絡使用的場景,比如:用戶會將它帶到學校,或者在境外購物時使用它來掃描商品的標簽。此外,離線翻譯不需要將請求發送至遠程服務器處理再將結果反饋至用戶的詞典筆,它的時延低。同時,在掃描時會拍攝很多照片,離線翻譯相較在線處理不需要上傳照片到服務器,更節約帶寬。很多用戶對隱私數據安全性有要求,將服務部署到詞典筆中不需要向服務器發送數據,用戶數據的安全性也更高。

在介紹離線翻譯模型壓縮之前,先來看看目前的在線翻譯模型。在線翻譯模型使用了編碼器-解碼器架構,包含多個編碼器層和解碼器層。因為線上可以使用的資源較多,為了提升模型效果,模型的深度和寬度也大,這導致模型參數量達到了上億的規模,計算量非常大。此外,線上服務端使用的GPU和很好的硬件,線上延時對用戶來說是沒有影響的。但將線上的服務部署到詞典筆這類端側設備中時,可用的資源就沒有線上那么多,因此需要對線上的模型進行壓縮。

有研究表明:對神經網絡的維度成倍增加時,模型結果沒有達到成倍的效果。這說明神經網絡模型存在冗余。因此,可以對模型的參數進行壓縮。

我們使用了裁剪、參數共享、量化等多個模型壓縮方法將翻譯服務部署到智能詞典筆之中。

首先,對模型的寬度和深度進行裁剪。在此過程我們進行了大量實驗,實驗結果表明:編碼器相較解碼器更為重要。因此,在進行深度裁剪時采用了優先保留編碼器層數、壓縮解碼器層數的方式。目前的模型是一個5層編碼器3層解碼器的結構。在減少深度的同時,也對模型的寬度進行壓縮。

除了深度和寬度的裁剪之外,也進行了其它分析。數據表明模型比較大的參數集中在模型的Embedding矩陣中,比如:右圖中有三個Embedding矩陣。源端的Input Embedding,目標端的Output Embedding,在Softmax的輸出層將Linear input的函數投影到詞表空間中,Linear層的參數也可以看成是一個Embedding。這三個比較大的Embedding的參數量加起來占到模型參數量的一半左右。以上分析表明,最主要的目標是減少詞向量的參數量。分析發現以上三個Embedding的詞向量是可以共享的。目標端Output Embedding和投影層的Softamax Embedding層的詞向量在意思上和源端的詞向量是一一對應的。輸入端的Input Embedding和目標端的Output Embedding也是可以共享的。分析發現很多同樣語系的詞共享了很多單詞。包括在中文和英文互譯時,我們發現中文中夾雜了很多英語,比如:在介紹專有名詞時會使用英文。因此,可以將源端的詞和目標端的詞的Embedding進行共享。

除了詞向量之間的共享,我們還做了不同層之間的共享。這部分是參考了Shared Attention。標準Transformer模型的Attention的輸入包含三部分:Query、Key、Value。Standard Attention Transformer這三部分都是不同的。在Shared Attention中,Query和Key在不同層之間進行了共享,這包含Attention權重和輸出的共享,這對模型壓縮很有用。

此外,還進行了一些模型量化的工作。在訓練中,大部分使用浮點數進行訓練。浮點數Float有4個字節,但高精度的浮點類型不是很有必要,可將其轉化為低精度的整型計算。我們采用了線性映射的方式進行轉換,比如:將浮點類型-10到30的區間映射到為0到255之間,0代表-10,255代表30。將浮點數轉化為低精度整型計算后,整個浮點數的計算也是使用量化運算的,這塊參考了谷歌的計算方式。

量化帶來了很多好處。首先,相較浮點型運算,整型計算量變少,對NPU、DSP芯片友好。此外,整型比浮點數存儲規模減少。量化可能會影響模型質量,但實驗發現如果只對模型部分參數進行量化的情況下對模型質量影響也比較小。
除了前面提到的共享、量化的方法,我們還使用知識蒸餾對模型進行壓縮。通過減深度、共享、量化會導致模型質量下降比較多。從PPT的表格可以看出,如果只是減深度,模型的質量從19.6降低到14.7,質量的下降幅度還是比較大的。

因此,可以將大的教師模型的效果通過知識蒸餾的方式轉移到學生模型中去。教師模型是一個比較大的模型,我們不關注模型的速度,只關心模型的質量。學生模型是一個比較小的模型,我們希望它計算的比較快,可以部署到端側設備中。通過知識蒸餾將教師模型的性能轉移到學生模型上,進而獲得了一個小而快且質量接近教師模型的模型。

知識蒸餾在機器翻譯中有不用的層次。詞級別蒸餾指的是教師模型每次預測出一個詞的分布,通過該分布監督學生模型每一步的輸出。通常學生模型如果從真實語料中學習的話只能學到語料標注的一個標簽的信息,但教師模型在預測每一步的時候時會給出完整詞表中詞的分布,包含的知識更多。此外,還有句子級別的蒸餾模型。教師模型根據每個句子推理出模型結果,使用該結果作為標簽監督學生模型。在PPT中,左邊是詞級別的知識蒸餾方式,教師模型中每一步預測出一個向量用來監督學生模型。中間是一個句子級別的知識蒸餾的方式,教師模型通過推理的方式推理出當前最好的翻譯結果,將翻譯的結果作為句子標簽去訓練學生模型。通常情況下,句子級別的知識蒸餾會和真實的Ground Truth標簽進行差值結合。在我們的方法上實驗發現,進行句子級別蒸餾的方式和教師模型相差的不多。

前面我們對詞典筆、詞典筆中掃描點查和翻譯技術進行了介紹,為了讓這些技術在詞典筆更好的運行,我們開發了高性能端側機器學習計算庫EMLL(Edge ML Library)。
先來看看端側AI面臨的挑戰:
首先,算力、內存有限。相較云端計算而言,端側計算的算力、內存都小了很多量級,這就為算法的部署帶來很大挑戰。
其次,詞典筆和手機這樣的硬件相比電池容量有限,功耗也有很大限制。
此外,AI算法一直在更新,模型也越來越復雜。算法更新后,在小的智能硬件部署也會更加復雜。
最后,在智能硬件部署時不是單AI應用的部署而是需要將AI算法和多個應用一起部署,難度也更大。
后面主要介紹計算相關的工作,先來看看目前端側AI芯片。傳統的是ARM CPU架構,這也是當前端側AI落地主流的平臺。最近幾年也有NPU、DSP、GPU的端側異步計算平臺。受生態環境影響,當前可落地的AI應用比較有限。之前提到端側設備的功耗比較有限,考慮到NPU、DSP有很好的降低功耗效果,這種異步架構也是未來發展的趨勢。
從計算角度來看,端側AI計算主要耗時集中在底層的矩陣層計算中。從神經網絡角度來說,卷積層很多情況下可以轉換成矩陣層計算的形式。云端計算時可以通過Batch將矩陣層變為一個比較大的矩陣。但在端側一般都是單用戶的請求,往往是一個扁平矩陣的乘法。如PPT中右圖所示,端側AI計算時的輸入矩陣或中間矩陣是一個行很小(幾到幾十)列很大(可能幾千到幾萬)的矩陣,稱其為X。X與一個與正方形矩陣或長方形的權重矩陣相乘得到一個扁平矩陣。在矩陣層有很多第三方Blas庫,但作為一個通用庫,Blas在優化的時候對常規的矩陣優化性能比較好,但對端側AI場景下的矩陣計算性能表現一般。我們選擇了三種矩陣尺寸,在Eigen、OpenBLAS和ARM Compute Library庫中做了性能測試,數據顯示在ARM cortex-A53芯片中計算效率都比較低,有的甚至不到10%。考慮到端側芯片的性能本身相對比較差,而計算又不能充分發揮芯片的性能,這給部署帶來了更大的挑戰。

基于此,我們自己開發了端側機器學習計算庫EMLL(Edge ML Library),這個庫主要是為了加速端側AI推理而設計。這個庫針對端側AI常見的扁平矩陣計算做了專門的性能優化。目前支持fp32、fp16、int8等數據類型。此外,還針對端側ARM cortex-A7/A35/A53/A55等低端芯片及ARM cortex-A76/A77等高端芯片進行匯編優化。數據測試結果顯示:ARM cortex-A76/A77的優化性能比ARM cortex-A35的性能高一個量級。受成本限制,在手機等移動端的芯片性能比較高,但在很多智能硬件中芯片(如ARM cortex-A35)的性能相對較差。這種情況下就需要對芯片的性能進行優化。端側運行的操作系統支持Linux和Android。目前我們的學習庫已開源,歡迎大家使用并提出寶貴意見。git地址為https://github.com/netease-youdao/EMLL。

EMLL庫在訪存和計算方面也進行了優化。在進行計算時,EMLL對不同尺寸矩陣的分配策略不同。考慮到不同芯片的匯編指令有別,EMLL針對不同的芯片采用了不同的優化方法。

EMLL目前支持矩陣乘法中支持常規的float32、float16和量化后的int8,以及常見的量化函數。在架構層支持ARMv7a和ARMv8a的架構。

針對單個矩陣層,在A35和A53芯片進行了優化。如PPT所示,左邊是A35右邊是A53,數字代表每秒計算的GFLOPS值。相較Eigen3和ARM Compute Lib v20,EMLL在性能上都有了很大的提升。

接下來看看EMLL在有道智能硬件中的性能。有道詞典筆使用的是A35的CPU,有道超級詞典和有道翻譯王使用的是A53的CPU。我們測試了手機上高端芯片A76的表現和更低端的A7芯片的表現。下圖中右側展示了性能測試的結果,測試了NMT、ASR和OCR使用EMLL和Eigen端到端的性能加速比。
用戶體驗好:EMLL相較Eigen有30%到一倍多的性能加速比,更高的性能可以降低延遲帶來更好的用戶體驗。
模型準確率提升:運算速度提升后延遲降低,在有效的時間保證更快的計算,因此可以通過增大模型提升模型質量。比如:可以將翻譯模型增大30%,這可以將模型的準確率提升好幾個點。
提升市場競爭力:之前詞典筆使用A35是可以滿足實時性而A7是完全不滿足的,使用EMLL后雖然A7的性能相較A35差一些,但是已經可以滿足使用需求。考慮到目前芯片荒的情況,這也增加了我們芯片的選型的空間和市場競爭力。

我們也評估了EMLL離線NMT的量化效果,在同模型對比int8和int32,在BLEU降低0.1的情況下,速度提升45%~67%,內存減少50%~60%。使用大模型int8和小模型的int32進行對比,其中大模型比小模型大50%,速度提升10%(也可以認為在沒有下降)的情況下,將BLEU提升0.1,將內存降低32%。

最后借DataFun平臺進行一個招聘,網易有道團隊招聘算法、功能和產品同事,感興趣的小伙伴可以加我微信或將簡歷發送至zhanggy@youdao.com。

Q:中英模型的目標矩陣共享會導致目標端詞表增加,這是否會導致解碼速度變慢?
A:中文和英文的字符集差異比較大,共享矩陣會導致共享詞存儲增加。在真實使用中,在中文夾雜阿拉伯數字、拼音、英文時實際上和英文端是有很多重疊,因此合并的收益是增加的。目標端詞表可以通過詞表裁剪方式將其控制在一個相對合理的范圍。結合EMLL庫的使用,整體速度是不會受太大影響的。
Q:參數共享、量化和蒸餾這三種模型壓縮的方法在機器翻譯中可以同時使用嗎?如果可以同時使用,對翻譯質量會有多大的影響?對推理速度會有怎樣的影響?
A:可以同時使用。
(1)翻譯質量
參數共享對速度影響不大,質量無損失。量化對質量的影響也比較低,合理選擇量化對質量影響很小。此外,量化使模型計算速度變快,進而增大模型從而提升模型質量。蒸餾將大模型質量應用到小模型,使得小模型質量接近大模型,這是提升模型質量的。
(2)推理速度影響
參數共享會導致詞表變大,有一些影響。量化是提升推理速度的,EMLL庫對模型量化進行了優化,速度提升很明顯。蒸餾只改變訓練過程會提升模型質量,不會影響模型速度。