EdgeLM(Rxf 示例)中 RXF 微调准则 R3F / R4F 的原理与实战:以句子分类为例
EdgeLMRxf 示例中 RXF 微调准则 R3F / R4F 的原理与实战以句子分类为例【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文基于仓库 edgelm/examples/rxf/README.md 展开讲解 Fairseq 生态下 RXFReducing representational collapse via Fine-tuning系列微调准则的实现与使用方法。读完你可以理解 R3F / R4F 两种正则化手段背后的损失函数构造掌握sentence_prediction_r3f与label_smoothed_cross_entropy_r3f两个自定义 criterion 的三个新增超参数--eps、--r3f-lambda、--noise-type并能直接复制可运行的 GLUE RTE 训练命令。背景为什么需要 RXFRXF 方法出自论文Better Fine-Tuning by Reducing Representational CollapseAghajanyan 等2020。其核心观察是标准微调会让预训练模型的表示空间发生“坍缩”rank 持续下降而 RXF 通过在微调损失中额外加入对“加噪输入预测”的匹配约束来抑制这种坍缩。该目录下的代码用于复现论文中除 probing 结果外的全部实验probing 部分不包含在仓库内。在 Fairseq 中RXF 以两个注册的 criterion 提供源码位于 edgelm/examples/rxf/rxf_src/准则名注册标识适用场景源码R3F 句子预测sentence_prediction_r3fGLUE 等句子分类 / 回归任务sentence_prediction_r3f.py标签平滑 R3Flabel_smoothed_cross_entropy_r3f带 label smoothing 的语言建模式微调label_smoothed_cross_entropy_r3f.py而 R4F对分类头加谱范数约束的版本不需要新 criterion只需在训练时追加--spectral-norm-classification-head参数。该参数最终传入 RoBERTa 模型的分类头构造逻辑见 roberta/model.pydo_spectral_normself.args.spectral_norm_classification_head,可以推断R4F 与 R3F 相互独立——R4F 是对分类头权重施加谱范数约束R4F R3F 噪声约束 谱范数正则的组合效果由论文实验给出而--spectral-norm-classification-head本身只负责开启谱范数。三个新增超参数及其源码默认值README 说明 RXF 引入 3 个新超参数它们在两个 criterion 的add_args中定义默认值以源码为准参数含义默认值sentence_prediction_r3f默认值label_smoothed_cross_entropy_r3f取值--eps噪声分布的标准差normal或半宽uniform1e-5L45-L461e-5L43-L44float--r3f-lambdalogistic 损失与 noisy KL 损失的组合权重 λ1.0L47-L481.0float--noise-type采样噪声的参数化分布uniformL49-L51normalL47-L49normal/uniform注意两个准则的--noise-type默认值并不一致句子分类准则默认uniform标签平滑准则默认normal。若追求与论文设定一致建议显式指定。噪声采样器在 criterion 构造时按--noise-type建立sentence_prediction_r3f.pyif self.noise_type in {normal}: self.noise_sampler torch.distributions.normal.Normal(loc0.0, scaleself.eps) elif self.noise_type uniform: self.noise_sampler torch.distributions.uniform.Uniform(low-self.eps, highself.eps) else: raise Exception(funrecognized noise type {self.noise_type})即normal时eps是标准差uniform时eps是分布范围半宽采样区间为[-eps, eps]这与 README 中“standard deviation or range”的描述完全对应。R3F 损失是怎么算的对称 KL 项的源码走读以sentence_prediction_r3f为例forward的完整流程L76-L146可以拆成四步第一步前向两次。第一次用原始 token embedding 得到input_logits第二次把从噪声分布采样的扰动加到 token embedding 上再前向一次得到noised_logitsnoise self.noise_sampler.sample(sample_shapetoken_embeddings.shape).to(token_embeddings) noised_embeddings token_embeddings.detach().clone() noise注意token_embeddings.detach()噪声只叠加在 embedding 的数值副本上且切断了对 embedding 表的反传路径保证对称 KL 项的梯度主要流向 Transformer 主干而非词表向量本身。第二步计算对称 KL。_get_symm_klL58-L74对两路 logits 各算一次 KL 后相加并除以 batch 大小return ( F.kl_div(F.log_softmax(noised_logits, ...), F.softmax(input_logits, ...), ...) F.kl_div(F.log_softmax(input_logits, ...), F.softmax(noised_logits, ...), ...) ) / noised_logits.size(0)也就是说约束的是“对加噪输入的输出分布”与“对干净输入的输出分布”相互接近——这正是 RXF 抑制表示坍缩的机制模型在输入被微小扰动时仍须保持预测一致。第三步组合损失。分类模式下L117-L125loss F.nll_loss(F.log_softmax(input_logits, ...), targets, reductionsum) if model.training: symm_kl symm_kl * sample_size loss loss self.r3f_lambda * symm_kl即总损失 NLL(logistic 损失) λ × 对称KL。注意对称 KL 项只在model.training时加入验证/测试阶段退化为普通 NLL因此评估结果不受 λ 影响symm_kl先按 batch 归一后乘以sample_size使其与reductionsum的 NLL 量纲一致加上--regression-target后损失改为 MSEL126-L129此时不再叠加 KL 项。第四步日志输出。aggregate_logging_outputsL148-L170会在训练日志中额外打出symm_kl按样本数平均与accuracyloss 按math.log(2)换算为以 bit 为单位的平均损失。label_smoothed_cross_entropy_r3f的结构与之平行forward L70-L115基础损失换成label_smoothed_nll_loss复用 Fairseq 自带的 label_smoothed_cross_entropy.py 中的实现噪声同样注入model.encoder.embed_tokens产出的 token embeddingKL 项仅在 training 时叠加。两者差异小结维度sentence_prediction_r3flabel_smoothed_cross_entropy_r3f基础损失NLL分类/ MSE--regression-targetlabel-smoothed NLL分类头需classification_heads默认sentence_classification_head直接用模型主输出 logits--noise-type默认uniformnormal指标上报aggregate_logging_outputsaccuracyreduce_metricsppl实战在 GLUE RTE 上运行 R3FREADME 给出了复现论文 RTE 实验的完整命令。以下在保留原始参数的基础上补充了逐行注释--user-dir examples/rxf/rxf_src是注册这两个 criterion 的关键Fairseq 会通过 user-dir 自动导入 rxf_src/init.py 完成register_criterion注册TOTAL_NUM_UPDATES3120 WARMUP_UPDATES187 LR1e-05 NUM_CLASSES2 MAX_SENTENCES8 # Batch size. ROBERTA_PATH/path/to/roberta/model.pt CUDA_VISIBLE_DEVICES0 fairseq-train RTE-bin \ --restore-file $ROBERTA_PATH \ --max-positions 512 \ --max-sentences $MAX_SENTENCES \ --max-tokens 4400 \ --task sentence_prediction \ --reset-optimizer --reset-dataloader --reset-meters \ --required-batch-size-multiple 1 \ --init-token 0 --separator-token 2 \ --arch roberta_large \ --criterion sentence_prediction_r3f \ --num-classes $NUM_CLASSES \ --dropout 0.1 --attention-dropout 0.1 \ --weight-decay 0.1 --optimizer adam --adam-betas (0.9, 0.98) --adam-eps 1e-06 \ --clip-norm 0.0 \ --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ --max-epoch 10 \ --find-unused-parameters \ --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ --noise-type uniform --r3f-lambda 0.7 \ --user-dir examples/rxf/rxf_src命令中的关键项说明--restore-file $ROBERTA_PATH--reset-optimizer --reset-dataloader --reset-meters加载 RoBERTa-large 预训练权重并重置优化器/调度状态是“预训练模型 从头微调”的标准组合--task sentence_prediction与--criterion sentence_prediction_r3f任务提供sentence_classification_headcriterion 会断言该头存在见 L84-L87--lr-scheduler polynomial_decay配合--total-num-update/--warmup-updates控制按步数衰减的调度--best-checkpoint-metric accuracy --maximize-best-checkpoint-metric以验证集 accuracy 选优模型RXF 专属部分只有三处--criterion sentence_prediction_r3f、--noise-type uniform --r3f-lambda 0.7、--user-dir examples/rxf/rxf_src。其中--r3f-lambda 0.7是论文推荐值而源码默认是1.0——复现实验时务必显式指定若要 R4F在上述命令基础上追加--spectral-norm-classification-head即可无需改动 criterion。如何验证与深入criterion 注册入口edgelm/examples/rxf/init.py 导入rxf_src子包从而在 Fairseq 启动时注册两个新 criterion回归验证仓库测试 edgelm/tests/test_binaries.py 中的 user-dir 测试用例会加载examples/rxf/rxf_src可确认该包被 Fairseq 工具链正确识别若要在其他模型如 BART上开启谱范数分类头--spectral-norm-classification-head同样生效参见 bart/model.py。引用如使用了本实现请按论文引用article{aghajanyan2020better, title{Better Fine-Tuning by Reducing Representational Collapse}, author{Aghajanyan, Armen and Shrivastava, Akshat and Gupta, Anchit and Goyal, Naman and Zettlemoyer, Luke and Gupta, Sonal}, journal{arXiv preprint arXiv:2008.03156}, year{2020} }【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考