ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

unilm (EdgeLM) 同声传译实战:wait-k 英日实时翻译模型的训练、决策策略源码解析与 SimulEval 评测

unilm (EdgeLM) 同声传译实战: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),仅供参考
返回列表