
Transformers 中的 Wav2Vec2-BERT從 Seamless 到開源語音理解的 Conformer 骨干模型【免費(fèi)下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tra/transformers導(dǎo)讀Wav2Vec2-BERT 是 Meta AI Seamless 語音翻譯系統(tǒng)SeamlessM4T v2 / Seamless 系列所使用的大規(guī)模多語言語音預(yù)訓(xùn)練骨干模型于 2024 年 1 月正式合入 Hugging Face Transformers。它繼承 Wav2Vec2-Conformer 的架構(gòu)基因改用mel 頻譜輸入 因果深度可分離卷積并可靈活切換四種位置編碼方式配合基于 Conformer 的適配器網(wǎng)絡(luò)實(shí)現(xiàn)序列壓縮。本文以 docs/source/en/model_doc/wav2vec2-bert.md 為主干結(jié)合當(dāng)前倉庫中 configuration_wav2vec2_bert.py、modeling_wav2vec2_bert.py 與 processing_wav2vec2_bert.py 的源碼實(shí)現(xiàn)講清它的由來、架構(gòu)要點(diǎn)、全部可配置項(xiàng)以及如何用 CTC、分類、幀級(jí)分類、說話人嵌入等任務(wù)頭做微調(diào)與推理。一、模型定位與來龍去脈Wav2Vec2-BERT 出自論文 Seamless: Multilingual Expressive and Streaming Speech Translation即 SeamlessM4T v2 / Seamless 論文由 Meta AI 的 Seamless Communication 團(tuán)隊(duì)提出。依據(jù)官方模型文檔論文與模型發(fā)布于 2023-12-082024-01-18 合入 Transformers由社區(qū)貢獻(xiàn)者ylacombe提交原始代碼位于 Facebook 的seamless_communication倉庫該模型在超過 143 種語言、約 450 萬小時(shí)的無標(biāo)注音頻上完成預(yù)訓(xùn)練預(yù)訓(xùn)練模型本身不直接可用必須針對(duì)下游任務(wù)如自動(dòng)語音識(shí)別 ASR、音頻分類進(jìn)行微調(diào)論文中的官方實(shí)驗(yàn)結(jié)果見原文 Section 3.2.1。在 Seamless 的整體設(shè)計(jì)里Wav2Vec2-BERT 扮演的是語音編碼器/骨干的角色Seamless 論文提出的 SeamlessExpressive、SeamlessStreaming 等端到端語音翻譯系統(tǒng)都建立在統(tǒng)一的多語言語音理解能力之上而 Wav2Vec2-BERT 正是把這種海量多語言、可流式處理的語音表示能力沉淀為獨(dú)立可復(fù)用模型的關(guān)鍵成果。需要說明Wav2Vec2-BERT 在本倉庫中承載的是模型定義層——即預(yù)訓(xùn)練骨干 各任務(wù)頭CTC 等的 PyTorch 實(shí)現(xiàn)、配置與處理器其姊妹模型如 SeamlessM4T v2、SeamlessStreaming 等則以更完整含解碼器的形態(tài)存在于seamless_m4t_v2等模型目錄中。二、架構(gòu)三要點(diǎn)與 Wav2Vec2-Conformer 的差異官方文檔給出的 Usage tips 可歸納為三個(gè)核心架構(gòu)要點(diǎn)逐一與源碼對(duì)應(yīng)1. 輸入從原始波形換成 mel 頻譜與 Wav2Vec2-Conformer 直接吃原始波形不同Wav2Vec2-BERT 的輸入是音頻經(jīng) SeamlessM4T 特征抽取后的mel 頻譜表示。體現(xiàn)在源碼上Wav2Vec2BertConfig 中feature_projection_input_dim: int 160feature_projection_input_dim默認(rèn) 160正是 mel 頻帶數(shù)/特征維度即經(jīng)過SeamlessM4TFeatureExtractor或Wav2Vec2BertProcessor處理后的特征維度。隨后 Wav2Vec2BertFeatureProjection 依次執(zhí)行 LayerNormepslayer_norm_eps、線性投影到hidden_size、feat_proj_dropout將輸入映射進(jìn)模型空間。Wav2Vec2BertPreTrainedModel將main_input_name設(shè)為input_features、input_modalities設(shè)為audio見 modeling_wav2vec2_bert.py直接使用原始波形喂入會(huì)得到錯(cuò)誤輸入形狀。2. 因果深度可分離卷積Conformer 塊內(nèi)部的標(biāo)準(zhǔn)卷積在這里被替換為因果 depthwise深度可分離1D 卷積。核心實(shí)現(xiàn)在 Wav2Vec2BertConvolutionModule先做一層 LayerNorm再經(jīng) Pointwise Conv1D 將通道數(shù)翻倍并通過nn.GLU門控關(guān)鍵一行是torch.nn.functional.pad(hidden_states, (self.depthwise_conv.kernel_size[0] - 1, 0))——僅在序列左側(cè)補(bǔ)零使 depthwise 卷積嚴(yán)格只看到當(dāng)前位置及之前的信息保證因果性從而支持流式streaming解碼這是 SeamlessStreaming 低延遲翻譯的重要基礎(chǔ)之后再做 depthwise LayerNorm、激活、第二個(gè) Pointwise Conv 和conformer_conv_dropout卷積核大小由conv_depthwise_kernel_size默認(rèn) 31控制源碼要求該值必須為奇數(shù)以保證 SAME padding。若傳入 attention mask卷積前會(huì)把 padding 位置的隱藏狀態(tài)masked_fill清零防止 padding 泄漏進(jìn)因果卷積見 modeling_wav2vec2_bert.py。3. 編碼器層 標(biāo)準(zhǔn) Conformer block整體編碼器層Wav2Vec2BertEncoderLayer就是經(jīng)典的 Conformer block 順序Feed-Forward 1hidden_states * 0.5 residualMulti-Head Self-Attention 殘差Conformer 卷積模塊 殘差Feed-Forward 2 殘差最終 LayerNorm。默認(rèn)配置hidden_size1024、24 層、16 頭、intermediate_size4096激活函數(shù)默認(rèn)swish。三、位置編碼四種可選模式Wav2Vec2-BERT 不再綁定單一位置編碼方案而是通過config.position_embeddings_type動(dòng)態(tài)選擇見 configuration_wav2vec2_bert.pyposition_embeddings_type含義相關(guān)源碼模塊None不施加相對(duì)位置編碼——relativeTransformer-XL 風(fēng)格論文 1901.02860相對(duì)位置編碼含可學(xué)習(xí)的pos_bias_u/pos_bias_v與移位shift/skew技巧_apply_relative_position_encodingrelative_key默認(rèn)Shaw 風(fēng)格論文 1803.02155基于距離表查找的 Embedding_apply_relative_key_position_encodingrotaryRoPE 旋轉(zhuǎn)位置編碼論文 2104.09864Wav2Vec2BertRotaryPositionalEmbedding源碼為每種模式都配了獨(dú)立實(shí)現(xiàn)與專屬超參參見 modeling_wav2vec2_bert.pyrelativeTransformer-XL 式需要max_source_positions默認(rèn) 5000表示最大源輸入位置數(shù)。實(shí)現(xiàn)中同時(shí)緩存正/負(fù)兩個(gè)方向的三角函數(shù)位置編碼通過拼接后切片的方式在 O(1) 內(nèi)完成相對(duì)位置的 shiftingrelative_keyShaw 式需要left_max_position_embeddings默認(rèn) 64與right_max_position_embeddings默認(rèn) 8即相對(duì)距離的左/右裁剪邊界。注意力分?jǐn)?shù)計(jì)算對(duì) query 與距離表做 einsum 得到位置偏置rotaryRoPE需要rotary_embedding_base默認(rèn) 10000位置編碼在每層 attention 的 Q/K 上直接旋轉(zhuǎn)疊加且?guī)Ь彺嬉约铀匍L(zhǎng)序列重復(fù)計(jì)算。官方 checkpointfacebook/w2v-bert-2.0默認(rèn)使用relative_key因此在加載原始 Seamless 權(quán)重后推理時(shí)不需要額外的絕對(duì)位置表便于處理超出訓(xùn)練長(zhǎng)度的輸入。四、基于 Conformer 的適配器網(wǎng)絡(luò)Wav2Vec2-BERT 還引入了一個(gè)Conformer 結(jié)構(gòu)適配器網(wǎng)絡(luò)區(qū)別于 Wav2Vec2 系傳統(tǒng)簡(jiǎn)單卷積適配器用于在下游任務(wù)中通過卷積池化壓縮時(shí)間軸可顯著降低 SpeechEncoderDecoder編碼器-解碼器類模型的序列長(zhǎng)度。相關(guān)配置項(xiàng)包括配置項(xiàng)默認(rèn)值作用add_adapterFalse是否在編碼器之上疊加適配器網(wǎng)絡(luò)adapter_kernel_size3適配器內(nèi)卷積核大小adapter_stride2適配器卷積步長(zhǎng)決定壓縮比例num_adapter_layers1適配器層數(shù)adapter_actrelu適配器 FFN 激活函數(shù)支持gelu、relu、selu、swish、gelu_newuse_intermediate_ffn_before_adapterFalse是否在適配器之前疊加一個(gè)中間 FFN 塊output_hidden_sizeNone缺省等于hidden_size適配器輸出維度可先降維再壓縮從源碼看modeling_wav2vec2_bert.py每層Wav2Vec2BertAdapterLayer由三條帶 GLU 步長(zhǎng)卷積的下采樣支路殘差卷積、self-attention 前的卷積、殘差加一個(gè)不含位置編碼的 self-attentionis_adapter_attentionTrue注意position_embeddings_type被置為None以及 FFN 組成前向時(shí)依據(jù)layerdrop概率隨機(jī)丟棄層并用_compute_new_attention_mask依據(jù)下采樣后的序列長(zhǎng)度重新生成注意力掩碼保證 mask 與壓縮后的序列嚴(yán)格對(duì)齊。config 類還暴露了validate_architecture()與便捷屬性inputs_to_logits_ratio見 configuration_wav2vec2_bert.py前者在strict裝飾下校驗(yàn)use_intermediate_ffn_before_adapterTrue時(shí)必須同時(shí)開啟add_adapter否則直接拋ValueError后者在feature_projection_input_dim * 2的基礎(chǔ)上再乘上adapter_stride**num_adapter_layers用于估算輸入特征到輸出 logits 的下采樣比。主模型 Wav2Vec2BertModel 的forward順序?yàn)閒eature projection →若 mask 概率 0 實(shí)例化并應(yīng)用masked_spec_embed→ encoder →可選use_intermediate_ffn_before_adapter的半殘差 FFN →可選adapter返回包含last_hidden_state與extract_features的輸出。五、SpecAugment 掩碼與 CTC 訓(xùn)練相關(guān)配置用于預(yù)訓(xùn)練/微調(diào)的自監(jiān)督或監(jiān)督訓(xùn)練參數(shù)同樣集中在 config 中可參考源碼中_mask_hidden_statesmodeling_wav2vec2_bert.py與_compute_mask_indicesmodeling_wav2vec2_bert.py的實(shí)現(xiàn)配置項(xiàng)默認(rèn)值含義apply_spec_augmentTrue是否對(duì)特征編碼器輸出施加 SpecAugment 數(shù)據(jù)增強(qiáng)mask_time_prob0.05沿時(shí)間軸被掩碼的特征向量比例0~1實(shí)際掩碼數(shù) mask_time_prob*len(time_axis)/mask_time_length由于重疊實(shí)際比例可能略低mask_time_length10時(shí)間軸掩碼 span 長(zhǎng)度mask_time_min_masks2每個(gè)時(shí)間步最少生成的時(shí)間軸掩碼數(shù)當(dāng)理論掩碼數(shù)不足時(shí)兜底mask_feature_prob0.0沿特征軸被掩碼的比例mask_feature_length10特征軸掩碼 span 長(zhǎng)度mask_feature_min_masks0特征軸最少掩碼數(shù)ctc_loss_reductionsumCTC 損失的 reduction 方式ctc_zero_infinityFalse是否將torch.nn.CTCLoss的無窮大 loss 及其梯度置零輸入過短無法對(duì)齊目標(biāo)時(shí)容易出現(xiàn)掩碼實(shí)現(xiàn)細(xì)節(jié)值得注意_compute_mask_indices對(duì)每個(gè)樣本按其真實(shí)長(zhǎng)度來自attention_mask分別計(jì)算掩碼 span 數(shù)量采用概率取整隨機(jī) epsilon最終把掩碼 span 展開回(batch, seq_len)的 bool 矩陣。mask_time_min_masks的作用正是在輸入很短時(shí)確保仍生成最少數(shù)量個(gè)掩碼。只有當(dāng)apply_spec_augmentTrue時(shí)上述參數(shù)才生效且時(shí)間軸掩碼僅在訓(xùn)練模式下自動(dòng)生成——推理期可傳入預(yù)計(jì)算的mask_time_indices自監(jiān)督對(duì)比學(xué)習(xí)場(chǎng)景來控制掩碼位置。在 Wav2Vec2BertForCTC 的forward中CTC loss 計(jì)算時(shí)會(huì)把注意力掩碼求和得到真實(shí)幀數(shù)再經(jīng)_get_feat_extract_output_lengths若啟用 adapter 則按卷積公式逐層下采樣見 modeling_wav2vec2_bert.py換算為input_lengths以pad_token_id默認(rèn) 0作為 CTC blank由于ctc_loss不支持 fp16代碼會(huì)把 logits 提升為 fp32 后再算損失。六、五類模型類與各自的任務(wù)頭除了裸骨干 Wav2Vec2BertModel支持from_pretrained、forward本倉庫還提供了 4 個(gè)帶任務(wù)頭的派生類全部以 Wav2Vec2-Conformer/Seamless 生態(tài)約定實(shí)現(xiàn)類名適用任務(wù)任務(wù)頭結(jié)構(gòu)要點(diǎn)Wav2Vec2BertForCTCASR 等 CTC 式語音轉(zhuǎn)文字編碼器 final_dropoutDropout 線性lm_head到vocab_size若開啟 adapter線性層輸入維度取output_hidden_size要求 config 必須定義vocab_size否則報(bào)錯(cuò)Wav2Vec2BertForSequenceClassificationSUPERB 式句子分類、關(guān)鍵詞喚醒投影層hidden_size → classifier_proj_size默認(rèn) 768 均值池化 線性分類頭不兼容 adapteradd_adapterTrue直接拋錯(cuò)use_weighted_layer_sumTrue時(shí)對(duì)各層隱狀態(tài)做可學(xué)習(xí)加權(quán)平均Wav2Vec2BertForAudioFrameClassification幀級(jí)分類如聲學(xué)事件/音素幀分類直接在隱狀態(tài)上做逐幀線性分類到num_labels同樣拒絕 adapterWav2Vec2BertForXVector說話人驗(yàn)證/識(shí)別帶統(tǒng)計(jì)池化與TDNN時(shí)延神經(jīng)網(wǎng)絡(luò)塔的 XVector 頭用于提取定長(zhǎng)說話人嵌入其中分類類都提供freeze_base_model()方法modeling_wav2vec2_bert.py可將骨干凍結(jié)、只訓(xùn)練頭部降低微調(diào)顯存需求。池化階段若給了attention_mask會(huì)先經(jīng)_get_feature_vector_attention_mask還原特征幀級(jí)別的 mask再按 mask 做加權(quán)均值池化而不是對(duì) padding 求平均。XVector 頭涉及的 TDNN 超參有tdnn_dim(512, 512, 512, 512, 1500)各層輸出通道tuple 長(zhǎng)度即層數(shù)、tdnn_kernel(5, 3, 3, 1, 1)、tdnn_dilation(1, 2, 3, 1, 1)最終嵌入維度xvector_output_dim512。實(shí)現(xiàn)上 TDNNLayer 內(nèi)部用nn.Linear存參但以前向F.conv1d加速執(zhí)行說話人分類在 AMSoftmaxLoss 中以 AM-Softmaxscale30、margin0.4形式訓(xùn)練同時(shí)伴隨可學(xué)習(xí)的 XVector 線性投影。五類前向輸出均遵循 Transformers 統(tǒng)一約定無labels時(shí)只前向lossNone傳入labels時(shí)自動(dòng)計(jì)算相應(yīng)損失并返回(loss, logits, ...)。七、Wav2Vec2BertProcessor音頻與文本的統(tǒng)一入口由于輸入是 mel 頻譜、標(biāo)簽CTC是文本 token官方文檔將 Wav2Vec2BertProcessor 列為獨(dú)立的可調(diào)用類。它的本質(zhì)是特征抽取器繼承 SeamlessM4TFeatureExtractor 的音頻前處理邏輯 文本 tokenizer的ProcessorMixin組合并暴露以下方法__call__支持只傳audio返回input_features與音頻attention_mask、只傳text返回input_ids或兩者同傳在input_features上附加labels用于直接構(gòu)造 CTC 訓(xùn)練樣本兩者皆空則拋ValueErrorpadinput_features走特征抽取器的 pad 邏輯、labels走 tokenizer 的 pad 邏輯可分開也可同時(shí) pad 并自動(dòng)合并from_pretrained/save_pretrained與其他 processor 一致用于保存/加載preprocessor_config.json與 tokenizer 文件batch_decode/decode把 token id 序列解碼回文本用于 CTC 輸出含批處理的后期處理model_input_names返回特征抽取器輸入名 labels便于 Trainer 等框架自動(dòng)識(shí)別輸入字段。典型用法Wav2Vec2BertProcessor.from_pretrained(facebook/w2v-bert-2.0)然后對(duì)一批 (audio, transcript) 調(diào)用 processor 獲得input_features、attention_mask、labels即可喂給Wav2Vec2BertForCTC。八、開箱即用的 API 示例配置類提供了最簡(jiǎn)初始化范式見 configuration_wav2vec2_bert.py 的 Examplefrom transformers import Wav2Vec2BertConfig, Wav2Vec2BertModel # 以 facebook/wav2vec2-bert-rel-pos-large 風(fēng)格初始化一個(gè)隨機(jī)權(quán)重的配置 configuration Wav2Vec2BertConfig() # 用該配置初始化隨機(jī)權(quán)重模型 model Wav2Vec2BertModel(configuration) # 訪問配置 configuration model.config加載官方預(yù)訓(xùn)練權(quán)重并做 CTC 推理/微調(diào)的最小流程from transformers import Wav2Vec2BertProcessor, Wav2Vec2BertForCTC processor Wav2Vec2BertProcessor.from_pretrained(facebook/w2v-bert-2.0) model Wav2Vec2BertForCTC.from_pretrained(facebook/w2v-bert-2.0) # audio 應(yīng)已按特征抽取器要求采樣processor 內(nèi)部負(fù)責(zé)轉(zhuǎn) mel 頻譜 inputs processor(audio... , text..., sampling_rate16000, return_tensorspt) outputs model(**inputs) # 訓(xùn)練時(shí)可獲得 CTC loss需要特別強(qiáng)調(diào)的是該模型預(yù)訓(xùn)練產(chǎn)物必須經(jīng)過微調(diào)才能用于 ASR、音頻分類等下游任務(wù)官方模型卡/文檔要求直接零樣本做 ASR 不在其設(shè)計(jì)目標(biāo)內(nèi)。另外當(dāng)以 CTC 微調(diào)、且從含relative_key位置編碼的 checkpoint 出發(fā)時(shí)無需額外維護(hù)位置表即可支持流式解碼配合因果卷積。本模型還標(biāo)注支持SDPAScaled Dot-Product AttentionWav2Vec2BertPreTrainedModel中_supports_sdpa True、_supports_flex_attn Truemodeling_wav2vec2_bert.pyattention 通過ALL_ATTENTION_FUNCTIONS分發(fā)到 eager/sdpa/flex 等后端同時(shí)supports_gradient_checkpointing True長(zhǎng)序列訓(xùn)練可開啟梯度檢查點(diǎn)??蚣軐?duì) attention 的 eager 實(shí)現(xiàn)做了特殊保持softmax 不做 fp32 upcast、無 GQA repeat以與原始 Conformer 實(shí)現(xiàn)對(duì)齊。九、工程化周邊轉(zhuǎn)換腳本與可參考示例倉庫還附帶一個(gè)與上游 Seamless 權(quán)重的轉(zhuǎn)換工具 convert_wav2vec2_seamless_checkpoint.py用于把原始 Seamless 的 checkpoint 結(jié)構(gòu)映射成本實(shí)現(xiàn)可加載的格式源碼頂部注釋標(biāo)明該文件由modular_wav2vec2_bert.py經(jīng) modular 管線自動(dòng)生成日常改動(dòng)請(qǐng)?zhí)峤坏?modular_wav2vec2_bert.py。想動(dòng)手微調(diào)可以直接基于本倉庫的官方示例[Wav2Vec2BertForCTC] 可參考 examples/pytorch/speech-recognition 目錄下的示例腳本如 run_speech_recognition_ctc.py更系統(tǒng)的圖文教程可參考官方筆記英文與任意語言兩種微調(diào)路線[Wav2Vec2BertForSequenceClassification] 的用法可參考 examples/pytorch/audio-classification完整任務(wù)指南請(qǐng)閱讀 音頻分類任務(wù)指南。如果你的下游目標(biāo)是純音頻不用文本則只需Wav2Vec2BertProcessor的音頻分支即可生成模型輸入模型側(cè)不強(qiáng)制要求文本編碼。小結(jié)Wav2Vec2-BERT 的核心價(jià)值在于它把 Seamless 大規(guī)模多語言語音預(yù)訓(xùn)練的成果抽象成一個(gè)可獨(dú)立加載、可任意掛接任務(wù)頭、支持四種位置編碼與流式因果卷積的 Transformer 骨干。理解它的關(guān)鍵落點(diǎn)在于——mel 頻譜輸入維度的約定feature_projection_input_dim160、Conformer 編碼器內(nèi)因果 depthwise 卷積的實(shí)現(xiàn)位置、position_embeddings_type四種取值對(duì)應(yīng)的源碼模塊以及add_adapter/use_intermediate_ffn_before_adapter等如何影響序列壓縮與inputs_to_logits_ratio。掌握了這些配置與源碼的對(duì)應(yīng)關(guān)系后無論是把facebook/w2v-bert-2.0遷移到自己的 ASR 或音頻分類任務(wù)還是仿照其結(jié)構(gòu)定制新的語音骨干都能做到有據(jù)可依?!久赓M(fèi)下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tra/transformers創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考