大家好,很榮幸有機(jī)會為大家分享AI技術(shù)在有道詞典筆上的應(yīng)用實(shí)踐。有道詞典筆是輔助學(xué)生查詞、翻譯、學(xué)習(xí)英語的一款智能硬件產(chǎn)品。今天的分享中將會介紹有道詞典筆的功能,處理用戶掃描和點(diǎn)查的功能圖像技術(shù),無網(wǎng)絡(luò)下進(jìn)行翻譯的離線翻譯技術(shù),以及支持各類AI技術(shù)在智能硬件上應(yīng)用的高性能端側(cè)機(jī)器學(xué)習(xí)的計(jì)算庫EMLL(Edge ML Library)。
今日分享主要包括以下幾個部分:
- 有道詞典筆介紹
- 掃描和點(diǎn)查
- 離線翻譯
- EMLL(Edge ML Library)
01
有道詞典筆介紹
有道詞典筆從外觀看是一個小巧的、類似筆狀的、可以握在手里的智能硬件。筆頭部分安有一塊超大廣角的攝像頭,用來掃描圖像和文字,從而接收用戶的輸入。筆身有一塊高清顯示屏,顯示用戶查詢的單詞或翻譯。顯示屏還可以用來交互,幫助孩子學(xué)習(xí)繪本以及其它的一些功能。先來通過下面的小視頻看看有道詞典筆是如何工作的。
,時長00:23
通過視頻可以看到詞典筆有掃描和點(diǎn)查功能。掃描功能是支持跨行整句掃描的。當(dāng)用戶需要的內(nèi)容被分隔成很多行時,詞典筆通過換行整句掃描將其拼接成一整句文本,掃描的準(zhǔn)確率為98%。同時,掃描的文字支持整句翻譯。我們也將離線翻譯的服務(wù)部署到詞典筆上,在沒有wifi的情況下也可以翻譯。此外,詞典筆極大地提升了查詞效率。過去查詞需要翻閱紙質(zhì)詞典,這種方式的效率比較低。現(xiàn)在使用有道詞典筆點(diǎn)擊想要查詢的單詞即可查詞,效率提升很明顯。詞典筆安裝了屏幕,支持互動點(diǎn)讀。在繪本上點(diǎn)擊即可和詞典筆進(jìn)行交互學(xué)習(xí)。除了以上功能外,詞典筆還有語音合成和輔助的發(fā)音訓(xùn)練等其它功能。
為了支持詞典筆的這些功能,用到了很多技術(shù)。今天主要介紹:處理掃描和點(diǎn)查的圖像技術(shù),將翻譯服務(wù)部署到詞典筆的模型壓縮技術(shù),以及支撐這些技術(shù)在端側(cè)智能硬件上快速運(yùn)行的高性能端側(cè)機(jī)器學(xué)習(xí)庫EMLL。
02
掃描和點(diǎn)查
詞典筆的掃描識別和常見的字符識別場景不同。通常字符識別場景的輸入是一張完整圖像。詞典筆掃描的輸入是用戶手持詞典筆在在圖片或文字掃描時攝像頭拍攝下來的圖像。詞典筆的攝像頭每次只能看到一個小窗口的圖像,在掃描的過程中需要不斷進(jìn)行拍攝。
在掃描時大概每秒會獲得100張圖像。掃描算法需要從圖像中快速提取出用戶想要使用詞典筆處理的文字。
全景拼接是掃描識別中最重要的步驟。這一步驟要從拍攝的100多張圖像中找到要識別的文本行。好的拼接算法對后續(xù)識別的影響很大。如果拼接的不好,如PPT下側(cè)的示意內(nèi)容,后續(xù)的識別算法也很難得到正確的輸出。
全景拼接算法分為三個階段:
- 像素級檢測:對每個像素位置進(jìn)行文字和背景的分類;
- 中心組行:基于分類結(jié)果和位置信息,將掃描的中心文字鏈接并組合成行;
- 糾正切行:將文本行從復(fù)雜的背景中切分出來,送到后續(xù)的識別模塊。
除了全景拼接之外,還會遇到用戶使用詞典筆在不同的物體或者彎曲的表面進(jìn)行識別的情況。此外,掃描識別到的文字可能是特殊字體、形近字,以及復(fù)雜物體表面的背景都會干擾識別結(jié)果。
因此,對識別算法進(jìn)行了優(yōu)化。在常規(guī)識別模塊的基礎(chǔ)上,算法新增了糾正模塊。在掃描場景中,可能發(fā)現(xiàn)某個字符出錯。比如,將“breakfast”中的“a”識別為“d”。在糾正模塊中,加入了字符級別的語言模型,該模型可以對識別結(jié)果進(jìn)行修正,將“bredkfast”字符“d”糾正為字符“a”。
為了快速查詞,詞典筆增加了超快點(diǎn)查的功能,通過點(diǎn)擊就可以得到完整的單詞。為了增加這個功能,需要對硬件進(jìn)行調(diào)整。詞典筆新增了超大廣角攝像頭,一次就可以將完整、超長的單詞拍下來。但由于廣角鏡頭拍攝的范圍比較大,會導(dǎo)致廣角畸變;此外,不同位置的光照可能不完全相同,這也帶來了光照不均的問題。為了解決這一問題,我們對算法進(jìn)行了一些調(diào)整:用廣角攝像頭預(yù)先拍攝一些圖像,基于拍攝的圖像和正確的圖像可以得到廣角圖像和真實(shí)圖像之間的變換參數(shù);之后將廣角鏡頭采集到的圖像進(jìn)行逆變換得到無畸變的圖像;對光照中的陰影部分進(jìn)行補(bǔ)償進(jìn)而得到增強(qiáng)圖像。最后將獲得的增強(qiáng)圖像送入OCR(文字檢測識別)模塊得到最終的識別結(jié)果。通過以上的方式,可以使識別結(jié)果達(dá)到98%的準(zhǔn)確率。
03
離線翻譯
接下來介紹一下自然語言處理離線翻譯。
有道詞典筆的定位是一個學(xué)習(xí)產(chǎn)品,客觀上存在無網(wǎng)絡(luò)使用的場景,比如:用戶會將它帶到學(xué)校,或者在境外購物時使用它來掃描商品的標(biāo)簽。此外,離線翻譯不需要將請求發(fā)送至遠(yuǎn)程服務(wù)器處理再將結(jié)果反饋至用戶的詞典筆,它的時延低。同時,在掃描時會拍攝很多照片,離線翻譯相較在線處理不需要上傳照片到服務(wù)器,更節(jié)約帶寬。很多用戶對隱私數(shù)據(jù)安全性有要求,將服務(wù)部署到詞典筆中不需要向服務(wù)器發(fā)送數(shù)據(jù),用戶數(shù)據(jù)的安全性也更高。
在介紹離線翻譯模型壓縮之前,先來看看目前的在線翻譯模型。在線翻譯模型使用了編碼器-解碼器架構(gòu),包含多個編碼器層和解碼器層。因?yàn)榫€上可以使用的資源較多,為了提升模型效果,模型的深度和寬度也大,這導(dǎo)致模型參數(shù)量達(dá)到了上億的規(guī)模,計(jì)算量非常大。此外,線上服務(wù)端使用的GPU和很好的硬件,線上延時對用戶來說是沒有影響的。但將線上的服務(wù)部署到詞典筆這類端側(cè)設(shè)備中時,可用的資源就沒有線上那么多,因此需要對線上的模型進(jìn)行壓縮。
有研究表明:對神經(jīng)網(wǎng)絡(luò)的維度成倍增加時,模型結(jié)果沒有達(dá)到成倍的效果。這說明神經(jīng)網(wǎng)絡(luò)模型存在冗余。因此,可以對模型的參數(shù)進(jìn)行壓縮。
我們使用了裁剪、參數(shù)共享、量化等多個模型壓縮方法將翻譯服務(wù)部署到智能詞典筆之中。
首先,對模型的寬度和深度進(jìn)行裁剪。在此過程我們進(jìn)行了大量實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果表明:編碼器相較解碼器更為重要。因此,在進(jìn)行深度裁剪時采用了優(yōu)先保留編碼器層數(shù)、壓縮解碼器層數(shù)的方式。目前的模型是一個5層編碼器3層解碼器的結(jié)構(gòu)。在減少深度的同時,也對模型的寬度進(jìn)行壓縮。
除了深度和寬度的裁剪之外,也進(jìn)行了其它分析。數(shù)據(jù)表明模型比較大的參數(shù)集中在模型的Embedding矩陣中,比如:右圖中有三個Embedding矩陣。源端的Input Embedding,目標(biāo)端的Output Embedding,在Softmax的輸出層將Linear input的函數(shù)投影到詞表空間中,Linear層的參數(shù)也可以看成是一個Embedding。這三個比較大的Embedding的參數(shù)量加起來占到模型參數(shù)量的一半左右。以上分析表明,最主要的目標(biāo)是減少詞向量的參數(shù)量。分析發(fā)現(xiàn)以上三個Embedding的詞向量是可以共享的。目標(biāo)端Output Embedding和投影層的Softamax Embedding層的詞向量在意思上和源端的詞向量是一一對應(yīng)的。輸入端的Input Embedding和目標(biāo)端的Output Embedding也是可以共享的。分析發(fā)現(xiàn)很多同樣語系的詞共享了很多單詞。包括在中文和英文互譯時,我們發(fā)現(xiàn)中文中夾雜了很多英語,比如:在介紹專有名詞時會使用英文。因此,可以將源端的詞和目標(biāo)端的詞的Embedding進(jìn)行共享。
除了詞向量之間的共享,我們還做了不同層之間的共享。這部分是參考了Shared Attention。標(biāo)準(zhǔn)Transformer模型的Attention的輸入包含三部分:Query、Key、Value。Standard Attention Transformer這三部分都是不同的。在Shared Attention中,Query和Key在不同層之間進(jìn)行了共享,這包含Attention權(quán)重和輸出的共享,這對模型壓縮很有用。
此外,還進(jìn)行了一些模型量化的工作。在訓(xùn)練中,大部分使用浮點(diǎn)數(shù)進(jìn)行訓(xùn)練。浮點(diǎn)數(shù)Float有4個字節(jié),但高精度的浮點(diǎn)類型不是很有必要,可將其轉(zhuǎn)化為低精度的整型計(jì)算。我們采用了線性映射的方式進(jìn)行轉(zhuǎn)換,比如:將浮點(diǎn)類型-10到30的區(qū)間映射到為0到255之間,0代表-10,255代表30。將浮點(diǎn)數(shù)轉(zhuǎn)化為低精度整型計(jì)算后,整個浮點(diǎn)數(shù)的計(jì)算也是使用量化運(yùn)算的,這塊參考了谷歌的計(jì)算方式。
量化帶來了很多好處。首先,相較浮點(diǎn)型運(yùn)算,整型計(jì)算量變少,對NPU、DSP芯片友好。此外,整型比浮點(diǎn)數(shù)存儲規(guī)模減少。量化可能會影響模型質(zhì)量,但實(shí)驗(yàn)發(fā)現(xiàn)如果只對模型部分參數(shù)進(jìn)行量化的情況下對模型質(zhì)量影響也比較小。
除了前面提到的共享、量化的方法,我們還使用知識蒸餾對模型進(jìn)行壓縮。通過減深度、共享、量化會導(dǎo)致模型質(zhì)量下降比較多。從PPT的表格可以看出,如果只是減深度,模型的質(zhì)量從19.6降低到14.7,質(zhì)量的下降幅度還是比較大的。
因此,可以將大的教師模型的效果通過知識蒸餾的方式轉(zhuǎn)移到學(xué)生模型中去。教師模型是一個比較大的模型,我們不關(guān)注模型的速度,只關(guān)心模型的質(zhì)量。學(xué)生模型是一個比較小的模型,我們希望它計(jì)算的比較快,可以部署到端側(cè)設(shè)備中。通過知識蒸餾將教師模型的性能轉(zhuǎn)移到學(xué)生模型上,進(jìn)而獲得了一個小而快且質(zhì)量接近教師模型的模型。
知識蒸餾在機(jī)器翻譯中有不用的層次。詞級別蒸餾指的是教師模型每次預(yù)測出一個詞的分布,通過該分布監(jiān)督學(xué)生模型每一步的輸出。通常學(xué)生模型如果從真實(shí)語料中學(xué)習(xí)的話只能學(xué)到語料標(biāo)注的一個標(biāo)簽的信息,但教師模型在預(yù)測每一步的時候時會給出完整詞表中詞的分布,包含的知識更多。此外,還有句子級別的蒸餾模型。教師模型根據(jù)每個句子推理出模型結(jié)果,使用該結(jié)果作為標(biāo)簽監(jiān)督學(xué)生模型。在PPT中,左邊是詞級別的知識蒸餾方式,教師模型中每一步預(yù)測出一個向量用來監(jiān)督學(xué)生模型。中間是一個句子級別的知識蒸餾的方式,教師模型通過推理的方式推理出當(dāng)前最好的翻譯結(jié)果,將翻譯的結(jié)果作為句子標(biāo)簽去訓(xùn)練學(xué)生模型。通常情況下,句子級別的知識蒸餾會和真實(shí)的Ground Truth標(biāo)簽進(jìn)行差值結(jié)合。在我們的方法上實(shí)驗(yàn)發(fā)現(xiàn),進(jìn)行句子級別蒸餾的方式和教師模型相差的不多。
04
EMLL(Edge ML Library)
前面我們對詞典筆、詞典筆中掃描點(diǎn)查和翻譯技術(shù)進(jìn)行了介紹,為了讓這些技術(shù)在詞典筆更好的運(yùn)行,我們開發(fā)了高性能端側(cè)機(jī)器學(xué)習(xí)計(jì)算庫EMLL(Edge ML Library)。
先來看看端側(cè)AI面臨的挑戰(zhàn):
- 首先,算力、內(nèi)存有限。相較云端計(jì)算而言,端側(cè)計(jì)算的算力、內(nèi)存都小了很多量級,這就為算法的部署帶來很大挑戰(zhàn)。
- 其次,詞典筆和手機(jī)這樣的硬件相比電池容量有限,功耗也有很大限制。
- 此外,AI算法一直在更新,模型也越來越復(fù)雜。算法更新后,在小的智能硬件部署也會更加復(fù)雜。
- 最后,在智能硬件部署時不是單AI應(yīng)用的部署而是需要將AI算法和多個應(yīng)用一起部署,難度也更大。
后面主要介紹計(jì)算相關(guān)的工作,先來看看目前端側(cè)AI芯片。傳統(tǒng)的是ARM CPU架構(gòu),這也是當(dāng)前端側(cè)AI落地主流的平臺。最近幾年也有NPU、DSP、GPU的端側(cè)異步計(jì)算平臺。受生態(tài)環(huán)境影響,當(dāng)前可落地的AI應(yīng)用比較有限。之前提到端側(cè)設(shè)備的功耗比較有限,考慮到NPU、DSP有很好的降低功耗效果,這種異步架構(gòu)也是未來發(fā)展的趨勢。
從計(jì)算角度來看,端側(cè)AI計(jì)算主要耗時集中在底層的矩陣層計(jì)算中。從神經(jīng)網(wǎng)絡(luò)角度來說,卷積層很多情況下可以轉(zhuǎn)換成矩陣層計(jì)算的形式。云端計(jì)算時可以通過Batch將矩陣層變?yōu)橐粋€比較大的矩陣。但在端側(cè)一般都是單用戶的請求,往往是一個扁平矩陣的乘法。如PPT中右圖所示,端側(cè)AI計(jì)算時的輸入矩陣或中間矩陣是一個行很小(幾到幾十)列很大(可能幾千到幾萬)的矩陣,稱其為X。X與一個與正方形矩陣或長方形的權(quán)重矩陣相乘得到一個扁平矩陣。在矩陣層有很多第三方Blas庫,但作為一個通用庫,Blas在優(yōu)化的時候?qū)ΤR?guī)的矩陣優(yōu)化性能比較好,但對端側(cè)AI場景下的矩陣計(jì)算性能表現(xiàn)一般。我們選擇了三種矩陣尺寸,在Eigen、OpenBLAS和ARM Compute Library庫中做了性能測試,數(shù)據(jù)顯示在ARM cortex-A53芯片中計(jì)算效率都比較低,有的甚至不到10%。考慮到端側(cè)芯片的性能本身相對比較差,而計(jì)算又不能充分發(fā)揮芯片的性能,這給部署帶來了更大的挑戰(zhàn)。
基于此,我們自己開發(fā)了端側(cè)機(jī)器學(xué)習(xí)計(jì)算庫EMLL(Edge ML Library),這個庫主要是為了加速端側(cè)AI推理而設(shè)計(jì)。這個庫針對端側(cè)AI常見的扁平矩陣計(jì)算做了專門的性能優(yōu)化。目前支持fp32、fp16、int8等數(shù)據(jù)類型。此外,還針對端側(cè)ARM cortex-A7/A35/A53/A55等低端芯片及ARM cortex-A76/A77等高端芯片進(jìn)行匯編優(yōu)化。數(shù)據(jù)測試結(jié)果顯示:ARM cortex-A76/A77的優(yōu)化性能比ARM cortex-A35的性能高一個量級。受成本限制,在手機(jī)等移動端的芯片性能比較高,但在很多智能硬件中芯片(如ARM cortex-A35)的性能相對較差。這種情況下就需要對芯片的性能進(jìn)行優(yōu)化。端側(cè)運(yùn)行的操作系統(tǒng)支持Linux和Android。目前我們的學(xué)習(xí)庫已開源,歡迎大家使用并提出寶貴意見。git地址為
https://github.com/netease-youdao/EMLL。
EMLL庫在訪存和計(jì)算方面也進(jìn)行了優(yōu)化。在進(jìn)行計(jì)算時,EMLL對不同尺寸矩陣的分配策略不同??紤]到不同芯片的匯編指令有別,EMLL針對不同的芯片采用了不同的優(yōu)化方法。
EMLL目前支持矩陣乘法中支持常規(guī)的float32、float16和量化后的int8,以及常見的量化函數(shù)。在架構(gòu)層支持ARMv7a和ARMv8a的架構(gòu)。
針對單個矩陣層,在A35和A53芯片進(jìn)行了優(yōu)化。如PPT所示,左邊是A35右邊是A53,數(shù)字代表每秒計(jì)算的GFLOPS值。相較Eigen3和ARM Compute Lib v20,EMLL在性能上都有了很大的提升。
接下來看看EMLL在有道智能硬件中的性能。有道詞典筆使用的是A35的CPU,有道超級詞典和有道翻譯王使用的是A53的CPU。我們測試了手機(jī)上高端芯片A76的表現(xiàn)和更低端的A7芯片的表現(xiàn)。下圖中右側(cè)展示了性能測試的結(jié)果,測試了NMT、ASR和OCR使用EMLL和Eigen端到端的性能加速比。
- 用戶體驗(yàn)好:EMLL相較Eigen有30%到一倍多的性能加速比,更高的性能可以降低延遲帶來更好的用戶體驗(yàn)。
- 模型準(zhǔn)確率提升:運(yùn)算速度提升后延遲降低,在有效的時間保證更快的計(jì)算,因此可以通過增大模型提升模型質(zhì)量。比如:可以將翻譯模型增大30%,這可以將模型的準(zhǔn)確率提升好幾個點(diǎn)。
- 提升市場競爭力:之前詞典筆使用A35是可以滿足實(shí)時性而A7是完全不滿足的,使用EMLL后雖然A7的性能相較A35差一些,但是已經(jīng)可以滿足使用需求??紤]到目前芯片荒的情況,這也增加了我們芯片的選型的空間和市場競爭力。
我們也評估了EMLL離線NMT的量化效果,在同模型對比int8和int32,在BLEU降低0.1的情況下,速度提升45%~67%,內(nèi)存減少50%~60%。使用大模型int8和小模型的int32進(jìn)行對比,其中大模型比小模型大50%,速度提升10%(也可以認(rèn)為在沒有下降)的情況下,將BLEU提升0.1,將內(nèi)存降低32%。
最后借DataFun平臺進(jìn)行一個招聘,網(wǎng)易有道團(tuán)隊(duì)招聘算法、功能和產(chǎn)品同事,感興趣的小伙伴可以加我微信或?qū)⒑啔v發(fā)送至zhanggy@youdao.com。
05
精彩問答
Q:中英模型的目標(biāo)矩陣共享會導(dǎo)致目標(biāo)端詞表增加,這是否會導(dǎo)致解碼速度變慢?
A:中文和英文的字符集差異比較大,共享矩陣會導(dǎo)致共享詞存儲增加。在真實(shí)使用中,在中文夾雜阿拉伯?dāng)?shù)字、拼音、英文時實(shí)際上和英文端是有很多重疊,因此合并的收益是增加的。目標(biāo)端詞表可以通過詞表裁剪方式將其控制在一個相對合理的范圍。結(jié)合EMLL庫的使用,整體速度是不會受太大影響的。
Q:參數(shù)共享、量化和蒸餾這三種模型壓縮的方法在機(jī)器翻譯中可以同時使用嗎?如果可以同時使用,對翻譯質(zhì)量會有多大的影響?對推理速度會有怎樣的影響?
A:可以同時使用。
(1)翻譯質(zhì)量
參數(shù)共享對速度影響不大,質(zhì)量無損失。量化對質(zhì)量的影響也比較低,合理選擇量化對質(zhì)量影響很小。此外,量化使模型計(jì)算速度變快,進(jìn)而增大模型從而提升模型質(zhì)量。蒸餾將大模型質(zhì)量應(yīng)用到小模型,使得小模型質(zhì)量接近大模型,這是提升模型質(zhì)量的。
(2)推理速度影響
參數(shù)共享會導(dǎo)致詞表變大,有一些影響。量化是提升推理速度的,EMLL庫對模型量化進(jìn)行了優(yōu)化,速度提升很明顯。蒸餾只改變訓(xùn)練過程會提升模型質(zhì)量,不會影響模型速度。
今天的分享就到這里,謝謝大家。
分享嘉賓:
本文經(jīng)授權(quán)發(fā)布,不代表增長黑客立場,如若轉(zhuǎn)載,請注明出處:http://gptmaths.com/cgo/product/63410.html