
fairseq 神经语言建模实战指南预训练模型加载、WikiText-103 训练与困惑度评估全流程【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文基于本仓库infoxlm/fairseq中 fairseq 框架的语言建模Neural Language Modeling示例文档系统讲解如何在 fairseq 中完成加载预训练 Transformer 语言模型 → 采样生成 → 从零训练 → 困惑度评估的完整闭环。全文以 examples/language_model/README.md 为骨架并结合 transformer_lm.py、adaptive_loss.py、language_modeling.py 等源码给出可直接复制运行的命令与参数级解释帮助你掌握 fairseq 语言建模的完整技术栈。一、概览fairseq 语言建模支持什么fairseq 的语言建模能力覆盖两条技术路线Transformer 语言模型Transformer LM基于 decoder-only 的 Transformer 结构支持 Adaptive Input RepresentationsBaevski Auli, 2018、Adaptive Softmax、字符级词嵌入Character Token Embedder等高效大词表方案是本文讲解的主线卷积语言模型Convolutional LM基于卷积结构的语言模型详见 conv_lm/README.md。围绕 Transformer LM文档提供了三类可直接使用的资源预训练模型含 Google Billion Words、WikiText-103、WMT19 News Crawl 等数据集产物、PyTorch Hub 加载与采样接口以及CLI 三件套fairseq-preprocess数据预处理、fairseq-train训练、fairseq-eval-lm评估。二、开箱即用的预训练语言模型2.1 预训练模型总览文档给出的预训练模型清单如下模型说明训练数据下载transformer_lm.gbw.adaptive_hugeAdaptive InputsBaevski and Auli, 20181026M 参数Google Billion Wordsdownload (.tar.bz2)transformer_lm.wiki103.adaptiveAdaptive Inputs247M 参数WikiText-103download (.tar.bz2)transformer_lm.wmt19.en英语语言模型Ng et al., 2019WMT News Crawldownload (.tar.gz)transformer_lm.wmt19.de德语语言模型WMT News Crawldownload (.tar.gz)transformer_lm.wmt19.ru俄语语言模型WMT News Crawldownload (.tar.gz)其中 WMT19 系列三个模型在发布时即配好了 Moses 分词器与 fastBPE 子词切分下载解压后即可通过 Hub 接口直接采样GBW 与 WikiText-103 的 adaptive 模型则对应 Adaptive Input Representations 论文的官方复现产物参数规模 1026M / 247M。2.2 源码中的 Hub 模型注册表在 transformer_lm.py 中TransformerLanguageModel.hub_models()显式注册了上述模型名与下载地址的映射并且用moses_fastbpe()辅助函数为 WMT19 模型预先绑定tokenizermoses、bpefastbpe参数——这正是torch.hub.load无需手动指定分词器即可直接采样的底层原因def moses_fastbpe(path): return { path: path, tokenizer: moses, bpe: fastbpe, } return { transformer_lm.gbw.adaptive_huge: https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_gbw_huge.tar.bz2, transformer_lm.wiki103.adaptive: https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_wiki103.tar.bz2, transformer_lm.wmt19.en: moses_fastbpe(https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.en.tar.bz2), transformer_lm.wmt19.de: moses_fastbpe(https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.de.tar.bz2), transformer_lm.wmt19.ru: moses_fastbpe(https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.ru.tar.bz2), }注意hub_models()中的模型名如transformer_lm.wmt19.en即 PyTorch Hub 的模型标识torch.hub.list输出的正是这份注册表里的名字。三、使用 PyTorch Hub 加载与采样3.1 安装预处理依赖从 Hub 加载 WMT19 模型时数据流需要经过 Moses 分词与 fastBPE 切词因此需先安装对应 Python 依赖pip install fastBPE sacremosessacremoses提供 Moses 风格的 tokenizer 实现fastBPE提供 BPE 子词切分与 WMT19 模型训练时的词表切分保持一致。3.2 加载模型并采样文档给出的最小可运行示例import torch # 列出当前 fairseq 可用的所有 Hub 模型 torch.hub.list(pytorch/fairseq) # [..., transformer_lm.wmt19.en, ...] # 加载在 WMT19 News Crawl 上训练的英语语言模型 en_lm torch.hub.load(pytorch/fairseq, transformer_lm.wmt19.en, tokenizermoses, bpefastbpe) # 从语言模型中采样 en_lm.sample(Barack Obama, beam1, samplingTrue, sampling_topk10, temperature0.8) # Barack Obama is coming to Sydney and New Zealand (...)采样接口参数语义beam1不使用 beam search退化为纯自回归逐 token 生成samplingTrue启用随机采样而非贪心解码使输出更具多样性sampling_topk10仅从概率最高的 10 个候选 token 中采样Top-K 截断抑制低概率噪声temperature0.8采样温度小于 1 使分布更尖锐、输出更确定大于 1 则更随机。由于hub_models()已为 WMT19 模型绑定了默认的 moses/fastbpe显式传入tokenizermoses, bpefastbpe是等价且保险的写法。3.3 加载自定义 checkpointHub 接口同样适用于自己训练的模型只需切换到TransformerLanguageModel.from_pretrainedfrom fairseq.models.transformer_lm import TransformerLanguageModel custom_lm TransformerLanguageModel.from_pretrained(/path/to/model/dir, checkpoint100.pt, tokenizermoses, bpefastbpe) custom_lm.sample(Barack Obama, beam5) # Barack Obama (...)其中第一个参数是存放 checkpoint 与词典文件的目录第二个参数是 checkpoint 文件名tokenizer/bpe需与训练数据预处理方式一致。3.4 模型类的注册与参数体系TransformerLanguageModel通过register_model(transformer_lm)注册为 fairseq 的合法模型名transformer_lm.py其add_args静态方法transformer_lm.py定义了完整的可调参数其中与本文高度相关的有--adaptive-input/--adaptive-input-cutoff/--adaptive-input-factor是否启用 Adaptive Input 及词表切分点、缩放因子--adaptive-softmax-cutoff/--adaptive-softmax-factor/--adaptive-softmax-dropoutAdaptive Softmax 输出层的切分点、缩放因子与尾部投影 dropout--tie-adaptive-weights/--tie-adaptive-proj是否将 Adaptive Softmax 与 Adaptive Input 的权重/投影共享--character-embeddings/--character-filters/--character-embedding-dim字符级卷积嵌入方案--decoder-layers/--decoder-embed-dim/--decoder-ffn-embed-dim/--decoder-attention-headsdecoder 结构尺寸--decoder-normalize-before/--no-decoder-final-normPre-LN 与末层 Norm 控制--decoder-layerdrop/--decoder-layers-to-keepLayerDrop 结构化 dropoutFan et al., 2019。四、用 CLI 工具从零训练 Transformer 语言模型本节以 WikiText-103 为基准数据集走完文档给出的完整三步数据准备 → 预处理 → 训练 → 评估。4.1 第一步准备 WikiText-103 数据cd examples/language_model/ bash prepare-wikitext-103.sh cd ../..脚本 prepare-wikitext-103.sh 的核心逻辑是从https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip下载原始压缩包若本地已存在同名文件则跳过下载随后根据扩展名自动解压支持.tgz/.tar/.zip最终在examples/language_model/下生成wikitext-103/目录内含wiki.train.tokens、wiki.valid.tokens、wiki.test.tokens三个分句后的纯文本文件各 token 以空格分隔。4.2 第二步预处理binarize数据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 \ >register_model_architecture(transformer_lm, transformer_lm_wiki103) register_model_architecture(transformer_lm, transformer_lm_baevski_wiki103) def transformer_lm_baevski_wiki103(args): args.decoder_layers getattr(args, decoder_layers, 16) # 16 层 decoder args.decoder_attention_heads getattr(args, decoder_attention_heads, 8) # 8 头注意力 args.dropout getattr(args, dropout, 0.3) args.adaptive_input getattr(args, adaptive_input, True) # 启用 Adaptive Input args.tie_adaptive_weights getattr(args, tie_adaptive_weights, True) # 共享 softmax/input 权重 args.adaptive_input_cutoff getattr(args, adaptive_input_cutoff, 20000,60000) # 词表切分点 args.adaptive_softmax_cutoff getattr(args, adaptive_softmax_cutoff, 20000,60000) args.adaptive_softmax_dropout getattr(args, adaptive_softmax_dropout, 0.2) args.attention_dropout getattr(args, attention_dropout, 0.1) args.activation_dropout getattr(args, activation_dropout, 0.1) args.no_decoder_final_norm getattr(args, no_decoder_final_norm, True) args.tie_adaptive_proj getattr(args, tie_adaptive_proj, True) transformer_lm_big(args)它继承自transformer_lm_big12 层、embed dim 1024、FFN 4096、16 头再覆盖为 16 层 / 8 头。核心设计思想是Adaptive Input Adaptive Softmax 双切分cutoff 均为 20000, 60000并共享权重词表按频率切分为若干簇高频词用大维度嵌入、低频词用低维度投影显著减少嵌入层参数与计算tie_adaptive_weightsTrue时build_model 会断言adaptive_input_factor adaptive_softmax_factor、两端 cutoff 完全一致、且decoder_input_dim decoder_output_dim保证输入与输出侧共享权重合法。作为对照transformer_lm_gbw系列transformer_lm.py仅将 embed dim 设为 512 并配置对应 dropout而transformer_lm_gpt/transformer_lm_gpt2_small/_medium/_bigtransformer_lm.py则给出了从 768/12 层到 1600/48 层的 GPT 风格变体激活函数为 gelu可供不同规模实验参考。4.5 为什么必须用 adaptive_loss no_c10d--criterion adaptive_loss对应 adaptive_loss.py 中的AdaptiveLoss它要求 decoder 必须挂载adaptive_softmaxadaptive_loss.py即必须配合--adaptive-softmax-cutoff使用前向时对每个词表簇分别计算F.cross_entropy并累加忽略 padding token最终按 token 数归一化兼容性约束其构造函数明确在ddp_backend c10d时直接抛异常adaptive_loss.py提示必须使用--ddp-backendno_c10d——这正是训练命令中该参数的来源。4.6 第六步评估困惑度fairseq-eval-lm contenteditable="false">【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考