多語言ASR?沒有什麼聽不懂,15種語言我全都要
摘要:在這篇博文中,我們介紹來自Google的一篇論文《Scaling End-to-End Models for Large-Scale Multilingual ASR》,來看看如何構建一個能夠識別15種語言的多語ASR系統。
本文分享自華為雲社群《》,作者:xiaoye0829 。
在這篇博文中,我們介紹來自Google的一篇論文《Scaling End-to-End Models for Large-Scale Multilingual ASR》。建立一個能識別多種語言的ASR系統,是十分有挑戰的,因為這些語言之間存在著非常大的差異,並且資料量十分不均衡。現有的工作中,我們可以觀察到利用有豐富語料的語言,可以幫助只有少量語料的語言的學習,但是這往往也伴隨著,有豐富語料的語言的效果會下降。我們在15種語言上進行了研究,每種語言的大小從7.7千小時到54.7千小時,我們發現增大模型的引數量,是解決容量瓶頸的有效方法,我們500M引數的模型,已經超過了單語的baseline模型,當我們把模型引數進一步增大到1B或者10B時,我們能獲得更大的收益。另外,我們發現大模型不僅在資料利用上更有效,在訓練時間上也更有效率,我們的1B(10億)引數的模型達到和500M引數的模型相同的準確率,只花了34%的時間。當模型容量有限時,增加模型的深度,通常比增加模型的寬度要好,更大的encoder,也往往比更大的decoder要好。
多語言ASR的關注點通常在於提高低資源(只有少量語料)語言的效能,背後的思想是,利用相似語言的資料,多種語言一起聯合最佳化,以及連續的正向遷移從高資源語言的遷移。在這篇文章中,我們從容量(capacity)的視角來研究下,在多語言的模型中,高資源語言的效能下降問題。
先前的工作探索過50到100種語言,但是資料集的大小十分有限,最大的資料集僅僅只有1k小時的演講資料。在我們的實驗中,每種語言的資料量從7.7千小時到54.7千小時(如下圖,counts代表語音的條數,hours代表語音的時長),這使得我們可以有一個高質量的單語模型,那麼我們就是要訓練一個多語的模型,能夠超過每個單語的模型。我們從容量的角度展示瞭如何去解決這個問題。
隨著模型容量上升,我們成功恢復了所有高資源單語模型的效能。我們做了很多對比試驗,並發現增加深度通常能取得比增加寬度更好的效果,並且我們發現,encoder的容量往往與模型的識別效果很相關。我們觀察到,在固定的模型容量下,如何分配語言的資訊變得不那麼重要了。而且,大模型更簡單,並且更有效率,需要更少的訓練輪次,和更少的TPU時間,去達到相似的實驗效果。
在本文的多語言ASR系統中,使用的是一個基於attention的encoder-decoder模型。對於encoder,我們使用Conformer架構,包含一個輸入對映層,一個相對位置嵌入層,以及一些conformer層。第一個conformer塊,包含4個conformer層。第二個conformer塊,包含一個conformer層。我們的decoder嘗試了兩種不同的架構,一種是單向的LSTM,另一種是帶有掩碼的自注意和跨注意力機制的Transformer。我們的輸出詞表大小為一個有3328個token的表,在這個表中, 3315個token是在訓練集中至少出現了1000次,剩下的token是一些特殊的token,類似“<s>”</s>“”,和一些佔位填充符。詞表中的大部分詞來自於中文,並且中文由於在訓練集中的覆蓋面,是唯一一個有OOV問題的語言。我們將語言資訊也編碼成一個one-hot向量,作為一個額外的輸入。我們在訓練的時間,簡單地把所有資料放在一起,並且根據資料分佈,在每個batch裡,去進行取樣。整個eocoder-decoder模型是在網路的輸出和真實文字間,用交叉熵進行最佳化的。
實際上,我們有很多方法,去縮放一個基於encoder-decoder的多語言模型,在這篇文章中,我們主要研究下面四種模式的影響:
- 深度 vs 寬度;
- encoder vs decoder;
- 語言相關的模型容量 vs 語言無關的模型容量;
- 架構 vs 容量。
嚴格來說,模型容量並不完全等於模型的引數量,比如模型大小。對於有語言依賴的模型內容,推理時的模型容量,要小於訓練時候的模型容量,這是因為在推理的時候,只有貢獻的引數和對應於特定語言的引數被啟用。為了簡化本文的討論,我們關注在訓練時的模型容量,並且混用模型大小和容量。縮放模型大小,也會帶來很多實際問題,比如模型的並行化支援。
本文的實驗,是在來自9種語系的15種語言上進行的實驗。總計235.4百萬條語音,語音時長共計364.9千小時,這些資料採集自谷歌的聲學搜尋引擎,資料是完全匿名的,並且由標註人員標註成文字。本文使用的資料是之前論文使用的資料的20倍。據我們所知,這也是第一篇在這麼大規模的資料集上做多語言實驗的論文。與之前多語言的工作不同,我們關注在不同高資源語言間的干擾問題。在我們的設定裡,我們最小的語言有大約7.7千小時的訓練資料,大約是之前工作裡最大的語言資源的7倍。這個規模的資料集又給訓練效率帶來了挑戰。我們的每種語言的測試集,包含大約3到19k的語音,這些語音是從谷歌語音搜尋引擎裡面的取樣出來的,並且和訓練集沒有重合。同樣地,測試集也是完全匿名和手工轉寫的。
我們在訓練的時候使用了80維的log mel特徵,每幀的視窗大小為32ms,每兩個視窗間有10ms的重疊。將連續3幀的特徵堆疊起來,並做一個下采樣,我們能獲得240維的輸入特徵,這個特徵的取樣率為30ms。一個16維的one-hot語言向量,被送入到encoder中作為額外的輸入,SpecAugment資料增強也被用來增強模型的魯棒性。整個模型利用512個TPU核進行訓練,除了10B(100億)引數的模型,用了1024個TPU進行訓練,這主要是由於每核16G的頻寬限制。模型使用同步隨機梯度下降進行最佳化。對於LSTM作decoder的模型,我們取樣Adam最佳化器做最佳化,對於Transformer,我們取樣Adafactor做最佳化器。transformer學習率最佳化策略也被使用,其中最大學習率為3e-4,warmup的步數為10k。
在這一節,我們展示我們在大規模資料集上建立高質量的多語言模型的研究結果,為了簡單,我們只用平均WER作對比,並且只彙報每種語言的效能。
我們使用Conformer作為encoder和LSTM作為decoder,來構建單語的baseline模型,encoder包含17層conformer block,每個conformer層的模型維度為512,有8個head的attention,conformer內部卷積模組中,卷積核的大小為15。decoder是LSTM,包含2層640維的LSTM,隱藏單元的大小為2048。每個單語模型的大小為140M,並被用來預測跟該語言相關的token。平均的WER為9.29%。每種語言的效能如下圖所示,其中英語(US)的WER最低,為4.6%,Marathi(IN)的WER最高為20.2%。擁有更多訓練資料的語言,往往有更低的WER。
為了證明conformer作為多語言建模的encoder的有效性,我們對比了三種不同encoder,他們都以LSTM作為decoder。1. LSTM作為encoder,包含8層LSTM,每層有2048個隱藏單元,和640維的輸出單元。2. ContextNet作為encoder,包含24層contextnet,每層有640維的隱藏單元,通道大小為2。3. Conformer作為encoder,包含17層conformer,每層有512維的隱藏層,這個設定和單語的模型一致。語言適應層(Language Adapter)在每個encoder層之間都被插入。這三種不同encoder結構的選擇,是為了使得模型引數的總數盡肯能保持一致,都大約為220M。相比單語模型,多語模型的大小的增加主要來自於額外的語言適應層(Language Adapter)和輸出詞表的大小的增加。這三個模型的平均WER為11.86%,10.77%,和9.43%。這個結果充分展示了conformer作為多語ASR的encoder的效果。對比單語模型,儘管在質量上還不如單語模型,但是它在同時識別15種語言上,表現得很好。它在大概21個epoch時收斂,訓練了大概120萬step,而單語模型通常要訓練到50個epoch。為了理解語言適應層的效果,我們做了下面的消融實驗,為了快速進行實驗,我們對比了模型在200k step時候的效果,大約此時是在第3.5個epoch。使用語言適應層,會帶來語言依賴的引數,和一些模型大小上的增加。為了幫我們更好理解,我們訓練了一個單獨的適應模型,能使得所有模型共享相同的adapter transformation。因此,我們的模型能夠大小能夠擺脫adapter模型。在200k step時,這個模型獲得了10.86%的平均WER,相對剛剛的baseline(帶語言適應層),獲得了10.38%的平均錯誤率。從這個對比,可以看到,在模型中加入語言適應層很重要。
除了用一個共享decoder,多頭模型(用不同的decoder針對不同的語系)能夠被用來增加模型容量,和之前的工作相同,我們為每種語系使用不同的decoder。總共5種語系會被使用,包括Germanic, Italic,Arabic,Indo-Iranan和其他語言。為了對比,我們確保單個decoder和多個decoder模型有相同的引數量:1. 單decoder模型有6層768維的LSTM,每層有3074維的隱藏單元。2. 多decoder,有5個decoder,每個decoder有2層640維的LSTM,每層有2048維的隱藏層單元。這兩種模型都有354M的引數。在200k的step時,單個decoder的平均WER為10.13%,多個decoder的平均WER為10.28%,這建議我們在相同的模型大小下,我們用單個decoder,相比多個decoder要好。
為了提高我們多語模型的效果,我們進一步把模型引數從354M增加到500M,透過把模型的寬度從512維,增大到640維。把寬度從17層,增大到22層。這個增大後的模型,在200k step時能夠獲得9.63%的WER,並在1.1M step時,獲得了9.13%的WER,能超過單語模型。然而,相比基本的220M的模型,它的訓練速度慢了1/3,這是由於RNN的錯誤反向傳播帶來的。這個特性也使得用LSTM做decoder不適合進一步的模型擴增。相比LSTM,基於transformer的decoder模型,在訓練時有更高的並行化能力。在相同的encoder架構下,我們建立了一個Transformer decoder模型,引數大約500M,有12層transformer,768維的模型維度,3072維的隱藏層維度,和8個attention head。它的平均WER是9.26%,比LSTM的WER要高一些,但是它的訓練速度和220M baseline模型接近。因此,我們在後面的研究中,都用Transformer作為decoder。
在下面的實驗中,我們想進一步增大Conformer作為encoder和Transformer作為decoder的模型的容量大小,實驗結果如下表所示,L表示模型的層數,W表示模型的維度,loss是訓練樣本負log混淆,越低越好。speed是每秒訓練的樣本數。B0是baseline模型,“-”表示和B0沒有區別。所有的E模型的引數量大小都為1B。
對比E1和E2,E5和E6,我們可以看到越深的模型取得了相比越寬的模型更好的效果。然而,越深的模型需要更長的時間去訓練(2352 vs 3419)。對比E1-E4和E5-E7,增大encoder的容量,相比增大decoder的容量,能獲得更好的結果。然而, 更大的decoder往往有更好的training loss。E4,這個模型平均把模型容量分給寬度和深度,在這個task上表現得並不好,相較而言,E3把更多地模型容量分給寬度,要表現得更好一些。最後,E8模型,首先把模型容量,平均分給encoder和decoder,然後把更多的容量分給depth,和E3的效能差不多。E3模型最終在600k step時收斂,大約10個epoch。最終獲得了大約9.07%的平均WER。
在這個工作中,我們研究瞭如何構建一個多語言端到端ASR系統,我們透過增大模型容量來解決這個問題。隨著模型的增大,我們觀察到模型的效果不斷增加,我們也能建立一個單獨的多語言識別的ASR系統,這個系統能在高資源的語言上超過不同的單語模型。
想了解更多的AI技術乾貨,歡迎上華為雲的AI專區,目前有AI程式設計Python等
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2795935/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我不懂 Swift 語言Swift
- 什麼是Go語言?Go語言有什麼特點?Go
- 學Java語言容易嗎,都要學些什麼,沒有基礎也可以學嗎Java
- 為什麼會有這麼多程式語言
- python語言與其他語言有什麼不同?Python
- 為什麼會有這麼多的程式語言?
- 為什麼中國人沒有自己的程式語言?
- 為什麼我們需要一門新語言——Go語言Go
- 為什麼 Go 語言沒有三元運算子Go
- Java語言有什麼特點Java
- “Go語言”有什麼用途?有什麼優勢?Go
- 為什麼那麼多人要學習go語言?go語言有什麼特點?Go
- 中文程式語言——易語言,到底是用來幹什麼的?易語言值得學習嗎?易語言的優勢有什麼?
- Python語言與其他語言有什麼不同?優勢介紹Python
- go與其他語言有什麼區別?學習go語言怎麼樣Go
- 為什麼《七週七語言》選中的是這幾種語言?
- win10 1909沒有語言怎麼辦_win10沒有語言包如何新增Win10
- 我為什麼反對語言之爭?我的語言歷險
- 為什麼我喜歡 Lisp 程式語言Lisp
- 我們為什麼要使用GO語言?Go
- 有一種介面,叫語言
- 現代程式語言用什麼語言寫成?
- 組合語言1 - 什麼是組合語言?組合語言
- Python是什麼語言?Python底層語言是什麼?Python
- 自制程式語言有什麼好處?
- FAIR & NYU開發XNLI語料庫:15種語言(含低資源語言)AI
- 我眼中的各種程式語言
- 什麼是r語言R語言
- go語言能做什麼Go
- 什麼是程式語言
- java語言屬於哪種語言Java
- 線上語言編輯器(js,css,html等多種語言支援)JSCSSHTML
- Python是什麼語言?有什麼優劣勢?Python
- 常見的程式語言python怎麼樣?各程式語言有什麼區別?Python
- 何為程式語言?為什麼要學C語言?C語言
- ot 多語言怎麼配置?
- Python和C語言有什麼區別?PythonC語言
- 【轉載】C 語言有什麼奇技淫巧