
GottBERT 德语预训练语言模型实战基于 fairseq 的加载、掩码填充与特征提取指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文围绕 unilm 仓库 decoding/IAD/fairseq/examples/gottbert/README.md 展开系统讲解 GottBERT——一个在 145GB 德语文本上预训练、基于 RoBERTa 架构的纯德语语言模型——在 fairseq 框架下的完整使用方案。读完本文你将掌握通过 torch.hub 与本地 checkpoint 两种方式加载 GottBERT、执行mask掩码填充MLM 推理、以及抽取单层/全层特征向量的实战方法并能结合仓库源码理解其底层实现机制。GottBERT 是什么GottBERT 是一个纯德语pure German预训练语言模型由 Raphael Scheible 等人于 2020 年发布。其核心特点是预训练语料约 145GB 德语文本模型架构完全基于 RoBERTaRobustly optimized BERT approach架构定位面向德语 NLP 任务的通用预训练编码器可用于特征抽取、掩码填充、以及下游任务的微调。GottBERT 在 fairseq 生态中与 RoBERTa、CamemBERT法语、XLM-R多语言等模型并列属于 fairseq RoBERTa 模型家族的一员。在 unilm 仓库中它被完整集成在 decoding/IAD/fairseq/fairseq/models/roberta/ 目录下。源码中的实现机制要正确使用 GottBERT先理解它在 fairseq 源码中的落地方式会很有帮助。GottbertModel一个注册的 RoBERTa 子类在 model_gottbert.py 中GottBERT 通过register_model(gottbert)装饰器注册到 fairseq 模型注册表其类GottbertModel直接继承自RobertaModelregister_model(gottbert) class GottbertModel(RobertaModel): classmethod def hub_models(cls): return { gottbert-base: https://dl.gottbert.de/fairseq/models/gottbert-base.tar.gz, }这意味着 GottBERT 无需额外定义网络结构而是完整复用 RoBERTa 的编码器实现差异仅在于预训练权重与分词器配置。hub_models()返回的字典将别名gottbert-base映射到官方托管地址供 torch.hub 自动下载。同时__init__.py中通过from .model_gottbert import *将GottbertModel导出因此用户可以直接从fairseq.models.roberta导入。from_pretrained 的默认配置GottbertModel 重写了from_pretrained类方法model_gottbert.py关键点在于其默认 BPE 配置与通用 RoBERTa 不同classmethod def from_pretrained(cls, model_name_or_path, checkpoint_filemodel.pt, data_name_or_path., bpehf_byte_bpe, # 默认使用 HuggingFace 风格的 byte-level BPE bpe_vocabvocab.json, bpe_mergesmerges.txt, bpe_add_prefix_spaceFalse, **kwargs): x hub_utils.from_pretrained( model_name_or_path, checkpoint_file, data_name_or_path, archive_mapcls.hub_models(), bpebpe, load_checkpoint_headsTrue, bpe_vocabbpe_vocab, bpe_mergesbpe_merges, bpe_add_prefix_spacebpe_add_prefix_space, **kwargs, ) return RobertaHubInterface(x[args], x[task], x[models][0])可以看到默认 checkpoint 文件名为model.pt模型包内需包含词表文件vocab.json与 BPE 合并规则文件merges.txt默认 BPE 为hf_byte_bpe即 GPT-2 风格的 byte-level BPE这也是 RoBERTa 系列的标准做法返回的是RobertaHubInterface——一个统一的模型交互接口封装了编码、解码、特征抽取、掩码填充、分类预测等能力实现见 hub_interface.py。底层交互接口 RobertaHubInterface所有面向用户的 APIencode、decode、extract_features、fill_mask、predict等都由 RobertaHubInterface 提供。它内部持有task负责词典与 BPE 构建与model网络主体并维护一个用于确定设备位置的_float_tensorbuffer。理解这一点后下文各操作的本质就清晰了encode先做 BPE 编码再拼上s ... /s特殊符号最后经词典转成 token id 张量extract_features调用模型的features_onlyTrue前向传播返回最后一层或全部隐藏层的表示fill_mask定位mask位置取该位置 logits 的 softmax 分布并做 top-k 采样。方式一通过 torch.hub 一键加载PyTorch 1.1如果你的 PyTorch 版本不低于 1.1最简洁的方式是使用 torch.hub 从 fairseq 仓库直接加载模型权重会自动下载并缓存import torch gottbert torch.hub.load(pytorch/fairseq, gottbert-base) gottbert.eval() # 关闭 dropout若保留 train 模式则可用于后续微调代码背后的逻辑是torch.hub.load(pytorch/fairseq, gottbert-base)会进入 fairseq 的 hubconf查找名为gottbert-base的模型入口并通过上述GottbertModel.hub_models()中的映射定位下载地址最终返回一个已装配好 BPE 与词典的RobertaHubInterface实例。调用gottbert.eval()会关闭 dropout 等训练专用行为适合推理场景如果打算基于 GottBERT 继续微调下游任务则可以跳过eval()让模型保持在训练模式。方式二手动下载 checkpoint 加载PyTorch 1.0 或自定义模型对于 PyTorch 1.0 用户或希望离线使用、加载自定义 checkpoint 的场景可以手动下载并解压模型包再从本地路径加载# 下载 GottBERT 模型包并解压 wget https://dl.gottbert.de/fairseq/models/gottbert-base.tar.gz tar -xzvf gottbert.tar.gz解压后的目录应包含model.pt、vocab.json、merges.txt等文件。然后在 fairseq 中加载from fairseq.models.roberta import GottbertModel gottbert GottbertModel.from_pretrained(/path/to/gottbert) gottbert.eval() # 关闭 dropout或保留 train 模式用于微调这里直接使用GottbertModel.from_pretrained其默认参数bpehf_byte_bpe、bpe_vocabvocab.json、bpe_mergesmerges.txt、checkpoint_filemodel.pt与官方模型包的文件布局一一对应因此无需额外传参即可加载。如果你的模型包文件名不同可以通过具名参数覆盖例如gottbert GottbertModel.from_pretrained( /path/to/gottbert, checkpoint_filemy_model.pt, bpe_vocabmy_vocab.json, )注意上述加载方式同样适用于通用RobertaModel.from_pretrained见 model.py它调用hub_utils.from_pretrained并设置load_checkpoint_headsTrue从而支持模型包内附带的分类头加载。掩码填充Filling masksGottBERT 作为掩码语言模型可以直接预测句子中被mask遮住的 token。调用fill_mask(masked_line, topkk)即可返回 k 个候选补全每个结果是一个三元组(补全后的整句, 概率, 补全的词)masked_line Gott ist mask ! :) gottbert.fill_mask(masked_line, topk3) # [(Gott ist gut ! :), 0.3642110526561737, gut), # (Gott ist überall ! :), 0.06009674072265625, überall), # (Gott ist großartig ! :), 0.0370681993663311, großartig)]从上面的示例输出可以看出对于德语输入 Gott ist! :)模型给出的最可能补全是 gut好的这与德语常用表达 Gott ist gut 相符直观反映了模型学到的德语语义知识。其底层实现位于 hub_interface.py 的 fill_mask 方法流程为断言输入中恰好包含一个masktoken将mask前后的文本分别做 BPE 编码再拼接为s ... mask ... /s形式的完整序列并转成 token id以utils.model_eval上下文即评估模式执行带 MLM 头的前向传播取出掩码位置对应的 logits对 logits 做 softmax 后取topk再经词典与 BPE 解码还原为德语文本片段。特征提取Extract featuresGottBERT 可以输出 token 级别的上下文表示供下游任务分类、序列标注、检索等使用。提取最后一层特征line Der erste Schluck aus dem Becher der Naturwissenschaft macht atheistisch , aber auf dem Grunde des Bechers wartet Gott ! tokens gottbert.encode(line) last_layer_features gottbert.extract_features(tokens) assert last_layer_features.size() torch.Size([1, 27, 768])要点encode(line)返回一个一维的 token id 张量含s、/sextract_features内部会自动为 batch 维度补上 unsqueeze因此输出形状为[batch, seq_len, hidden]本例中 27 个位置对应 27 个 BPE token隐藏维度 768 表明gottbert-base采用 BERT-base 规模与 model.py 中 base 架构的默认encoder_embed_dim768一致。提取全部层特征all_layers gottbert.extract_features(tokens, return_all_hiddensTrue) assert len(all_layers) 13 assert torch.all(all_layers[-1] last_layer_features)细节说明return_all_hiddensTrue时返回一个列表其中索引 0 是 embedding 层之后每项对应一个 Transformer 编码层共 13 项说明 base 规模下是 12 个 Transformer 层 1 个 embedding 层列表最后一个元素与extract_features返回的最后一层特征完全相等由第二个断言验证源码中该逻辑会先将内部T x B x C的隐藏状态转置为B x T x C见 hub_interface.py保证输出形状与常规[batch, seq_len, hidden]约定一致。如果需要将特征对齐到 spaCy 的词级分词结果还可以使用extract_features_aligned_to_words(sentence)它会对每个词对应的 BPE 特征做加权平均并将结果暴露在Token.vector属性中详见 hub_interface.py。进阶编码、解码与下游微调除了文档给出的三个核心用法基于 GottBERT 背后的RobertaHubInterface你还可以进一步挖掘以下能力这些 API 与 RoBERTa 示例 完全一致BPE 编码与解码tokens gottbert.encode(Hallo Welt!) # 返回 token id 张量首尾含 s 与 /s text gottbert.decode(tokens) # 还原为原始文本encode支持同时传入多句句子对并约定使用额外的/s作为句间分隔符见 hub_interface.py 的 encode 说明这为句子对分类任务如 MNLI 风格提供了便利。注册分类头并预测可以动态为模型挂载一个新的、随机初始化的分类头随后微调或直接预测gottbert.register_classification_head(mein_task, num_classes3) logprobs gottbert.predict(mein_task, tokens) # 返回 log 概率register_classification_head使用encoder_embed_dim作为输入维度、pooler_activation_fn与pooler_dropout控制分类头的非线性与正则化见 model.py。这意味着一份 GottBERT 权重即可复用于多种分类下游任务。GPU 使用与批处理gottbert.cuda() # 迁移到 GPU logprobs gottbert.predict(mein_task, tokens) # 批处理预测将多个样本的 encode 结果用 collate_tokens 对齐 from fairseq.data.data_utils import collate_tokens batch collate_tokens([tokens_a, tokens_b], pad_idx1)RobertaHubInterface内部通过self.device自动将输入张量送往正确设备GPU 迁移只需一次cuda()调用。微调思路GottbertModel继承自RobertaModel因此在 unilm 仓库的 fairseq 环境中可以参照 RoBERTa 的微调方案如 GLUE 分类任务、自定义分类任务、WSC 指代消解等见 RoBERTa 微调文档对 GottBERT 进行适配from_pretrained中load_checkpoint_headsTrue也确保微调后的分类头权重能被正确保存与恢复。总结与引用GottBERT 是一个开箱即用的德语预训练编码器能力API说明一键加载torch.hub.load(pytorch/fairseq, gottbert-base)PyTorch 1.1本地加载GottbertModel.from_pretrained(path)需model.ptvocab.jsonmerges.txt掩码填充fill_mask(text, topkk)返回补全句、概率与补全词特征提取extract_features(tokens)最后一层或全部层return_all_hiddensTrue编码/解码encode/decodeGPT-2 风格 byte-level BPE分类预测register_classification_headpredict支持下游任务扩展如果你在论文或产品中使用了 GottBERT请引用其原始工作misc{scheible2020gottbert, title{GottBERT: a pure German Language Model}, author{Raphael Scheible and Fabian Thomczyk and Patric Tippmann and Victor Jaravine and Martin Boeker}, year{2020}, eprint{2012.02110}, archivePrefix{arXiv}, primaryClass{cs.CL} }相关源码与文档位置模型实现 model_gottbert.py、交互接口 hub_interface.py、原始指南 examples/gottbert/README.md。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考