十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Transformers 中的 BERT 模型:双向编码器架构、预训练目标与下游任务实战指南

Transformers 中的 BERT 模型:双向编码器架构、预训练目标与下游任务实战指南 Transformers 中的 BERT 模型双向编码器架构、预训练目标与下游任务实战指南【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersBERTBidirectional Encoder Representations from Transformers是自然语言处理领域里程碑式的预训练语言模型其核心思想是通过随机遮蔽输入 Token 并预测被遮蔽内容让模型同时利用左侧与右侧上下文进行双向理解。本文以本仓库Hugging Face Transformers的官方 BERT 文档为主体结合src/transformers/models/bert/下的源码实现与tests/models/bert/测试用例系统讲解 BERT 的模型原理、预训练目标、配置参数、分词器以及从填词到问答等六大下游任务的实战用法。BERT 模型概览从论文到 Transformers 实现BERT 由 Jacob Devlin、Ming-Wei Chang、Kenton Lee 与 Kristina Toutanova 在论文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding中提出。它是一个在无标注文本上进行预训练的双向 Transformer 编码器训练目标包含两项掩码语言建模Masked Language Modeling, MLM随机遮蔽句中的部分 Token让模型结合左右两侧上下文预测被遮蔽的 Token下一句预测Next Sentence Prediction, NSP判断输入的两句文本在语料中是否连续相邻。论文摘要中的关键结论是BERT 在所有层上同时对左右上下文进行联合条件建模从而从无标注文本中学习到深层的双向表示预训练完成后只需在输出层追加一个额外的任务头head即可微调出面向问答、语言推理等广泛任务的最强模型且几乎不需要任务相关的架构改动。原始 BERT 在 11 项 NLP 任务上刷新了当时的最优结果例如将 GLUE 得分提升至 80.5%绝对提升 7.7 个百分点、MultiNLI 准确率 86.7%、SQuAD v1.1 F1 达 93.2、SQuAD v2.0 F1 达 83.1。本仓库中 BERT 的完整实现集中在 src/transformers/models/bert/ 目录包含 configuration_bert.py配置类、modeling_bert.pyPyTorch 模型实现共约 1390 行、tokenization_bert.py 与 tokenization_bert_legacy.py分词器以及三个用于把原始 TensorFlow 检查点转换为 PyTorch 格式的转换脚本。BERT 使用要点Usage Tips文档针对 BERT 的工程使用给出了两条核心建议它们直接源于模型的架构与训练方式1. 输入应在右侧填充BERT 使用绝对位置嵌入absolute position embeddings位置信息由嵌入表按绝对位置索引得到。因此当批内样本长度不一致而需要 padding 时应统一在右侧补齐[PAD]保证每个 Token 的绝对位置编号在其真实上下文中保持不变。这一点与使用相对位置编码的模型如 T5、GPT 系习惯不同实践中若采用左侧填充可能引入位置错位并轻微损害效果。源码佐证在 modeling_bert.py 的BertEmbeddings中position_embeddings是一个大小为max_position_embeddings × hidden_size的普通nn.Embedding前向时直接按position_ids取绝对位置向量并加到词嵌入与段嵌入之上。2. 输入破坏策略80% / 10% / 10% 随机掩码预训练期间输入会通过随机掩码进行破坏。具体地通常对每个序列中15%的 Token 做如下处理80% 概率替换为特殊的[MASK]Token10% 概率替换为一个与被遮蔽 Token 不同的随机 Token10% 概率保持原 Token 不变。这种「不完全遮蔽」策略是为了缓解预训练只见[MASK]与微调/推理不见[MASK]之间的分布不一致问题模型必须学会依赖上下文推断被遮蔽位置的真实 Token而不是简单地把[MASK]映射回原词。3. 下一句预测NSP的输入构造BERT 的第二个训练目标是句子级任务。输入由句子 A 与句子 B 组成中间以分隔 Token[SEP]隔开50% 概率句子 B 是语料中紧跟在句子 A 之后的真实下一句标记为 IsNext50% 概率句子 B 是从语料中随机抽取的无关句子标记为 NotNext。模型需要输出二分类结果判断两句是否连续。该目标帮助模型学习句子间的关系为问答、自然语言推理等句子对任务打下基础。在 modeling_bert.py 的BertForNextSentencePrediction中可以看到其头部BertOnlyNSPHead直接作用在BertModel输出的pooled_output上输出形状为(batch_size, 2)的二分类 logitslabels 取 0IsNext或 1NotNext。4. 能力边界适合 NLU不适合文本生成由于 BERT 使用 MLM 与 NSP 目标训练它在预测掩码 Token、抽取式问答等自然语言理解NLU任务上高效且通用但并非为文本生成而设计。若需要生成能力可考虑BertLMHeadModel将 BERT 作为解码器使用时需在配置中设置is_decoderTrue或直接选用 GPT 系自回归模型。快速上手三种方式预测 [MASK]官方英文文档给出了通过Pipeline与AutoModel两种方式预测[MASK]的示例下面完整呈现并补充命令行方式模型统一使用google-bert/bert-base-uncased。方式一使用 Pipeline一行代码from transformers import pipeline pipeline pipeline( taskfill-mask, modelgoogle-bert/bert-base-uncased, device0 ) pipeline(Plants create [MASK] through a process known as photosynthesis.)device0表示使用第一块 GPUCPU 环境可省略该参数。fill-mask是 Transformers 内置的「掩码填充」流水线其内部会调用BertForMaskedLM完成预测。方式二使用 AutoModel 手动推理import torch from transformers import AutoModelForMaskedLM, AutoTokenizer tokenizer AutoTokenizer.from_pretrained( google-bert/bert-base-uncased, ) model AutoModelForMaskedLM.from_pretrained( google-bert/bert-base-uncased, device_mapauto, attn_implementationsdpa ) inputs tokenizer(Plants create [MASK] through a process known as photosynthesis., return_tensorspt).to(model.device) with torch.no_grad(): outputs model(**inputs) predictions outputs.logits masked_index torch.where(inputs[input_ids] tokenizer.mask_token_id)[1] predicted_token_id predictions[0, masked_index].argmax(dim-1) predicted_token tokenizer.decode(predicted_token_id) print(fThe predicted token is: {predicted_token})这段代码的关键步骤用AutoTokenizer将句子编码为input_ids、token_type_ids、attention_mask等张量用AutoModelForMaskedLM加载模型attn_implementationsdpa指定使用 PyTorch 的 Scaled Dot-Product Attention 实现以提升效率device_mapauto自动分配设备通过tokenizer.mask_token_id定位[MASK]在序列中的位置在logits中取该位置概率最大的 Token id再用tokenizer.decode还原为文本。方式三命令行预测echo Plants create [MASK] through a process known as photosynthesis. | \ transformers-cli fill-mask --model google-bert/bert-base-uncased架构深度解析从源码看 BERT 的内部结构BertConfig核心超参数一览configuration_bert.py 中的BertConfig定义了 BERT 的全部结构超参数其默认值与google-bert/bert-base-uncased检查点一致参数默认值含义vocab_size30522词表大小uncased 模型hidden_size768隐层维度num_hidden_layers12Transformer 编码器层数num_attention_heads12每层注意力头数intermediate_size3072前馈网络中间层维度通常为 4×hidden_sizehidden_actgelu前馈层激活函数hidden_dropout_prob0.1隐层 Dropout 概率attention_probs_dropout_prob0.1注意力权重 Dropout 概率max_position_embeddings512最大序列长度绝对位置嵌入表大小type_vocab_size2段token_type嵌入数量对应句子 A/Binitializer_range0.02权重初始化标准差layer_norm_eps1e-12LayerNorm 的 epsilonpad_token_id0padding Token 的 idclassifier_dropoutNone分类头 Dropout缺省时回退到hidden_dropout_probis_decoder/add_cross_attentionFalse是否作为解码器 / 是否添加交叉注意力BertConfig.model_type bert使AutoModel等自动类能够识别该配置。初始化一个随机权重的 BERT 模型只需from transformers import BertConfig, BertModel # 初始化一个 bert-base-uncased 风格的配置 configuration BertConfig() # 从配置初始化模型随机权重 model BertModel(configuration) # 访问模型配置 configuration model.configBertEmbeddings词嵌入 段嵌入 绝对位置嵌入BertEmbeddingsmodeling_bert.py将三类嵌入相加后经过 LayerNorm 与 Dropoutword_embeddingsnn.Embedding(vocab_size, hidden_size, padding_idxpad_token_id)词嵌入position_embeddingsnn.Embedding(max_position_embeddings, hidden_size)绝对位置嵌入token_type_embeddingsnn.Embedding(type_vocab_size, hidden_size)区分句子 A/B 的段嵌入。前向过程为embeddings word token_type position随后做 LayerNorm 和 Dropout。position_ids与token_type_ids以非持久化的 Buffer 形式注册便于在未显式传入时自动生成。BertModel双向编码器 池化层BertModelmodeling_bert.py由BertEmbeddings、BertEncoder多层BertLayer与可选的BertPooler组成对应文档中的BertModelAPIBertEncoder由config.num_hidden_layers个BertLayer堆叠每个BertLayer内部是「多头自注意力 前馈网络」的残差结构注意力实现通过ALL_ATTENTION_FUNCTIONS注册表支持 eager 与 SDPA 等不同后端对应文档中attn_implementationsdpa的用法BertPooler取[CLS]位置的隐状态经过线性层与 Tanh 激活输出(batch_size, hidden_size)的句子级表示供分类任务使用forward支持input_ids、attention_mask、token_type_ids、position_ids、inputs_embeds、past_key_values等参数可返回BaseModelOutputWithPoolingAndCrossAttentions。由于BertModel可通过is_decoderTrue与add_cross_attentionTrue配置为带交叉注意力的解码器它既能作为纯编码器使用也能嵌入 Seq2Seq 架构源码 docstring 中明确说明了这一行为。六大任务头一套主干多种输出所有任务模型共享BertModel主干仅在顶部挂载不同头部均在 modeling_bert.py 中实现模型类任务头部结构输出BertForPreTraining预训练MLMNSPMLM 头 NSP 头BertForPreTrainingOutputloss、prediction_logits、seq_relationship_logitsBertLMHeadModel因果语言建模LM 头 交叉注意力CausalLMOutputWithCrossAttentionsBertForMaskedLM掩码语言建模BertOnlyMLMHeadMaskedLMOutputlabels 中-100位置被忽略BertForNextSentencePrediction下一句预测BertOnlyNSPHeadNextSentencePredictorOutputlabels 取 0/1BertForSequenceClassification文本分类/回归pooled 输出上的线性层SequenceClassifierOutputnum_labels1时计算 MSE 回归损失BertForMultipleChoice多项选择每个选项共享编码器MultipleChoiceModelOutputBertForTokenClassification序列标注NER 等每个 Token 位置上的线性层TokenClassifierOutputBertForQuestionAnswering抽取式问答起止位置打分头QuestionAnsweringModelOutputBertForPreTrainingOutput是 BERT 专属的输出数据结构modeling_bert.py包含总损失MLM 损失与 NSP 损失之和、掩码预测 logits 与句子关系 logits以及可选的hidden_states与attentions。分词器BertTokenizer 家族BERT 使用 WordPiece 子词分词。仓库中提供了三代分词器BertTokenizertokenization_bert.py原生 Python 实现基于vocab_file词表与可选的do_lower_case是否转小写、tokenize_chinese_chars是否按字切分中文、strip_accents是否去除重音符号等参数提供get_special_tokens_mask与save_vocabulary两个文档化方法BertTokenizerLegacytokenization_bert_legacy.py旧版 Python 分词器保留 BasicTokenizer小写化、标点切分、中文按字切分、去除重音与 WordpieceTokenizer 两阶段流程BertTokenizerFast基于 Tokenizers 库的 Rust 加速实现。特殊 Token 约定[UNK]未知词、[SEP]句间分隔、[PAD]填充、[CLS]句首分类 Token、[MASK]掩码 Token。get_special_tokens_mask用于在已有特殊 Token 的序列上标记哪些位置属于特殊 Token方便训练时排除它们参与损失计算。下游任务与官方资源导航将 BERT 应用到具体任务时可参考本仓库 examples/pytorch/ 下的官方示例脚本均支持BertFor*系列模型与任务指南文本分类BertForSequenceClassification示例脚本 examples/pytorch/text-classification任务指南 docs/source/en/tasks/sequence_classification序列标注/NERBertForTokenClassification示例脚本 examples/pytorch/token-classification任务指南 docs/source/en/tasks/token_classification训练时若希望把词级标签传播到所有 WordPiece 子词需要自定义标签对齐逻辑掩码语言建模BertForMaskedLM示例脚本 examples/pytorch/language-modeling支持 BERT/RoBERTa/DistilBERT 的 MLM 训练任务指南 docs/source/en/tasks/masked_language_modeling抽取式问答BertForQuestionAnswering示例脚本 examples/pytorch/question-answering任务指南 docs/source/en/tasks/question_answering多项选择BertForMultipleChoice示例脚本 examples/pytorch/multiple-choice任务指南 docs/source/en/tasks/multiple_choice文本生成可将 BERT 用作 EncoderDecoder 的编码器进行 warm-start 微调如 BERT2BERT 摘要相关思路可参考 examples/pytorch/summarization。以上任务类在测试中均有覆盖tests/models/bert/test_modeling_bert.py中的BertModelTesttests/models/bert/test_modeling_bert.py同时继承了ModelTesterMixin、GenerationTesterMixin与PipelineTesterMixin并针对fill-mask、分类、多项选择、下一句预测、预训练、因果 LM 等逐个编写了test_for_*用例分词器行为由 tests/models/bert/test_tokenization_bert.py 与 tests/models/bert/test_tokenization_bert_legacy.py 验证。实战路线图围绕本文内容推荐的学习与落地路径理解原理先通过本文「模型概览」与「使用要点」掌握 MLM、NSP 与 80/10/10 掩码策略跑通推理用 Pipeline 或 AutoModel 完成一次[MASK]预测验证双向上下文理解能力深入架构对照 modeling_bert.py 与 configuration_bert.py 阅读嵌入层、编码器层与各类任务头理解参数如何影响模型结构微调下游任务选择 examples/pytorch/ 中与业务最接近的任务脚本分类、NER、问答等替换数据集与模型名即可开始微调迁移旧权重若持有原始 TensorFlow 检查点可使用仓库提供的 convert_bert_original_tf_checkpoint_to_pytorch.py 等转换脚本迁移到 PyTorch 格式。BERT 的「双向编码 简单任务头」范式深刻影响了后续 RoBERTa、DistilBERT、ALBERT 等大量模型理解其架构与使用方式是掌握整个 Transformers 生态的重要起点。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表