 同聲傳譯實戰:wait-k 英日實時翻譯模型的訓練、決策策略源碼解析與 SimulEval 評測)
unilm (EdgeLM) 同聲傳譯實戰wait-k 英日實時翻譯模型的訓練、決策策略源碼解析與 SimulEval 評測【免費下載鏈接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities項目地址: https://gitcode.com/GitHub_Trending/un/unilm本文基于 EdgeLM 倉庫中的官方示例文檔 enja-waitk.md完整講清如何準備 WMT20 英日數據、訓練一個wait-k (k10)的 transformer 實時simultaneous文本翻譯模型并用 SimulEval 框架評測其質量與延遲。讀完本文你將掌握fairseq-preprocess 數據二值化命令、wait-k 訓練命令的完整參數含義、wait-k 決策策略在源碼中“何時讀、何時寫”的具體實現位置以及 AL / AP / DAL 三個延遲指標的計算方式。wait-k 是什么邊聽邊譯的固定延遲策略同聲傳譯simultaneous translation要求譯員在源語言文本流式到達的過程中就開始產出譯文無法等待整句讀完。wait-k 是其中最直觀的一類策略源側每多讀 k 個單元就產出一個目標單元即用固定 k 的滯后lagging換取確定、可控的延遲。在 EdgeLM 的源碼中wait-k 被注冊為單調注意力策略之一。注冊入口位于 modules/init.py通過registry.setup_registry(--simul-type)建立注冊表并自動導入modules/目錄下的所有策略模塊。wait-k 的具體實現是WaitKAttention定義在 monotonic_multihead_attention.py它繼承自MonotonicInfiniteLookbackAttention無限回看單調注意力意味著目標每個位置只看源側當前位置及之前不允許回退構造函數從訓練參數中讀取args.waitk_lagging并斷言其必須大于 0add_args靜態方法向解析器注冊了必選參數--waitk-laggingtypeint, requiredTrue這正是訓練命令里--waitk-lagging 10的來源。值得注意的一個源碼細節wait-k 模式下“soft”投影直接復用了“monotonic”投影self.q_in_proj[soft] self.q_in_proj[monotonic]。也就是說wait-k 的讀取決策并不依賴學習到的注意力能量值而是由確定性規則生成——學習到的注意力僅用于計算輸出讀/寫時機完全由 k 決定。這與基于能量的hard_aligned、infinite_lookback等可學習策略形成對比后者見 utils/p_choose_strategy.py 中的learnable_p_choose。p_choose 矩陣把 wait-k 規則寫成 0/1 張量決策在代碼里體現為一個二值張量 p_choose為 1 的位置表示“讀取源側下一個單元”為 0 表示“寫目標單元”。核心函數waitk_p_choose位于 utils/p_choose_strategy.py源碼中的注釋給出了直觀示意wait k3, src_len6, max_tgt_len5[0, 0, 1, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 1, 0, 0] [0, 0, 0, 0, 0, 1, 0] [0, 0, 0, 0, 0, 0, 1]每個目標行中唯一為 1 的列逐行后移一步即“每寫一個目標 token推進一個源位置”。實現上用線性化技巧位置 n 的激活下標為n * (src_len 1) k - 1先scatter再 reshape 回(bsz, tgt_len, src_len)。函數還處理了三種邊界情況這些細節決定了它在真實推理流中的正確性max_src_len waitk_lagging源側還沒攢夠 k 個單元直接返回全零只寫不讀左填充場景key_padding_mask[:, 0].any()對激活下標加上 padding 數量做偏移越界 clamp將過大下標限制在min(max_tgt_len, src_len - k 1) * src_len - 1保證源側讀完后 p_choose 自然歸零解碼器進入純“寫”階段。數據準備WMT20 子集 SentencePiece文檔選擇 WMT20 新聞翻譯任務中的 5 個語料子集構造訓練數據共7,815,391 句對News Commentary v16Wiki Titles v3WikiMatrix V1Japanese-English Subtitle CorpusThe Kyoto Free Translation Task Corpus文檔同時給出了一個重要的性能基線在這個數據量上用transformer_vaswani_wmt_en_de_big架構訓練貪心搜索 BLEU 約17.3beam (10) 搜索約19.7使用 WMT 全量訓練數據可以獲得更好結果。開發集采用 WMT20 development data。分詞與過濾規則使用 sentencepiece 工具包分詞詞表大小32000分詞后長度超過200 詞的句子被過濾掉。假設分詞后的文本數據保存在${DATA_DIR}用以下命令生成 fairseq 二進制數據源語言 en、目標語言 ja并行 worker 數為 20fairseq-preprocess \ --source-lang en --target-lang ja \ --trainpref ${DATA_DIR}/train \ --validpref ${DATA_DIR}/dev \ --testpref ${DATA_DIR}/test \ --destdir ${WMT20_ENJA_DATA_BIN} \ --nwordstgt 32000 --nwordssrc 32000 \ --workers 20--nwordssrc/--nwordstgt與文檔前文的 32000 詞表設定一致--destdir產出的目錄即后續訓練與評測命令共用的${WMT20_ENJA_DATA_BIN}——文檔特別強調評測時的--data-bin必須與此目錄相同因為詞典dictionary就保存在該目錄中。訓練 wait-k 模型完整命令與參數解析訓練wait-k (k10)模型的命令如下8 GPU 訓練單機單卡等價做法是追加--update-freq 8fairseq-train ${WMT20_ENJA_DATA_BIN} \ --save-dir ${SAVEDIR} \ --simul-type waitk \ --waitk-lagging 10 \ --max-epoch 70 \ --arch transformer_monotonic_vaswani_wmt_en_de_big \ --optimizer adam \ --adam-betas (0.9, 0.98) \ --lr-scheduler inverse_sqrt \ --warmup-init-lr 1e-07 \ --warmup-updates 4000 \ --lr 0.0005 \ --stop-min-lr 1e-09 \ --clip-norm 10.0 \ --dropout 0.3 \ --weight-decay 0.0 \ --criterion label_smoothed_cross_entropy \ --label-smoothing 0.1 \ --max-tokens 3584提示原文檔中--save-dir ${SAVEDIR}一行末尾缺少反斜杠導致后續參數無法續行。以上命令已按 bash 續行規則補齊反斜杠實際執行時請勿遺漏。關鍵參數說明參數取值含義與源碼依據--simul-typewaitk選擇單調注意力策略經 modules/init.py 的注冊表解析到WaitKAttention--waitk-lagging10wait-k 的 k 值由WaitKAttention.add_args聲明為必選參數必須 0--archtransformer_monotonic_vaswani_wmt_en_de_big在 models/transformer_monotonic_attention.py 注冊的架構內部復用transformer_vaswani_wmt_en_de_big的超參6 層、1024 維、16 頭--max-epoch70訓練輪數--optimizer/--adam-betasadam / (0.9, 0.98)WMT 風格 Transformer 的標準設置--lr-schedulerinverse_sqrt逆平方根學習率衰減--warmup-init-lr/--warmup-updates/--lr/--stop-min-lr1e-07 / 4000 / 5e-4 / 1e-9warmup 起點、warmup 步數、峰值學習率、衰減下限--clip-norm/--dropout/--weight-decay10.0 / 0.3 / 0.0梯度裁剪、Dropout、權重衰減--criterion/--label-smoothinglabel_smoothed_cross_entropy / 0.1帶標簽平滑的交叉熵--max-tokens3584每個 batch 的源側最大 token 數架構注冊值得多看一眼transformer_monotonic_vaswani_wmt_en_de_big注冊在模型transformer_monotonic名下transformer_monotonic_attention.py而該模型類TransformerModelSimulTrans通過build_encoder/build_decoder將標準 Transformer 的編解碼器替換為TransformerMonotonicEncoder和TransformerMonotonicDecoder二者把每一層換成TransformerMonotonicEncoderLayer/TransformerMonotonicDecoderLayer。也就是說 wait-k 的“實時性”不是靠換損失函數實現而是靠把單調注意力策略注入每一層的編碼器注意力中。解碼器如何決定“讀還是寫”TransformerMonotonicDecoder.extract_featurestransformer_monotonic_attention.py實現了一個逐層提前決策的機制這是理解推理循環的關鍵增量推理時incremental_state is not None輸入被裁剪為最后一個 tokenincremental_state[online][only]標志表示源側是否仍在流式到達“encoder 狀態還在變化”逐層前向。當online為真且策略是anyself.policy_criterion getattr(args, policy_criterion, any)時檢查當前層多頭單調注意力的head_read緩沖區——只要有任何一個頭決定讀取源側下一個單元解碼器立即返回action0READ若決定不讀會先調用self.clean_cache(incremental_state, i 1)修剪已寫入的 self-attention 緩存避免“前向過一次但沒產生預測”導致的 saved_state 重復隨后返回action1WRITE。模塊常量READ_ACTION 0、WRITE_ACTION 1定義在同一文件頭部transformer_monotonic_attention.py與 SimulEval 側的READ_ACTION/WRITE_ACTION語義對應。對 wait-k 而言p_choose為 1 的那一步所有頭都會讀到 1因此“any head decides to read”等價于“輪到讀了”。推理與評測SimulEval 流水線評測依賴 SimulEval 框架Meta 開源的同傳評測工具安裝方式是在其源碼倉庫中執行pip install -e .。評測命令如下${SRC_FILE}與${REF_FILE}分別為源文和參考譯文${SRC_SPM_PATH}為英文句子的 sentencepiece 模型simuleval \ --source ${SRC_FILE} \ --target ${TGT_FILE} \ --data-bin ${WMT20_ENJA_DATA_BIN} \ --sacrebleu-tokenizer ja-mecab \ --eval-latency-unit char \ --no-space \ --src-splitter-type sentencepiecemodel \ --src-splitter-path ${SRC_SPM_PATH} \ --agent ${FAIRSEQ}/examples/simultaneous_translation/agents/simul_trans_text_agent_enja.py \ --model-path ${SAVE_DIR}/${CHECKPOINT_FILENAME} \ --output ${OUTPUT} \ --scores參數要點--data-bin必須與數據準備階段的${WMT20_ENJA_DATA_BIN}一致詞典、token 映射都在這里若只做評測文檔提到官方提供了預制的 WMT20 enja medium 數據目錄與 wait-k10 預訓練 checkpoint 可直接下載不必從頭準備數據--sacrebleu-tokenizer ja-mecabBLEU 計算使用 sacrebleu MeCab 分詞器--eval-latency-unit char延遲在目標側以字符數為單位計算這對無空格分詞的日語尤其重要--no-space合并預測出的子詞時不添加空格日語直接拼接即可還原原文--src-splitter-type sentencepiecemodel--src-splitter-path源文按 sentencepiece 模型切分為 subword 流模擬真實“逐詞流式輸入”--agent指定翻譯策略的 agent 腳本它封裝了模型的增量解碼邏輯--output ${OUTPUT}詳細日志與逐句分數會寫入該目錄。路徑說明原命令中--agent指向${FAIRSEQ}/examples/simultaneous_translation/agents/simul_trans_text_agent_enja.py這是上游 fairseq 倉庫的目錄布局。從當前倉庫的源碼結構看同傳文本 agent 實際位于 eval/agents/simul_t2t_enja.py使用時請以本倉庫實際路徑為準。agent 內部的讀-寫循環SimulTransTextAgentJA 類實現了 SimulEval 的 TextAgent 接口其工作流與上文解碼器的 action 返回值嚴格對應加載模型load_model_vocab從 checkpoint 中恢復cfg與權重task.setup_task重建任務與詞典--data-bin會被寫入task_args.datapolicy決策每步調用self.model.decoder.forward(...)增量解碼。若尚無任何 encoder 狀態直接return READ_ACTION先讀一個源單元否則把當前tgt長度與“是否仍在流式讀取”online寫入incremental_state[steps]/incremental_state[online][only]根據outputs.action返回讀或寫update_states_read讀取后把已讀入的全部源側 subword 索引喂給self.model.encoder重算 encoder 狀態——這正是流式場景下“源側每到一個新單元就重新編碼一次”的實現predict寫入時對 decoder 最后一步輸出取 argmax 得到下一個日語 subwordunits_to_segment日語子詞直接拼接發送跳過 BOS 前綴\u2581這也是--no-space與字符級延遲度量能正確工作的前提。輸出指標解讀評測輸出的 JSON 形如{ Quality: { BLEU: 11.442253287568398 }, Latency: { AL: 8.6587861866951, AP: 0.7863304776251316, DAL: 9.477850951194764 } }BLEU翻譯質量ALAverage Lagging平均滯后譯文每輸出一個單元相對源側已讀位置的滯后量的均值AL 越小說明越“實時”APAverage Proportion平均比例輸出第 n 個目標單元時源側已讀比例的平均值1 表示讀完才寫非流式越小越實時DALDistorted Average Lagging把“提前寫入”負滯后截斷為非負的滯后均值可視為 AL 的保守版本。三者均以目標側字符數計量--eval-latency-unit char。wait-k10 的固定策略理論上會呈現穩定的滯后AL/DAL 差值可反映策略是否出現負滯后。相關實現與延伸閱讀圍繞本示例倉庫中還有幾個可直接對照閱讀的實現fixed_pre_decision.pywaitk_fixed_pre_decision策略對 wait-k 的 p_choose 做“固定前置決策”池化每--fixed-pre-decision-ratio個源步做一次決策支持 average/last 兩種池化用于降低流式場景下的決策開銷是語音同傳示例中的推薦策略之一monotonic_transformer_layer.pyargs.simul_type is not None的斷言在此觸發說明任何同傳訓練都必須顯式指定--simul-typetests/test_text_models.py測試用例中用simul_type: waitk、waitk_lagging: 3以及遍歷多個 k 值的用例驗證 wait-k 模型的前向正確性可作為最小復現參考docs/ende-mma.md英文到德文的單調多頭注意力hard_aligned、infinite_lookback、wait-k對比示例與本文的 enja-waitk 互為姊妹篇simultaneous_translation README同傳示例的總入口另含語音到文本同傳MUST-C示例。實操注意事項小結續行反斜杠原文檔訓練命令--save-dir行末尾缺\照抄會導致后續參數丟失執行前務必修正agent 路徑--agent應指向本倉庫實際存在的 simul_t2t_enja.py而非文檔中上游 fairseq 的agents/路徑data-bin 一致性訓練、評測命令中的${WMT20_ENJA_DATA_BIN}/--data-bin必須指向同一目錄否則詞典不匹配k 值權衡--waitk-lagging越小延遲越低AP/AL 越小但質量壓力越大wait-k 的確定性規則waitk_p_choose中逐行后移的 1意味著質量差異完全由模型在有限上下文下的生成能力決定日語評測三件套ja-mecab分詞 字符級延遲 --no-space拼接三者缺一不可換成其他目標語言時需按該語言的分詞特性調整。【免費下載鏈接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities項目地址: https://gitcode.com/GitHub_Trending/un/unilm創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考