微調(diào)用于多語言 ASR 的 MMS 適配器模型

新內(nèi)容 (06/2023): 這篇博文受到 “在多語言 ASR 上微調(diào) XLS-R” 的強烈啟發(fā),可以看作是它的改進版本。
WAV2Vec2 是自動語音識別 (ASR) 的預訓練模型,由 Alexei Baevski、Michael Auli 和 Alex Conneau 于 2020 年 9 月 發(fā)布。其在最流行的 ASR 英語數(shù)據(jù)集之一 LibriSpeech 上展示了 WAV2Vec2 的強大性能后不久, Facebook AI 就推出了 WAV2Vec2 的兩個多語言版本,稱為 XLSR 和 XLM-R,能夠識別多達 128 種語言的語音。XLSR 代表 跨語言語音表示 ,指的是模型學習跨多種語言有用的語音表示的能力。
Meta AI 的最新版本,大規(guī)模多語言語音 (MMS),由 Vineel Pratap、Andros Tjandra、Bowen Shi 等人編寫。將多語言語音表示提升到一個新的水平。通過發(fā)布的各種 語言識別、語音識別和文本轉語音檢查點,可以識別、轉錄和生成超過 1,100 多種口語。
在這篇博文中,我們展示了 MMS 的適配器訓練如何在短短 10-20 分鐘的微調(diào)后實現(xiàn)驚人的低單詞錯誤率。
對于資源匱乏的語言,我們 強烈 建議使用 MMS 的適配器訓練,而不是像 “在多語言 ASR 上微調(diào) XLS-R” 中那樣微調(diào)整個模型。
在我們的實驗中,MMS 的適配器訓練不僅內(nèi)存效率更高、更穩(wěn)健,而且對于低資源語言也能產(chǎn)生更好的性能。對于中到高資源語言,微調(diào)整個檢查點而不是使用適配器層仍然是有利的。
保護世界語言多樣性
根據(jù) https://www.ethnologue.com/ 的數(shù)據(jù),大約 3000 種語言 (即所有“現(xiàn)存”語言的 40%) 由于母語人士越來越少而瀕臨滅絕。這種趨勢只會在日益全球化的世界中持續(xù)下去。
MMS 能夠轉錄許多瀕臨滅絕的語言,例如 Ari 或 Kaivi 。未來,MMS 可以通過幫助剩余的使用者創(chuàng)建書面記錄并用母語進行交流,這在保持語言活力方面發(fā)揮至關重要的作用。
為了適應 1000 多個不同的詞匯表,MMS 使用適配器 (Adapters) - 一種僅訓練一小部分模型權重的訓練方法。
適配器層就像語言橋梁一樣,使模型能夠在解讀另一種語言時利用一種語言的知識。
微調(diào) MMS
MMS 無監(jiān)督檢查點使用 1,400 多種語言的超過 50 萬 小時的音頻進行了預訓練,參數(shù)范圍從 3 億到 10 億不等。
你可以在 ?? Hub 上找到 3 億個參數(shù) (300M) 和 10 億個參數(shù) (1B) 模型大小的僅預訓練檢查點:
mms-300m
mms-1b
注意 : 如果你想微調(diào)基本模型,可以按照 “在多語言 ASR 上微調(diào) XLS-R” 中所示的完全相同的方式進行操作。
與 BERT 的掩碼語言建模目標 類似,MMS 通過隨機遮蔽特征向量來學習上下文語音表示,然后在自監(jiān)督預訓練期間將其傳遞到 Transformer 網(wǎng)絡。
對于 ASR,預訓練 MMS-1B 檢查點 通過聯(lián)合詞匯輸出層以監(jiān)督方式對 1000 多種語言進行了進一步微調(diào)。最后一步,聯(lián)合詞匯輸出層被丟棄,并保留特定于語言的適配器層。每個適配器層 僅 包含約 2.5M 權重,由每個注意力塊的小型線性投影層以及特定于語言的詞匯輸出層組成。
已發(fā)布針對語音識別 (ASR) 進行微調(diào)的三個 MMS 檢查點。它們分別包括 102、1107 和 1162 個適配器權重 (每種語言一個):
mms-1b-fl102
mms-1b-l1107
mms-1b-all
你可以看到基本模型 (像往常一樣) 保存為文件 model.safetensors
,但此外這些存儲庫還存儲了許多適配器權重, 例如 針對法國的 adapter.fra.safetensors
。
Hugging Face 文檔很好地 解釋了如何使用此類檢查點進行推理,因此在這篇博文中,我們將重點學習如何基于任何已發(fā)布的 ASR 檢查點有效地訓練高性能適配器模型。
訓練自適應權重
在機器學習中,適配器是一種用于微調(diào)預訓練模型同時保持原始模型參數(shù)不變的方法。他們通過在模型的現(xiàn)有層之間插入小型可訓練模塊 (稱為 適配器層) 來實現(xiàn)此目的,然后使模型適應特定任務,而無需進行大量的重新訓練。
適配器在語音識別,尤其是 說話人識別 方面有著悠久的歷史。在說話人識別中,適配器已被有效地用于調(diào)整預先存在的模型,以識別單個說話人的特質,正如 Gales 和 Woodland (1996) 以及 Miao 等人 (2014) 的工作中所強調(diào)的那樣。與訓練完整模型相比,這種方法不僅大大降低了計算要求,而且使得特定于說話者的調(diào)整更好、更靈活。
MMS 中完成的工作利用了跨不同語言的語音識別適配器的想法。對少量適配器權重進行了微調(diào),以掌握每種目標語言獨特的語音和語法特征。因此,MMS 使單個大型基礎模型 (例如 mms-1b-all 模型檢查點) 和 1000 多個小型適配器層 (每個 2.5M 權重 mms-1b-all) 能夠理解和轉錄多種語言。這極大地減少了為每種語言開發(fā)不同模型的計算需求。
棒極了!現(xiàn)在我們了解其動機和理論,下面讓我們研究一下 mms-1b-all ??的適配器權重微調(diào)
Notebook 設置
正如之前在 “多語言 ASR 上微調(diào) XLS-R” 博客文章中所做的那樣,我們在 Common Voice 的低資源 ASR 數(shù)據(jù)集上微調(diào)模型,該數(shù)據(jù)集僅包含 ca. 4 小時經(jīng)過驗證的訓練數(shù)據(jù)。
就像 WAV2Vec2 或 XLS-R 一樣,MMS 使用連接時序分類 (CTC) 進行微調(diào),CTC 是一種用于訓練神經(jīng)網(wǎng)絡解決序列到序列問題 (例如 ASR 和手寫識別) 的算法。
有關 CTC 算法的更多詳細信息,我強烈建議閱讀 Awni Hannun 的寫得很好的一篇博客文章 Sequence Modeling with CTC (2017)。
在我們開始之前,讓我們安裝 datasets
和 transformers
。此外,我們需要 torchaudio
來加載音頻文件,以及使用 字錯誤率 (WER) 指標 ( {}^1 ) 評估我們微調(diào)后的模型,因此也需要安裝 jiwer
。
我們強烈建議你在訓練時將訓練檢查點直接上傳到 ?? Hub。Hub 存儲庫內(nèi)置了版本控制,因此你可以確保在訓練期間不會丟失任何模型檢查點。
為此,你必須存儲來自 Hugging Face 網(wǎng)站的身份驗證令牌 (如果你還沒有注冊,請在 此處 注冊!)
準備數(shù)據(jù)、分詞器、特征提取器
ASR 模型將語音轉錄為文本,這意味著我們需要一個將語音信號處理為模型輸入格式 (例如特征向量) 的特征提取器,以及一個將模型輸出格式處理為文本的分詞器。
在?? Transformers 中,MMS 模型同時伴隨著一個名為 WAV2Vec2FeatureExtractor 的特征提取器和一個名為 WAV2Vec2CTCTokenizer 的分詞器。
我們首先創(chuàng)建標記生成器,將預測的輸出類解碼為輸出轉錄。
創(chuàng)建 WAV2Vec2CTCTokenizer
微調(diào)的 MMS 模型,例如 mms-1b-all 已經(jīng)有一個伴隨模型檢查點的 分詞器。然而,由于我們想要在某種語言的特定低資源數(shù)據(jù)上微調(diào)模型,因此建議完全刪除分詞器和詞匯輸出層,并根據(jù)訓練數(shù)據(jù)本身創(chuàng)建新的。
在 CTC 上微調(diào)的類似 WAV2Vec2 的模型通過一次前向傳遞來轉錄音頻文件,首先將音頻輸入處理為一系列經(jīng)過處理的上下文表示,然后使用最終的詞匯輸出層將每個上下文表示分類為表示該字符的字符轉錄。
該層的輸出大小對應于詞匯表中的標記數(shù)量,我們將從用于微調(diào)的標記數(shù)據(jù)集中提取該詞匯表。因此,第一步,我們將查看所選的 Common Voice 數(shù)據(jù)集,并根據(jù)轉錄定義詞匯表。
對于本 notebook,我們將使用 Common Voice 的 6.1 土耳其語數(shù)據(jù)集。土耳其語對應于語言代碼 "tr"
。
太好了,現(xiàn)在我們可以使用 ?? Datasets 的簡單 API 來下載數(shù)據(jù)了。數(shù)據(jù)集名稱是 "mozilla-foundation/common_voice_6_1"
,配置名稱對應于語言代碼,在我們的例子中是 "tr"
。
注意: 在下載數(shù)據(jù)集之前,你必須登錄你的 Hugging Face 帳戶,進入 數(shù)據(jù)集存儲庫頁 面并單擊“同意并訪問存儲庫”來訪問它
Common Voice 有許多不同的分割,其中包括 invalidated
,它指的是未被評為“足夠干凈”而被認為有用的數(shù)據(jù)。在此 notebook 中,我們將僅使用拆分的 "train"
, "validation"
和 "test"
。
許多 ASR 數(shù)據(jù)集僅提供每個音頻數(shù)組 ('audio'
) 和文件 ('path'
) 的目標文本 ('sentence'
)。實際上,Common Voice 提供了關于每個音頻文件的更多信息,例如 'accent'
等。為了使 notebook 盡可能通用,我們僅考慮用于微調(diào)的轉錄文本。
讓我們編寫一個簡短的函數(shù)來顯示數(shù)據(jù)集的一些隨機樣本,并運行它幾次以了解轉錄的感覺。
好吧!轉錄看起來相當干凈。翻譯完轉錄的句子后,這種語言似乎更多地對應于書面文本,而不是嘈雜的對話??紤]到 Common Voice 是一個眾包閱讀語音語料庫,這也解釋的通。
我們可以看到,轉錄文本中包含一些特殊字符,如 ,.?!;:
。沒有語言模型,要將語音塊分類為這些特殊字符就更難了,因為它們并不真正對應于一個特征性的聲音單元。例如,字母 "s"
有一個或多或少清晰的聲音,而特殊字符 "."
則沒有。此外,為了理解語音信號的含義,通常不需要在轉錄中包含特殊字符。
讓我們簡單地刪除所有對單詞的含義沒有貢獻并且不能真正用聲音表示的字符,并對文本進行規(guī)范化。
我們再看看處理后的文本標簽。
好!這看起來更好了。我們已經(jīng)從轉錄中刪除了大多數(shù)特殊字符,并將它們規(guī)范化為僅小寫。
在完成預處理之前,咨詢目標語言的母語人士總是有益的,以查看文本是否可以進一步簡化。 對于這篇博客文章,Merve 很友好地快速查看了一下,并指出帶帽子的字符 (如 a
) 在土耳其語中已經(jīng)不再使用,可以用它們的無帽子等效物 (例如 a
) 替換。
這意味著我們應該將像 "yarg? sistemi hala sa?l?ks?z"
這樣的句子替換為 "yarg? sistemi hala sa?l?ks?z"
。
讓我們再寫一個簡短的映射函數(shù)來進一步簡化文本標簽。記住 - 文本標簽越簡單,模型學習預測這些標簽就越容易。
在 CTC 中,將語音塊分類為字母是很常見的,所以我們在這里也做同樣的事情。讓我們提取訓練和測試數(shù)據(jù)中所有不同的字母,并從這組字母中構建我們的詞匯表。
我們編寫一個映射函數(shù),將所有轉錄連接成一個長轉錄,然后將字符串轉換為一組字符。將參數(shù)傳遞 batched=True
給 map(...)
函數(shù)非常重要,以便映射函數(shù)可以立即訪問所有轉錄。
現(xiàn)在,我們創(chuàng)建訓練數(shù)據(jù)集和測試數(shù)據(jù)集中所有不同字母的并集,并將結果列表轉換為枚舉字典。
很酷,我們看到字母表中的所有字母都出現(xiàn)在數(shù)據(jù)集中 (這并不令人驚訝),我們還提取了特殊字符 ""
和 ?'
。請注意,我們沒有排除這些特殊字符,因為模型必須學會預測單詞何時結束,否則預測將始終是一系列字母,這將使得不可能將單詞彼此分開。
人們應該始終記住,在訓練模型之前,預處理是一個非常重要的步驟。例如,我們不希望我們的模型僅僅因為我們忘記規(guī)范化數(shù)據(jù)而區(qū)分 a
和 A
。a
和 A
之間的區(qū)別根本不取決于字母的“聲音”,而更多地取決于語法規(guī)則 - 例如,在句子開頭使用大寫字母。因此,刪除大寫字母和非大寫字母之間的差異是明智的,這樣模型在學習轉錄語音時就更容易了。
為了更清楚地表明 " "
具有自己的標記類別,我們給它一個更明顯的字符 |
。此外,我們還添加了一個“未知”標記,以便模型以后能夠處理 Common Voice 訓練集中未遇到的字符。
最后,我們還添加了一個對應于 CTC 的“空白標記”的填充標記。 “空白標記”是 CTC 算法的核心組成部分。欲了解更多信息,請查看 此處 的“對齊”部分。
很酷,現(xiàn)在我們的詞匯表已經(jīng)完成,包含 37 個標記,這意味著我們將作為適配器權重的一部分添加在預訓練的 MMS 檢查點頂部的線性層將具有 37 的輸出維度。
由于單個 MMS 檢查點可以為多種語言提供定制權重,因此分詞器也可以包含多個詞匯表。因此,我們需要嵌套我們的 vocab_dict
,以便將來可能向詞匯表中添加更多語言。字典應該嵌套使用適配器權重的名稱,并在分詞器配置中以 target_lang
的名稱保存。
讓我們像原始的 mms-1b-all
檢查點一樣使用 ISO-639-3 語言代碼。
讓我們定義一個空字典,我們可以在其中添加剛剛創(chuàng)建的詞匯表
注意: 如果你想使用此 notebook 將新的適配器層添加到 現(xiàn)有模型倉庫 ,請確保 不要 創(chuàng)建一個空的新詞匯表,而是重用已經(jīng)存在的詞匯表。為此,你應該取消注釋以下單元格,并將 "patrickvonplaten/wAV2vec2-large-mms-1b-turkish-colab"
替換為你要添加適配器權重的模型倉庫 ID。
現(xiàn)在讓我們將詞匯表保存為 json 文件。
最后一步,我們使用 json 文件將詞匯表加載到類的實例中 WAV2Vec2CTCTokenizer
。
如果想要在本 notebook 的微調(diào)模型中重用剛剛創(chuàng)建的分詞器,強烈建議將 tokenizer
上傳到 ?? Hub。讓我們將上傳文件的倉庫命名為 "wAV2vec2-large-mms-1b-turkish-colab"
:
并將分詞器上傳到 ?? Hub。
太好了,你可以在下面看到剛剛創(chuàng)建的存儲庫 https://huggingface.co/<your-username>/wAV2vec2-large-mms-1b-tr-colab
創(chuàng)建 WAV2Vec2FeatureExtractor
語音是一個連續(xù)的信號,要被計算機處理,首先必須離散化,這通常被稱為 采樣。采樣率在這里起著重要的作用,它定義了每秒測量語音信號的數(shù)據(jù)點數(shù)。因此,采用更高的采樣率采樣會更好地近似 真實 語音信號,但也需要每秒更多的值。
預訓練檢查點期望其輸入數(shù)據(jù)與其訓練數(shù)據(jù)的分布大致相同。兩個不同采樣率采樣的相同語音信號具有非常不同的分布,例如,將采樣率加倍會導致數(shù)據(jù)點數(shù)量加倍。因此,在微調(diào) ASR 模型的預訓練檢查點之前,必須驗證用于預訓練模型的數(shù)據(jù)的采樣率與用于微調(diào)模型的數(shù)據(jù)集的采樣率是否匹配。 WAV2Vec2FeatureExtractor
對象需要以下參數(shù)才能實例化:
feature_size
: 語音模型以特征向量序列作為輸入。雖然這個序列的長度顯然會變化,但特征大小不應該變化。在 WAV2Vec2 的情況下,特征大小為 1,因為該模型是在原始語音信號上訓練的 ( {}^2 )。sampling_rate
: 模型訓練時使用的采樣率。padding_value
: 對于批量推理,較短的輸入需要用特定值填充do_normalize
: 輸入是否應該進行 零均值單位方差 歸一化。通常,語音模型在歸一化輸入時表現(xiàn)更好return_attention_mask
: 模型是否應該使用attention_mask
進行批量推理。通常情況下,XLS-R 模型檢查點應該 始終 使用attention_mask
太好了,MMS 的特征提取管道已經(jīng)完全定義!
為了提高用戶友好性,特征提取器和分詞器被 封裝 到一個 WAV2Vec2Processor
類中,這樣只需要一個 model
和 ?processor
對象。
接下來,我們可以準備數(shù)據(jù)集。
預處理數(shù)據(jù)
到目前為止,我們還沒有看過語音信號的實際值,只看過轉錄。除了 sentence
,我們的數(shù)據(jù)集還包括另外兩個列名 path
和 ?audio
。 path
表示音頻文件的絕對路徑, audio
表示已經(jīng)加載的音頻數(shù)據(jù)。MMS 期望輸入格式為 16kHz 的一維數(shù)組。這意味著音頻文件必須加載并重新采樣。
值得慶幸的是,當列名為 audio
時, datasets
會自動完成這一操作。讓我們試試。
在上面的示例中,我們可以看到音頻數(shù)據(jù)以 48kHz 的采樣率加載,而模型期望的是 16kHz,正如我們所見。我們可以通過使用 cast_column
將音頻特征設置為正確的采樣率:
我們再來看一下 "audio"
。
這似乎奏效了!讓我們通過打印語音輸入的形狀、轉錄內(nèi)容和相應的采樣率來最后檢查數(shù)據(jù)是否準備正確。
很好!一切看起來都很棒 - 數(shù)據(jù)是一維數(shù)組,采樣率始終對應于 16kHz,并且目標文本已標準化。
最后,我們可以利用 WAV2Vec2Processor
將數(shù)據(jù)處理成 WAV2Vec2ForCTC
訓練所需的格式。為此,讓我們利用 Dataset 的 map(...)
函數(shù)。
首先,我們通過調(diào)用 batch["audio"]
來加載并重新采樣音頻數(shù)據(jù)。
其次,我們從加載的音頻文件中提取 input_values
。在我們的情況下, WAV2Vec2Processor
只規(guī)范化數(shù)據(jù)。然而,對于其他語音模型,這一步可能包括更復雜的特征提取,例如 Log-Mel 特征提取。
第三,我們將轉錄編碼為標簽 id。
注意: 這個映射函數(shù)是一個很好的例子,說明了如何使用 WAV2Vec2Processor
類。在“正?!鼻闆r下,調(diào)用 processor(...)
會重定向到 WAV2Vec2FeatureExtractor
的調(diào)用方法。然而,當將處理器封裝到 as_target_processor
上下文中時,同一個方法會重定向到 WAV2Vec2CTCTokenizer
的調(diào)用方法。 欲了解更多信息,請查看 文檔。
讓我們將數(shù)據(jù)準備功能應用到所有示例中。
注意: datasets
自動處理音頻加載和重新采樣。如果你希望實現(xiàn)自己的定制數(shù)據(jù)加載/采樣,請隨意使用該 "path"
列并忽略該 "audio"
列。
太棒了,現(xiàn)在我們準備開始訓練了!
訓練
數(shù)據(jù)已經(jīng)處理好,我們準備開始設置訓練流程。我們將使用 ?? 的 Trainer,為此我們基本上需要做以下幾件事:
定義一個數(shù)據(jù)整理器。與大多數(shù) NLP 模型不同,MMS 的輸入長度比輸出長度大得多。例如,輸入長度為 50000 的樣本的輸出長度不超過 100。鑒于輸入大小較大,動態(tài)填充訓練批次更為高效,這意味著所有訓練樣本只應填充到其批次中最長的樣本,而不是整體最長的樣本。因此,微調(diào) MMS 需要一個特殊的填充數(shù)據(jù)整理器,我們將在下面定義它
評估指標。在訓練過程中,模型應該根據(jù)字錯誤率進行評估。我們應該相應地定義一個
compute_metrics
函數(shù)加載預訓練檢查點。我們需要加載預訓練檢查點并正確配置它進行訓練。
定義訓練配置。
在微調(diào)模型之后,我們將正確地在測試數(shù)據(jù)上評估它,并驗證它是否確實學會了正確轉錄語音。
設置 Trainer
讓我們從定義數(shù)據(jù)整理器開始。數(shù)據(jù)整理器的代碼是從 這個示例 中復制的。
不詳細講述,與常見的數(shù)據(jù)整理器不同,這個數(shù)據(jù)整理器分別對待 input_values
和 ?labels
,因此對它們應用兩個單獨的填充函數(shù) (再次利用 MMS 處理器的上下文管理器)。這是必要的,因為在語音識別中,輸入和輸出屬于不同的模態(tài),因此它們不應該被相同的填充函數(shù)處理。 與常見的數(shù)據(jù)整理器類似,標簽中的填充標記用 -100
填充,以便在計算損失時 不 考慮這些標記。
接下來,定義評估指標。如前所述,ASR 中的主要指標是單詞錯誤率 (WER),因此我們也將在本 notebook 中使用它。
模型將返回一系列 logit 向量: ( \mathbf{y}_1, \ldots, \mathbf{y}_m ) 其中 ( \mathbf{y} 1 = f{\theta}(x_1, \ldots, x_n)[0] ) 且 ?( n >> m )。
logit 向量 ( \mathbf{y}_1 ) 包含我們前面定義的詞匯表中每個單詞的對數(shù)幾率,因此 ( \text{len}(\mathbf{y}_i) = ) config.vocab_size
。我們對模型最可能的預測感興趣,因此取 logits 的 ?argmax(...)
。此外,我們通過將 -100
替換為 pad_token_id
并解碼 id,同時確保連續(xù)標記 不 以 CTC 風格分組到同一標記 ( {}^1 ),將編碼后的標簽轉換回原始字符串。
現(xiàn)在,我們可以加載預訓練的 mms-1b-all
檢查點。分詞器的 pad_token_id
必須定義模型的 pad_token_id
,或者在 WAV2Vec2ForCTC
的情況下也是 CTC 的 空白標記 ( {}^2 )。
由于我們只訓練一小部分權重,模型不容易過擬合。因此,我們確保禁用所有 dropout 層。
注意: 當使用本筆記本在 Common Voice 的另一種語言上訓練 MMS 時,這些超參數(shù)設置可能不會很好地工作。根據(jù)你的用例,隨意調(diào)整這些設置。
注意: 預計一些權重將被重新初始化。這些權重對應于新初始化的詞匯輸出層。
我們現(xiàn)在希望確保只有適配器權重將被訓練,而模型的其余部分保持凍結。
首先,我們重新初始化所有適配器權重,這可以通過方便的 init_adapter_layers
方法完成。也可以不重新初始化適配器權重并繼續(xù)微調(diào),但在這種情況下,在訓練之前應該通過 load_adapter(...)
方法 加載合適的適配器權重。然而,詞匯表通常仍然不會很好地匹配自定義訓練數(shù)據(jù),因此通常更容易重新初始化所有適配器層,以便它們可以輕松地進行微調(diào)。
接下來,我們凍結 除 適配器層之外的所有權重。
最后一步,我們定義與訓練相關的所有參數(shù)。 對一些參數(shù)進行更多解釋:
group_by_length
通過將輸入長度相似的訓練樣本分組到一個批次中,使訓練更加高效。這可以通過大大減少通過模型傳遞的無用填充標記的總數(shù),從而顯著加快訓練時間learning_rate
被選擇為 1e-3,這是使用 Adam 訓練的常用默認值。其他學習率可能同樣有效。
有關其他參數(shù)的更多解釋,可以查看 文檔。為了節(jié)省 GPU 內(nèi)存,我們啟用 PyTorch 的 梯度檢查點,并將損失減少設置為“ mean ”。MMS 適配器微調(diào)非常快地收斂到非常好的性能,因此即使對于像 4 小時這樣小的數(shù)據(jù)集,我們也只會訓練 4 個周期。在訓練過程中,每 200 個訓練步驟將異步上傳一個檢查點到 hub。它允許你在模型仍在訓練時也可以使用演示小部件玩耍。
注意: 如果不想將模型檢查點上傳到 hub,只需將 push_to_hub=False
即可。
現(xiàn)在,所有實例都可以傳遞給 Trainer,我們準備開始訓練!
( {}^1 ) 為了使模型獨立于說話人速率,在 CTC 中,相同的連續(xù)標記簡單地分組為單個標記。然而,在解碼時不應該對編碼的標簽進行分組,因為它們不對應于模型的預測標記,這就是為什么必須傳遞 group_tokens=False
參數(shù)。如果我們不傳遞這個參數(shù),像 "hello"
這樣的單詞會被錯誤地編碼,并解碼為 "helo"
。
( {}^2 ) 空白標記允許模型通過強制在兩個 l 之間插入空白標記來預測一個詞,例如 "hello"
。我們模型的 CTC 符合預測 "hello"
將是 [PAD] [PAD]"h" "e" "e" "l" "l" [PAD]"l" "o" "o" [PAD]
。
訓練
訓練時間應該少于 30 分鐘,具體取決于所使用的 GPU。
trainer.train()
訓練損失訓練步數(shù)驗證損失Wer4.9051000.2150.2800.2902000.1670.2320.26593000.1610.2290.23984000.1560.223
訓練損失和驗證 WER 都很好地下降。
我們看到,僅微調(diào) mms-1b-all
的適配器層 100 步就大大超過了 這里 顯示的微調(diào)整個 xls-r-300m
檢查點。
從 官方論文 和這個快速比較中可以清楚地看出, mms-1b-all
具有更高的將知識轉移到低資源語言的能力,應該優(yōu)先于 xls-r-300m
。此外,訓練也更節(jié)省內(nèi)存,因為只訓練了一小部分層。
適配器權重將作為模型檢查點的一部分上傳,但我們也希望確保單獨保存它們,以便它們可以輕松地上下線。
讓我們將所有適配器層保存到訓練輸出目錄中,以便它能夠正確上傳到 Hub。
最后,你可以將訓練結果上傳到?? Hub。
適配器權重訓練的主要優(yōu)點之一是“基礎”模型 (約占模型權重的 99%) 保持不變,只需共享一個小的 2.5M 適配器檢查點 即可使用訓練好的檢查點。
這使得訓練額外的適配器層并將它們添加到你的倉庫變得非常簡單。
你可以通過簡單地重新運行此腳本并將你想要訓練的語言更改為另一種語言來輕松實現(xiàn),例如 swe
表示瑞典語。此外,你應該確保詞匯表不會被完全覆蓋,而是新語言詞匯表應該像上面注釋掉的單元格中所述那樣 附加 到現(xiàn)有詞匯表中。
為了演示如何加載不同的適配器層,我還訓練并上傳了一個瑞典語適配器層,其 iso 語言代碼為 swe
,如 此處 所示
你可以像往常一樣使用 from_pretrained(...)
加載微調(diào)后的檢查點,但應確保在方法中添加 target_lang="<your-lang-code>"
,以便加載正確的適配器。你還應該為分詞器正確設置目標語言。
讓我們看看如何首先加載土耳其檢查點。
讓我們檢查模型是否可以正確轉錄土耳其語
讓我們處理音頻,運行前向傳遞并預測 ids
最后,我們可以解碼該示例。
輸出:
這看起來幾乎完全正確,只是第一個單詞中應該添加兩個空格。 現(xiàn)在,通過調(diào)用 model.load_adapter(...)
并將分詞器更改為瑞典語,可以非常簡單地將適配器更改為瑞典語。
我們再次從普通語音加載瑞典語測試集
并轉錄一個樣本:
輸出:
太好了,這看起來像是一個完美的轉錄!
我們在這篇博客文章中展示了 MMS 適配器權重微調(diào)不僅在低資源語言上提供了最先進的性能,而且還顯著縮短了訓練時間,并允許輕松構建定制的適配器權重集合。
相關帖子和附加鏈接列在這里:
官方論文
原始 cobebase
官方演示
Transformers 文檔
相關 XLS-R 博客文章
Hub 上的模型
英文鏈接: https://hf.co/blog/mms_adapters
作者: Patrick von Platen
譯者: innovation64
審校/排版: zhongdongy (阿東)