ARTICLE DETAIL

资讯详情

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

Fairseq 词法受限解码(Lexically Constrained Decoding)完全指南:基于动态束分配的向量化约束生成

Fairseq 词法受限解码(Lexically Constrained Decoding)完全指南:基于动态束分配的向量化约束生成 Fairseq 词法受限解码Lexically Constrained Decoding完全指南基于动态束分配的向量化约束生成【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq导读本篇技术指南围绕 Fairseq 的examples/constrained_decoding示例系统讲解如何在序列生成机器翻译等推理阶段强制输出指定的词或短语。你将掌握fairseq-interactive --constraints的完整用法、约束的 tab 分隔输入格式与输出格式解析、OrderedConstraintState与UnorderedConstraintState两种约束状态机的底层实现原理以及动态束分配Dynamic Beam Allocation如何让小束宽即可满足约束生成。阅读本文后你可以直接复现德英翻译中强制输出 hard to influence 的完整命令并理解约束搜索在 fairseq/search.py 与 fairseq/token_generation_constraints.py 中的全部实现细节。概述什么是词法受限解码词法受限解码Lexically Constrained Decoding在序列到序列Seq2Seq模型的解码阶段将用户指定的词或短语作为硬约束注入搜索过程保证这些词以零个或多个 token 的间隔出现在最终输出中。Fairseq 的实现在论文层面对应两项工作Fast Lexically Constrained Decoding With Dynamic Beam AllocationPost Vilar, NAACL 2018提出用动态束分配实现快速受限解码Improved Lexically Constrained Decoding for Translation and Monolingual RewritingHu et al., NAACL 2019引入向量化vectorized扩展支持乱序unordered的短语级约束。该特性在 Fairseq 中的入口是fairseq-interactive的--constraints命令行参数其配置项定义于 fairseq/dataclass/configs.py取值由 fairseq/dataclass/constants.py 中的GENERATION_CONSTRAINTS_CHOICES ChoiceEnum([ordered, unordered])约束为两种模式。典型应用场景包括术语翻译术语表强制、领域词汇强制、以及受控文本改写。快速上手在 fairseq-interactive 中使用 --constraints输入格式tab 分隔的约束字段开启约束搜索只需在fairseq-interactive命令中追加--constraints参数。约束被追加到每行输入的末尾以 tab 分隔第一个字段是待翻译的源句其后每个字段是一个约束一个或多个 token。注意约束中的空格会被当作普通字符处理因此短语约束如to influence中的空格需要用连续 token 表达如toinfluence具体规则取决于你所用的 BPE 词表。以下命令使用 Fairseq 官方的 WMT19 德英模型将德语例句Die maschinelle Übersetzung ist schwer zu kontrollieren.翻译为英文并强制输出约束 hard 与 to influenceecho -e Die maschinelle Übersetzung ist schwer zu kontrollieren.\thard\ttoinfluence \ | normalize.py | tok.py \ | fairseq-interactive /path/to/model \ --path /path/to/model/model1.pt \ --bpe fastbpe \ --bpe-codes /path/to/model/bpecodes \ --constraints \ -s de -t en \ --beam 10其中normalize.py与tok.py位于 examples/constrained_decoding 目录下是 WMT19 预处理的两步快捷封装normalize.py 基于sacremoses的MosesPunctNormalizer对每行执行摩西标点归一化支持--lang默认en与--penn选项tok.py 使用sacremoses.MosesTokenizer做分词关键设计是按 tab 切分后逐字段分别分词再以 tab 拼回map(tok, line.split(\t))从而保证源句与各约束字段不会被混淆、约束字段内的词间空格得以保留为 tab 之外的普通空格。输出格式解析上述命令的典型输出如下[snip] S-0 Die masch in elle Über setzung ist schwer zu kontrollieren . W-0 1.844 seconds C-0 hard C-0 influence H-0 -1.5333266258239746 Mach ine trans lation is hard to influence . D-0 -1.5333266258239746 Machine translation is hard to influence . P-0 -0.5434 -0.1423 -0.1930 -0.1415 -0.2346 -1.8031 -0.1701 -11.7727 -0.1815 -0.1511各行的含义对应 fairseq_cli/interactive.py 的输出逻辑S-0分词并经过 BPE 处理后的源句W-0该句的翻译耗时秒C-0该句使用的每个约束此处即hard与influence一行一个由tgt_dict.string(constraint, ...)还原为文本H-0得分以 2 为底的对数与 BPE 层级的假设输出可见约束 token 已精确落入译文D-0去除 BPE 与分词后的 detokenized 输出P-0每个 token 的位置得分同样以 2 为底长度与H行 token 数一致。有序与乱序约束默认情况下--constraints不带参数时等价于ordered见 configs.py 的argparse_const: ordered约束按提供的顺序生成约束之间允许出现零个或多个任意 token。例如hard之后可以间隔任意 token 再出现influence但顺序必须保持。如果希望解码器自行决定约束的排列顺序例如约束为独立的术语、不关心先后改用--constraints unordered。此时解码器会尝试约束的所有排列对短语约束为C!种顺序。注意乱序模式搜索空间更大通常需要更大的束宽beam。实现细节从命令行到约束状态机约束的打包与解析链路约束从命令行文本到解码器的完整链路为fairseq_cli/interactive.py 的make_batches将每行按 tab 拆出源句与约束列表每个约束字符串经task.target_dictionary.encode_line(..., append_eosFalse, add_if_not_existFalse)编码为 token 张量调用pack_constraints(batch_constraints)见 fairseq/token_generation_constraints.py将句子 × 约束的三层列表打包成(batch_size, maxlen)的稠密张量每行首元素是该句的约束数量其后依次拼接每个约束的 token每个约束末尾追加一个 0 作为分隔符maxlen取各句约束数 各约束长度之和 1的最大值其余位置补零。示例中一个含 3 条约束[3 1 2]、[3]、[4 5 6 7]的句子被打包为[3 3 1 2 0 3 0 4 5 6 7 0]打包张量随 batch 进入task.inference_step(..., constraintsconstraints)最终在 fairseq/sequence_generator.py 调用self.search.init_constraints(constraints, beam_size)初始化每个句子的约束状态。反向的unpack_constraintstoken_generation_constraints.py在输出阶段把打包张量的一行还原为约束张量列表用于打印C-行。LexicallyConstrainedBeamSearch动态束分配约束搜索的核心是 fairseq/search.py 中的LexicallyConstrainedBeamSearch。它继承自Search基类并设置self.supports_constraints True——sequence_generator在收到约束时会检查该标志若搜索方法不支持约束则直接报错sequence_generator.py。该类为束中的每个假设hypothesis维护一个独立的ConstraintState用于跟踪该假设已生成到约束序列的什么位置并据此重塑每一步的束分布。init_constraints按representationordered/unordered为每个句子创建beam_size份约束状态prune_sentences在句子提前完成时移除其状态update_constraints在每步把束裁剪到beam_size后同步裁剪对应的约束状态search.py。step方法体现动态束分配的关键步骤STEP 0对所有未完成not state.finished的假设将其EOStoken 的对数概率置为-inf防止在约束全部满足前提前终止候选构建从整个束中取全局 top-2*beam_size再加上每个假设的 top-1 以及所有下一步可生成的约束 tokenstate.next_tokens()形成候选池银行bank计算对每个候选用state.advance(token)推进约束状态bank即为该假设已生成的约束 token 数排序与去重先按(bank, score)排序再通过beams_buf * (vocab_size 1) indices_buf的滚动比较去除重复的(beam, token)扩展round-robin 条带化striping这是动态束分配的核心——候选按银行从高到低做轮询分配每轮从 bank 最高的开始取一个再取次高的……等价于在排序键中加入跨银行的偏移量见代码中stripe_offsets与注释示例保证处于不同完成阶段的假设都能分到束位从而不必像早期方法那样剪枝截断最终保留num_cands 2 * beam_size个候选返回。step_sentence中bank 越高越靠前的分配策略保证了束空间优先供给已推进约束最远的假设使模型在保持束搜索的同时持续向满足全部约束推进。两种约束状态OrderedConstraintState 与 UnorderedConstraintState两个状态类都位于 fairseq/token_generation_constraints.py它们回答同一个问题给定当前已生成 token 序列下一步允许生成哪些 token通过next_tokens()给出候选集合通过advance(token)生成新状态。OrderedConstraintStatetoken_generation_constraints.py假设C个约束将按给定顺序生成。所有约束被拼接为单个ConstraintSequence内部用endpoints标记每个约束的结尾。其advance逻辑为若已finished接受任意 token保持状态不变若当前 token 匹配下一个约束 token则推进state若正处于约束边界endpoints[state]为真接受任意间隙 token若 token 等于第一个约束 token则重新从第一个约束开始否则回到根状态state -1。UnorderedConstraintStatetoken_generation_constraints.py尝试以全部C!种顺序满足短语级约束。其核心数据结构是ConstraintNode构建的前缀树trieadd_sequence将每条约束写入 trie节点维护terminal该处结束的约束数与num_constraints以该节点为前缀的剩余约束数。advance在 trie 中移动若 token 匹配当前节点的某个子节点且该路径未饱和generated[child] child.num_constraints则深入否则回退rewind到根并在回退路径上检查是否有前缀构成完整约束node.terminal将其标记为completed。finished当且仅当root.num_constraints - num_completed 0。两者的bank属性含义不同ordered 状态中bank state 1已消费的约束 token 数unordered 状态中bank sum(generated.values())——但两者都为LexicallyConstrainedBeamSearch的 round-robin 分配提供统一的进度度量。与 Sockeye 实现的差异Fairseq 的约束解码与 AWS Sockeye 的实现相比存在以下关键差异对应原 README 的说明顺序约束支持按给定顺序生成约束即默认的ordered模式在 Sockeye 中不可用这是 Fairseq 独有的能力无需束剪枝得益于改进的动态束分配方法round-robin 条带化不需要像早期实现那样对束进行额外剪枝更小的束宽同样由于分配更优--beam 10甚至--beam 5往往就足够README 示例即采用--beam 10并提示乱序模式可考虑更大的束向量化扩展落地Hu et al.NAACL 2019描述的向量化扩展trie 约束从未被合并进 Sockeye 主线而 Fairseq 的UnorderedConstraintState正是该扩展的完整实现。测试与验证约束状态机的正确性保障仓库的 tests/test_constraints.py 对约束状态机做了系统测试可作为读者理解行为语义的补充材料test_packing验证pack_constraints对多句、多约束、变长约束的打包结果与预期稠密张量一致test_graphs/test_next_tokens验证ConstraintNodetrie 的构建、next_tokens候选集合与 token 计数test_sequences针对UnorderedConstraintState与OrderedConstraintState各一组对给定的约束序列与 token 输入流断言每一步advance后状态的bank、num_completed、finished等属性符合预期。这些测试用例实际上给出了两类状态机的行为规格例如验证 ordered 状态在约束间隙接受任意 token、unordered 状态能跨顺序满足多条短语约束。读者在阅读实现时可以对照这些用例逐条推演advance的转移逻辑。使用注意事项与适用前提共享子词词表假设fairseq-interactive在启用约束时会打印警告——Constrained decoding currently assumes a shared subword vocabularyinteractive.py。约束 token 直接取自target_dictionary因此要求约束文本与目标端共享同一套子词BPE编码约束编码失败风险encode_line使用add_if_not_existFalse即词表外的 token 不会被加入词表若约束含 OOV 词需在 BPE 编码层面处理批处理输入可多句批量提交tab 分隔约束make_batches逐句解析--buffer-size与--batch-size的关系约束参见 interactive.py乱序模式开销unordered需要探索更多排列建议增大--beamREADME 明确提示 you may want to use a larger beam。引用词法约束解码的首篇论文grid beam search该方向的开创性工作inproceedings{hokamp-liu-2017-lexically, title Lexically Constrained Decoding for Sequence Generation Using Grid Beam Search, author Hokamp, Chris and Liu, Qun, booktitle Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), month jul, year 2017, address Vancouver, Canada, publisher Association for Computational Linguistics, url https://www.aclweb.org/anthology/P17-1141, doi 10.18653/v1/P17-1141, pages 1535--1546, }Fairseq 实现所采用的扩展分别来自inproceedings{post-vilar-2018-fast, title Fast Lexically Constrained Decoding with Dynamic Beam Allocation for Neural Machine Translation, author Post, Matt and Vilar, David, booktitle Proceedings of the 2018 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers), month jun, year 2018, address New Orleans, Louisiana, publisher Association for Computational Linguistics, url https://www.aclweb.org/anthology/N18-1119, doi 10.18653/v1/N18-1119, pages 1314--1324, }inproceedings{hu-etal-2019-improved, title Improved Lexically Constrained Decoding for Translation and Monolingual Rewriting, author Hu, J. Edward and Khayrallah, Huda and Culkin, Ryan and Xia, Patrick and Chen, Tongfei and Post, Matt and Van Durme, Benjamin, booktitle Proceedings of the 2019 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers), month jun, year 2019, address Minneapolis, Minnesota, publisher Association for Computational Linguistics, url https://www.aclweb.org/anthology/N19-1090, doi 10.18653/v1/N19-1090, pages 839--850, }【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表