ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Kosmos-2 内嵌 fairseq 的 Adaptive Input 语言模型训练指南:基于 Baevski Auli (2018) 的 Transformer LM 实践

2026/9/14 12:55:25 拓冰建站 浏览量
Kosmos-2 内嵌 fairseq 的 Adaptive Input 语言模型训练指南:基于 Baevski  Auli (2018) 的 Transformer LM 实践 Kosmos-2 内嵌 fairseq 的 Adaptive Input 语言模型训练指南基于 Baevski Auli (2018) 的 Transformer LM 实践【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文聚焦于 Kosmos-2 仓库内嵌的 fairseq 框架中如何复现 Baevski Auli (2018) 提出的 Adaptive Input Representations 语言模型。你将学会理解 Adaptive Input自适应输入嵌入与 Adaptive Softmax自适应输出层这对输入/输出双侧分层的核心机制在 WikiText-103 与 Google Billion Words 数据集上从零训练自适应 Transformer 语言模型以及通过源码理解--criterion adaptive_loss、--arch transformer_lm_wiki103、cutoff 划分等关键参数的底层实现原理。关联文档kosmos-2/fairseq/examples/language_model/README.adaptive_inputs.md本文以其为骨架并结合仓库内 fairseq 源码逐层展开。一、背景为什么需要 Adaptive Input Representations大规模语言模型的词汇表往往达到数十万量级。传统做法为每个 token 维护一个高维 Embedding输入侧并在输出侧对全词表计算 Softmax 归一化。其代价是参数量爆炸vocab_size × hidden_dim的输入嵌入矩阵与输出投影矩阵占用了模型绝大部分参数计算浪费高频词与低频词共享同一维度无法按词频弹性分配容量。Baevski Auli (2018) 的方案是分层分配把词表按频率切分成若干 band频带高频词使用更高维的嵌入空间低频词使用更低维的嵌入空间再通过线性投影统一到模型维度输出侧使用对应的 Adaptive SoftmaxGrave et al., 2017进行分层归一化。这样既能显著降低参数量与计算量又能保持甚至提升困惑度表现。本文讨论的 fairseq 实现在仓库 kosmos-2/fairseq/ 中所有路径以下文为准。二、预训练模型速览文档给出了两个官方发布的 Adaptive Input 预训练模型原文表格完整继承说明参数量数据集模型与测试集Adaptive InputsBaevski and Auli, 20181026MGoogle Billion Words可下载.tar.bz2 压缩包含模型与测试集Adaptive InputsBaevski and Auli, 2018247MWikiText-103可下载.tar.bz2 压缩包含模型与测试集对应的预训练模型注册名可以在 language_model README 中看到transformer_lm.gbw.adaptive_huge1026MGBW与transformer_lm.wiki103.adaptive247MWikiText-103。下载解压后可通过 PyTorch Hub 或TransformerLanguageModel.from_pretrained加载详见该 README 的 Example usage 一节。三、数据准备WikiText-103 预处理全流程Adaptive Inputs 文档明确指出预处理流程与通用语言模型 README 完全一致因此这里完整展开 README.md 中的步骤。3.1 下载并解压数据集仓库提供了现成脚本 prepare-wikitext-103.sh其逻辑是从 S3 下载wikitext-103-v1.zip若文件已存在则跳过下载随后根据扩展名自动解压.zip用 unzip.tgz/.tar用 tarcd examples/language_model/ bash prepare-wikitext-103.sh cd ../..3.2 二值化binarize数据下载解压后会得到wiki.train.tokens、wiki.valid.tokens、wiki.test.tokens三个分词文件。接下来用fairseq-preprocess将其转为 fairseq 的二进制格式TEXTexamples/language_model/wikitext-103 fairseq-preprocess \ --only-source \ --trainpref $TEXT/wiki.train.tokens \ --validpref $TEXT/wiki.valid.tokens \ --testpref $TEXT/wiki.test.tokens \ --destdir>fairseq-train --task language_modeling \ >if cfg.ddp_backend in {c10d, pytorch_ddp}: raise Exception( AdaptiveLoss is not compatible with the PyTorch version of DistributedDataParallel. Please use --ddp-backendlegacy_ddp instead. )即只要使用--criterion adaptive_loss就不能使用 PyTorch 的 DDP 后端必须显式传--ddp-backendlegacy_ddp否则训练直接抛异常。4.3 显存不足时的通用调优手法沿用 README.md 的官方建议显存溢出时降低--max-tokens每 batch token 数或--tokens-per-sample序列长度或调大--update-freq用梯度累积模拟更多 GPU 的效果。五、架构级解读transformer_lm_wiki103与 Adaptive Input 的源码实现5.1 架构配置文件--arch transformer_lm_wiki103对应的实际配置在 transformer_lm_baevski_wiki103.yamldecoder_embed_dim: 1024 decoder_output_dim: 1024 decoder_input_dim: 1024 decoder_ffn_embed_dim: 4096 decoder_layers: 16 decoder_attention_heads: 8 decoder_normalize_before: true no_decoder_final_norm: true adaptive_softmax_cutoff: 20000,60000 adaptive_softmax_dropout: 0.2 adaptive_softmax_factor: 4 adaptive_input: true adaptive_input_factor: 4 adaptive_input_cutoff: 20000,60000 tie_adaptive_weights: true tie_adaptive_proj: true关键参数与含义参数取值含义decoder_embed_dim1024解码器隐藏维度decoder_layers16Transformer 解码器层数decoder_attention_heads8注意力头数adaptive_input: true—开启自适应输入嵌入adaptive_input_cutoff: 20000,60000—输入侧 cutoff 切分点adaptive_softmax_cutoff: 20000,60000—输出侧 cutoff 切分点与输入一致以便权重共享adaptive_softmax_factor: 44每往后一个 band维度除以 4adaptive_softmax_dropout0.2分层输出层间的 dropouttie_adaptive_weights: true—输入输出各 band 权重共享tie_adaptive_proj: true—各 band 的投影矩阵也共享转置复用而 GBW 的 transformer_lm_baevski_gbw.yaml 则是decoder_embed_dim: 512、12 层、16 头且adaptive_input: false、tie_adaptive_weights: false体现了两套预训练配置的差异。5.2 权重共享的硬约束源码断言在 transformer_lm.py 中当开启tie_adaptive_weights时有一组必须同时满足的断言if args.tie_adaptive_weights: assert args.adaptive_input assert args.adaptive_input_factor args.adaptive_softmax_factor assert args.adaptive_softmax_cutoff args.adaptive_input_cutoff assert args.decoder_input_dim args.decoder_output_dim这意味着一旦启用权重共享输入嵌入的 factor、cutoff 必须与输出侧完全一致输入输出维度也必须相同否则训练会直接断言失败。这正是输入侧 AdaptiveInput 与输出侧 AdaptiveSoftmax 必须成对设计的实现证据。5.3 输入侧AdaptiveInput 的分层嵌入实现在 adaptive_input.py核心逻辑cutoff 自动补全若vocab_size cutoff[-1]自动在 cutoff 末尾追加vocab_sizeL28-L33因此传入20000,60000后WikiText-103 的约 26 万词表会变成[20000, 60000, vocab_size]三段分层嵌入对第 i 个 band嵌入维度为int(initial_dim // factor ** i)L43即高频带用满维initial_dim低频带逐级除以 factor默认 4统一投影每个 band 的nn.Embedding之后接一个无 bias 的nn.Linear(dim, output_dim)L44-L49把各 band 的低维向量统一投影回模型维度output_dim前向分派forward中按 token 值区间把输入拆到不同 band各自过嵌入投影后再写回结果张量L69-L80。此外init_weights对每个 band 的 Embedding 使用均值为 0、标准差为dim^-0.5的正态初始化并把 padding 位置权重置 0Linear 投影层使用 xavier_uniform 初始化。5.4 输出侧AdaptiveSoftmax 的分层打分实现在 adaptive_softmax.py要点head tail 结构head负责前cutoff[0]个高频词与若干簇类标签tail是若干个子网络每个负责一个低频 bandL129-L173adapt_target 标签改写训练时并不会对所有词打分而是把低频词的目标改写为簇类标签仅对命中的 band 计算局部 softmaxL180-L203这是自适应 softmax 省算力的关键权重绑定当传入adaptive_inputs时TiedHeadModule与各 tail 通过TiedLinear直接复用输入侧嵌入权重TiedLinear可选择是否转置对应tie_proj从而在源码层面印证了tie_adaptive_weights/tie_adaptive_proj的语义L100-L115。5.5 损失侧adaptive_loss 的分段交叉熵实现在 adaptive_loss.pyforward中调用adaptive_softmax(net_output[0], orig_target)得到分段 logits 与改写后的 targets然后对每个非空段分别计算带ignore_indexpadding_idx的交叉熵并求和L71-L79。reduce_metrics中按sample_size默认取 token 数归一化输出 loss并派生 ppl 指标L92-L114。六、训练完成后的评估训练产出在--save-dir checkpoints/transformer_wikitext-103下最佳检查点为checkpoint_best.pt。沿用通用 LM README 的评估命令fairseq-eval-lm>fairseq-train --task language_modeling \ >inproceedings{ baevski2018adaptive, title{Adaptive Input Representations for Neural Language Modeling}, author{Alexei Baevski and Michael Auli}, booktitle{International Conference on Learning Representations}, year{2019}, url{https://openreview.net/forum?idByxZX20qFQ}, }说明文末仅保留 bibtex 引用字段原文档中的外部下载与论文外链因仓库内无法验证且不属于仓库证据不再以超链接形式输出预训练模型与数据集名称、参数规模均以文档原表为准。延伸阅读通用语言模型完整指南kosmos-2/fairseq/examples/language_model/README.md含 PyTorch Hub 加载、采样、打分示例卷积语言模型kosmos-2/fairseq/examples/language_model/README.conv.md数据准备脚本kosmos-2/fairseq/examples/language_model/prepare-wikitext-103.shAdaptiveInput 输入层实现kosmos-2/fairseq/fairseq/modules/adaptive_input.pyAdaptiveSoftmax 输出层实现kosmos-2/fairseq/fairseq/modules/adaptive_softmax.pyadaptive_loss 损失实现kosmos-2/fairseq/fairseq/criterions/adaptive_loss.pyWikiText-103 架构配置kosmos-2/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_wiki103.yamlGBW 架构配置kosmos-2/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_gbw.yamlTransformer LM 模型定义kosmos-2/fairseq/fairseq/models/transformer_lm.py【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考