
edgelm/fairseq 损失函数体系全解从 FairseqCriterion 抽象到 cross_entropy、label smoothing 等内置 Criterion 的注册、构建与实战【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本指南围绕 edgelm/docs/criterions.rst 这一 API 文档所定义的 Criterions 模块展开系统讲解 EdgeLM基于 fairseq 的代码库中损失函数的统一抽象loss criterion(model, batch)、注册与构建机制、基类接口以及cross_entropy、label_smoothed_cross_entropy、adaptive_loss、composite_loss等内置 Criterion 的底层实现与配置方式。读完本文你将掌握如何在训练任务中选用、配置乃至自定义 Criterion并理解损失、样本规模与日志输出三元组如何在分布式训练中被汇总。什么是 Criterion损失函数的统一入口在 fairseq 架构中Criterion准则负责给定模型和 batch 计算损失函数其核心调用关系被文档精炼为一句话loss criterion(model, batch)这一调用发生在训练与验证两个环节。在 fairseq_task.py 中验证循环正是以criterion(model, sample)的方式执行前向并拿到(loss, sample_size, logging_output)三元组见 fairseq_task.py#L492-L502训练器则据此完成反向传播与梯度更新。Criterion 与Task任务紧密绑定Task 负责数据与模型Criterion 负责从模型输出与样本中算出损失。因此每个 Criterion 在构造时都会持有其所属 Task以便读取target_dictionary、获取padding_idxpadding 索引等关键信息。从源码结构看Criterions 模块位于 edgelm/fairseq/criterions/共包含 18 个 Python 文件涵盖文本生成、语音CTC、wav2vec、HuBERT、Tacotron2、FastSpeech2、非自回归翻译NAT、句子分类/排序、掩码语言模型等各类任务的损失实现。本文以文档中显式引用的五个类为核心展开。Criterion 的注册与构建一条--criterion参数驱动的流水线注册表如何建立Criterions 模块的入口 criterions/init.py 通过 fairseq 通用注册机制registry.setup_registry建立了一张以--criterion为键的注册表注册表名称为criterion基类为FairseqCriterion默认值为cross_entropy提供build_criterion(cfg, task)顶层函数接收omegaconf.DictConfig与 task 对象模块末尾会自动扫描并导入 criterions 目录下所有.py文件确保每个用register_criterion装饰的类都被登记。registry.setup_registry的实现见 registry.pyregister_x(name, dataclass)装饰器负责把类写入CRITERION_REGISTRY同时若提供了 dataclass则将其存入CRITERION_DATACLASS_REGISTRY并注册进 Hydra 的ConfigStore从而让每个 Criterion 的参数能自动出现在命令行与 YAML 配置中。build_x则会根据cfg._name即用户选择的 criterion 名称找到对应类优先调用类上的build_criterion方法否则直接以类构造器构建。从 Task 到 Criterion 的构建链路fairseq_task.py#L324-L337 中Task.build_criterion只是转发给criterions.build_criterion(cfg, self)。因此完整链路为--criterion label_smoothed_cross_entropy → Task.build_criterion(cfg) → criterions.build_criterion(cfg, task) → registry 查表取 dataclass 合并配置 → 调用类的 build_criterion(cfg, task) 或构造器基类 FairseqCriterion所有损失函数的契约fairseq_criterion.py 定义了FairseqCriterion它继承自torch.nn.modules.loss._Loss因此每个 Criterion 本身就是一个nn.Module可以持有可学习参数并参与优化。基类约定的关键接口如下接口作用__init__(self, task)保存 task并从task.target_dictionary读取padding_idx无词典时取-100add_args(cls, parser)通过 dataclass 自动生成命令行参数gen_parser_from_dataclassbuild_criterion(cls, cfg, task)用inspect.signature反射构造器参数从 cfg 中取值完成实例化forward(model, sample, reduceTrue)返回三元组(loss, sample_size, logging_output)reduce_metrics(logging_outputs)跨 worker 汇总日志并输出训练指标logging_outputs_can_be_summed()指示日志是否可跨 worker 先求和再聚合返回 True 可加速分布式训练forward返回的三元组中loss用于反向传播的标量损失sample_size梯度归一化的分母按句子平均时为 batch 内句子数否则为 token 总数logging_output字典形式的日志输出如loss、ntokens、nsentences、sample_size等。此外代码中保留了LegacyFairseqCriterion作为旧版兼容层接受argparse.Namespace风格的args供composite_loss等仍依赖旧 API 的 Criterion 使用。内置 Criterion 详解文档通过autoclass显式引用了四个具体实现下面逐一结合源码剖析。CrossEntropyCriterion最基础的交叉熵注册名为cross_entropy也是注册表默认值配置类CrossEntropyCriterionConfig只有一个字段sentence_avg它引用全局optimization.sentence_avg通过omegaconf.II惰性引用用于决定sample_size取target.size(0)按句子还是ntokens按 token。其forward流程见 cross_entropy.py调用model(**sample[net_input])得到网络输出compute_loss中通过model.get_normalized_probs(net_output, log_probsTrue)取对数概率model.get_targets取目标用F.nll_loss计算负对数似然ignore_indexself.padding_idx屏蔽 padding 位置reductionsum返回(loss, sample_size, logging_output)。reduce_metrics中值得注意的实现细节损失除以log(2)将自然对数底 e 的损失转换为以 2 为底的损失即比特数并据此衍生出ppl困惑度指标当sample_size ! ntokens时还会额外记录nll_loss。LabelSmoothedCrossEntropyCriterion带标签平滑的交叉熵注册名为label_smoothed_cross_entropy是翻译等序列生成任务最常用的 Criterion。配置类 label_smoothed_cross_entropy.py 提供四个参数参数默认值含义label_smoothing0.0标签平滑的 epsilon0 表示不做平滑report_accuracyFalse是否在训练中汇报 accuracy 指标ignore_prefix_size0忽略序列前 N 个 token常用于前缀不参与损失计算sentence_avg引用全局同上核心损失函数label_smoothed_nll_loss的实现体现了标签平滑的经典公式nll_loss -lprobs.gather(dim-1, indextarget) smooth_loss -lprobs.sum(dim-1, keepdimTrue) eps_i epsilon / (lprobs.size(-1) - 1) loss (1.0 - epsilon - eps_i) * nll_loss eps_i * smooth_loss即真实类别贡献(1 - ε - ε/(V-1))的负对数似然其余V-1个类别共同分摊ε的概率质量每个分得ε/(V-1)。padding 位置的损失会被masked_fill置零。reduce_metrics会同时记录loss与nll_loss纯负对数似然并由此计算ppl若开启report_accuracy还会统计n_correct/total并输出accuracy百分比。AdaptiveLossGPU 上的自适应 Softmax 损失注册名为adaptive_loss对应论文Efficient softmax approximation for GPUsarXiv:1609.04309用于大规模词表下的高效 Softmax 近似。其特点是见 adaptive_loss.py要求模型 decoder 具备adaptive_softmax属性且非空build_criterion中显式禁止与 PyTorch 版 DDPc10d/pytorch_ddp搭配必须使用--ddp-backendlegacy_ddp原因是自适应 Softmax 的实现依赖 fairseq 的 legacy DDP 行为forward将原始目标展平后交给adaptive_softmax分桶计算多组logits, target每组各自计算F.cross_entropy后累加得到总损失。CompositeLoss多输出多目标的复合损失注册名为composite_loss继承自LegacyFairseqCriterion见 composite_loss.py。它针对模型输出多个 logits、样本携带多个目标的场景为每个 (输出, 目标) 对构造一个FakeModel包装器委托给--underlying-criterion指定的底层 Criterion 分别计算损失再取平均作为最终损失。配置时需显式指定--criterion composite_loss --underlying-criterion label_smoothed_cross_entropybuild_underlying_criterion会临时替换args.criterion来构建底层 Criterion构建完成后恢复并断言两者不相同。其余内置 Criterion 一览除文档显式引用的类外criterions 目录 还包含面向其他任务的损失实现可结合对应任务使用语音/音频ctc、wav2vec_criterion、hubert_criterion、tacotron2_loss、fastspeech2_loss非自回归翻译nat_loss掩码语言模型masked_lm、legacy_masked_lm文本理解sentence_prediction、sentence_ranking变体label_smoothed_cross_entropy_with_alignment对齐增强、label_smoothed_cross_entropy_latency_augmented延迟增强通用model_criterion。它们共享同一注册表与同一(loss, sample_size, logging_output)契约选择依据完全由任务的损失形态决定。实战配置在命令行与 YAML 中选择 CriterionCriterion 通过--criterion全局参数选择各 Criterion 专属参数会自动并入命令行得益于 dataclass 注册进 Hydra ConfigStore。典型用法# 基础交叉熵默认值 fairseq-train>criterion: label_smoothed_cross_entropy自定义一个 Criterion 的完整步骤基于注册机制自定义损失函数的成本极低只需三步继承基类新建文件继承FairseqCriterion实现__init__显式列出所有参数与forward返回三元组定义配置用dataclass继承FairseqDataclass声明参数及默认值注册用register_criterion(my_criterion, dataclassMyCriterionConfig)装饰类文件放入 criterions 目录__init__.py会自动导入即可通过--criterion my_criterion使用。若需要自定义日志指标覆写reduce_metrics新 API并利用metrics.log_scalar/metrics.log_derived输出若日志可在 worker 间先求和将logging_outputs_can_be_summed返回True以获得更快的分布式训练。小结Criterions 模块是 fairseq/EdgeLM 训练流水线的损失中枢它以loss criterion(model, batch)这一简洁契约为所有任务统一了损失计算方式通过--criterion驱动的注册表实现了插拔式扩展并以(loss, sample_size, logging_output)三元组衔接了反向传播与指标统计。理解FairseqCriterion的基类契约、注册构建链路以及cross_entropy/label_smoothed_cross_entropy等经典实现的内部细节是定制任何新任务损失函数的第一步。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考