资讯详情

资讯详情

基于 fairseq 使用 CamemBERT:法国语言模型的加载、特征提取与掩码填充实战指南

基于 fairseq 使用 CamemBERT法国语言模型的加载、特征提取与掩码填充实战指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读CamemBERT 是 fairseq 生态中第一个面向法语的高质量预训练语言模型基于 RoBERTa 架构、在 138GB 法语文本上训练而成。本文以 edgelm/examples/camembert/README.md 为核心结合本仓库 edgelm 中 fairseq 框架的源码实现完整讲解 CamemBERT 各版本预训练模型的差异、通过 torch.hub 与本地 checkpoint 两种方式加载模型的步骤、以及特征提取、掩码填充Mask Filling等核心推理能力的调用方法与底层原理读者学完后可直接在自己的法语 NLP 任务中跑通 CamemBERT 的加载与特征抽取流程。一、CamemBERT 是什么CamemBERT论文见 arXiv 1911.03894是一个预训练语言模型基于 RoBERTa 的训练思路与 Transformer 编码器架构使用138GB 法语文本OSCAR 语料进行大规模自监督预训练。它同时也可在 HuggingFace Transformers 生态中使用在本仓库中其官方参考实现位于 fairseq 的 RoBERTa 模型家族中。从源码结构看CamemBERT 并不是一套独立的模型代码而是对 RoBERTa 的轻量封装与法语化定制。核心实现位于 model_camembert.pyregister_model(camembert) class CamembertModel(RobertaModel): ...通过register_model(camembert)将模型类注册进 fairseq 的模型注册表MODEL_REGISTRYCamembertModel直接继承自 RobertaModel复用其全部编码器、分类头与预训练接口与标准 RoBERTa 最大的差异在于BPE 分词器RoBERTa 默认使用 GPT-2 BPEbpegpt2而 CamemBERT 的from_pretrained默认使用sentencepiecebpesentencepiece以更好地覆盖法语的形态学与重音字符。该文件在 roberta/init.py 中被导出保证from fairseq.models.roberta import CamembertModel可用。二、预训练模型版本一览官方提供了多个 CamemBERT 检查点覆盖不同的参数量、语料与规模下表完整列出信息取自 原文档模型名参数量架构训练数据camembert/camembert-base110MBaseOSCAR138GB 法语文本camembert-large335MLargeCCNet135GB 法语文本camembert-base-ccnet110MBaseCCNet135GB 法语文本camembert-base-wikipedia-4gb110MBaseWikipedia4GB 法语文本camembert-base-oscar-4gb110MBaseOSCAR 子集4GB 法语文本camembert-base-ccnet-4gb110MBaseCCNet 子集4GB 法语文本各版本的差异与适用场景camembert-base旗舰版本训练数据量最大138GB适合作为大多数法语任务的基础模型camembert-large参数规模为 335MLarge 架构能力更强但推理与微调成本更高camembert-base-ccnet同等规模下对比不同语料CCNet vs OSCAR对模型质量的影响*-4gb系列在 4GB 语料子集上训练用于研究数据规模缩放规律——例如对比camembert-base138GB与camembert-base-oscar-4gb4GB即可观察训练数据量对下游任务表现的贡献。这些模型的下载地址统一登记在 model_camembert.py 的hub_models()方法中每个名字都映射到一个.tar.gz压缩包如camembert-base.tar.gz、camembert-large.tar.gz、camembert-base-ccnet-4gb.tar.gz等这也是 torch.hub 能够按名称自动下载的基础。三、加载模型torch.hub 方式推荐PyTorch 1.1最快捷的加载方式是通过 torch.hub 直接拉取import torch camembert torch.hub.load(pytorch/fairseq, camembert) camembert.eval() # 关闭 dropout若需微调则保持训练模式底层原理hubconf.py 的自动注册这一行代码之所以能工作关键在于 hubconf.py 的自动暴露机制for _model_type, _cls in MODEL_REGISTRY.items(): for model_name in _cls.hub_models().keys(): globals()[model_name] functools.partial( _cls.from_pretrained, model_name, )即遍历 fairseq 注册表中的所有模型类把每个类hub_models()返回的名字camembert、camembert-base、camembert-large等全部暴露为 torch.hub 可调用的入口。因此你可以把加载名换成任意上表中的模型名例如camembert_large torch.hub.load(pytorch/fairseq, camembert-large)如果本地缺少依赖hubconf.py 会先检查dataclasses、hydra、numpy、omegaconf、regex、requests、torch等依赖是否存在缺失时抛出RuntimeError提示同时它还会尝试就地编译 Cython 组件见 hubconf.py保证 torch.hub 加载路径完整可用。四、加载模型本地 checkpoint 方式对于 PyTorch 1.0 或需要自定义模型/路径的场景可以先下载模型压缩包再解压加载# 下载 camembert 模型压缩包并解压 wget camembert-base.tar.gz 下载地址 tar -xzvf camembert-base.tar.gz下载地址与hub_models()中登记的地址一致见 model_camembert.py解压后得到含model.pt的模型目录。然后在 Python 中加载from fairseq.models.roberta import CamembertModel camembert CamembertModel.from_pretrained(/path/to/camembert) camembert.eval() # 关闭 dropout若需微调则保持训练模式from_pretrained 的参数说明从 model_camembert.py 的源码可见CamemBERT 的from_pretrained与 RoBERTa 相比有专门的法语化默认值参数默认值说明model_name_or_path必填torch.hub 模型名或本地模型目录路径checkpoint_filemodel.ptcheckpoint 文件名data_name_or_path.词典等数据文件的路径bpesentencepiece分词器类型CamemBERT 默认 sentencepieceRoBERTa 默认 gpt2此外内部调用hub_utils.from_pretrained时还设置了load_checkpoint_headsTrue即加载 checkpoint 时会同时重新注册并加载其中的分类头这为后面直接使用微调过的下游任务模型如句子对分类做好了准备。五、特征提取encode 与 extract_featuresCamemBERT 的 Hub 接口封装在 hub_interface.py 的RobertaHubInterface中提供了一整套开箱即用的方法。文本编码 encodeline Jaime le camembert ! tokens camembert.encode(line)encode的实现见 hub_interface.py会先用 sentencepiece 对输入做 BPE 编码在每个序列前加上起始符s、结尾加上结束符/s对多句输入用额外的/s作为分隔符no_separatorTrue可关闭通过task.source_dictionary.encode_line映射为 token id 张量。对应decode方法hub_interface.py则负责将 token id 还原回可读文本并支持按/s切分多句。提取最后一层特征last_layer_features camembert.extract_features(tokens) assert last_layer_features.size() torch.Size([1, 10, 768])输入Jaime le camembert !经 BPE 后共 10 个 token含s、/s因此输出形状为[1, 10, 768]其中 768 是 Base 架构的隐藏维度extract_features内部hub_interface.py会校验序列长度不超过model.max_positions()然后以features_onlyTrue前向一次 Transformer 编码器。提取全部层特征all_layers camembert.extract_features(tokens, return_all_hiddensTrue) assert len(all_layers) 13 assert torch.all(all_layers[-1] last_layer_features)return_all_hiddensTrue时返回所有 Transformer 层的隐状态13 层 1 层 embedding 12 层 TransformerBase 架构为 12 层编码器层 0 即 embedding 层源码会将内部T x B x C的张量转置为B x T x C见 hub_interface.py方便按 batch 维度使用all_layers[-1] last_layer_features保证两种调用方式得到的最后一层特征完全一致可放心混用。六、掩码填充fill_maskCamemBERT 作为掩码语言模型可以直接预测句中mask位置的单词masked_line Le camembert est mask :) camembert.fill_mask(masked_line, topk3) # [(Le camembert est délicieux :), 0.4909118115901947, délicieux), # (Le camembert est excellent :), 0.10556942224502563, excellent), # (Le camembert est succulent :), 0.03453322499990463, succulent)]返回结果中每个元素是一个三元组(填充后的完整句子, 预测概率, 预测出的词片段)。上面示例中模型以约 49% 的概率给出 délicieux美味符合法语母语者对卡芒贝尔奶酪的典型联想。fill_mask 的实现细节从 hub_interface.py 的源码看其流程为校验输入中恰好包含一个mask标记否则抛出断言错误提示将mask前后的文本分别做 BPE 编码再重新拼接回含mask的 token 序列并加上s、/s定位mask对应的 token 下标masked_index以features_onlyFalse前向模型得到词表维度的 logits对该位置做softmax得到概率分布用topk(ktopk)取出概率最高的 k 个候选词逐个解码回文本并替换回原句对 sentencepiece 以▁开头的片段表示词首空格做特殊处理恢复成带空格的正常文本。其中topk参数控制返回候选数量默认为 5可按需调整。七、面向下游任务分类头与预测CamemBERT 复用 RoBERTa 的分类头机制model.py你可以动态注册一个新的分类头来对接自己的下游任务camembert.register_classification_head(new_task, num_classes3) logprobs camembert.predict(new_task, tokens)register_classification_head(name, num_classes, inner_dim)会创建RobertaClassificationHead输入维度取encoder_embed_dim激活函数默认使用pooler_activation_fnpredict(head, tokens, return_logitsFalse)先取最后一层特征再过对应分类头默认返回log_softmax后的对数概率见 hub_interface.py由于from_pretrained设置了load_checkpoint_headsTrue如果下载的是带微调头的 checkpoint例如 RoBERTa 系列的 MNLI 模型加载后可直接predict推理无需重新注册。关于在 GLUE、自定义分类任务等场景下的完整微调流程可参考同家族的 edgelm/examples/roberta/README.glue.md、edgelm/examples/roberta/README.custom_classification.md 等文档CamemBERT 的用法与之一致。八、进阶能力一览RobertaHubInterface还提供了两个进阶方法详见 hub_interface.pyextract_features_aligned_to_words(sentence)hub_interface.py默认输出是每个 BPE 子词一个向量该方法借助 spaCy 将特征重对齐到词级对词内各 BPE 特征做加权平均并挂载到Token.vector属性上适合做词级表示抽取或可视化disambiguate_pronoun(sentence)hub_interface.py代词消歧Winograd Schema Challenge需要加载在 WSC 任务上微调过的 checkpoint用法示例见 edgelm/examples/roberta/README.md。GPU 使用与 RoBERTa 相同加载后调用camembert.cuda()即可将模型与预测迁移到 GPUHub 接口内部会通过注册的_float_tensor缓冲区自动判断设备见 hub_interface.pyextract_features、predict、fill_mask等调用无需手动搬运张量。九、引用如果使用了 CamemBERT请引用其论文inproceedings{martin2020camembert, title{CamemBERT: a Tasty French Language Model}, author{Martin, Louis and Muller, Benjamin and Su{\a}rez, Pedro Javier Ortiz and Dupont, Yoann and Romary, Laurent and de la Clergerie, {\E}ric Villemonte and Seddah, Djam{\e} and Sagot, Beno{\^\i}t}, booktitle{Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics}, year{2020} }十、总结CamemBERT 展示了RoBERTa 架构 法语语料 sentencepiece 分词这一组合的落地范式。在本仓库 edgelm 的 fairseq 实现中它由 model_camembert.py 以极小的增量代码复用 RoBERTa 的全部能力并通过 hubconf.py 的注册表机制对 torch.hub 开箱即用。无论是直接做掩码填充演示还是提取多层特征用于下游任务微调上述代码路径都是可复制、可运行的完整参考。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →