BERT 模型#
BERT(Bidirectional Encoder Representations from Transformers)由 Google 在 2018 年提出,是自然语言处理领域的一个里程碑。它通过引入新的预训练任务,成功地利用 Transformer 的编码器构建了第一个真正意义上的深度双向语言表示模型。BERT 的模型架构非常纯粹:它就是一堆堆叠起来的 Transformer 编码器。没有解码器部分。BERT-base 版本堆叠了 12 层,BERT-large 版本则堆叠了 24 层。它的目标不是生成文本,而是为输入的文本生成一个富含上下文信息的、高质量的向量表示。
与之前主要依赖单向(从左到右)信息流的语言模型(如 GPT)不同,BERT 的核心创新在于它能够同时融合一个词左右两边的上下文信息来生成该词的表示,这对于需要深入理解句子语义的任务至关重要。BERT 证明了深度双向预训练在语言理解任务上的巨大潜力。BERT 及其变体(如 RoBERTa, ALBERT)在各种 NLP 基准测试中刷新了记录,并成为许多现代 NLP 应用的基石。它被认为是编码器路径模型的代表,尤其擅长自然语言理解相关的任务。
预训练任务#
为了实现双向性,BERT 不能使用传统的语言模型任务(即预测下一个词),因为那样会间接地泄露信息。因此,研究者设计了两个巧妙的无监督预训练任务。
1. 掩码语言模型 (Masked Language Model, MLM)#
这是 BERT 实现双向预训练的关键。其过程如下:
随机掩盖:在输入句子中,随机选择 15% 的词元(token)进行掩盖。
进行预测:模型的目标是仅根据未被掩盖的上下文,预测出被掩盖的原始词元。由于模型可以同时看到被掩盖词左右两边的所有词,因此它被迫学习一种深度的、双向的语境表示。
为了减少预训练和微调阶段之间的不匹配(因为 [MASK] 标记在微调阶段不会出现),被选中的 15% 的词元会按照以下规则处理:
80% 的概率:用
[MASK]标记替换该词(例如,my dog is hairy->my dog is [MASK])。10% 的概率:用一个随机的词替换该词(例如,
my dog is hairy->my dog is apple)。10% 的概率:保持原词不变(例如,
my dog is hairy->my dog is hairy)。
2. 下一句预测 (Next Sentence Prediction, NSP)#
为了让模型能够理解句子之间的关系(这对于问答、自然语言推断等任务很重要),BERT 还使用了“下一句预测”任务。
构建句对:在预训练时,为模型提供成对的句子 A 和 B。
判断关系:其中 50% 的情况下,句子 B 是句子 A 在原始文本中的真实下一句(标签为
IsNext);另外 50% 的情况下,句子 B 是从语料库中随机抽取的一个句子(标签为NotNext)。进行预测:模型需要预测这两个句子是否是连续的。
为了完成这个任务,BERT 的输入表示也经过特殊设计:
[CLS] 句子 A [SEP] 句子 B [SEP]
[CLS]:位于句子开头的一个特殊标记。BERT 使用这个标记对应的最终隐藏状态向量来进行整个序列的分类任务(如 NSP 任务或情感分类)。[SEP]:用于分隔两个句子的特殊标记。
微调 (Fine-Tuning)#
BERT 的使用分为两阶段:
预训练 (Pre-training):在巨大的无标签文本语料(如维基百科)上执行 MLM 和 NSP 任务。这个过程计算量巨大,通常由大公司完成。
微调 (Fine-tuning):用户下载预训练好的 BERT 模型,并在其上添加一个小的、任务特定的分类层。然后,在自己的有标签数据集上对整个模型进行端到端的训练。由于模型已经具备了丰富的语言知识,微调过程通常非常快速且高效。
BERT 的实际应用#
BERT 强大的语义理解能力使其成为一个出色的“特征提取器”。通过在 BERT 之上增加一个简单的输出层,就可以将其应用于各种下游的自然语言理解(NLU)任务中,并且通常只需要少量的标注数据进行微调即可达到很好的效果。
1. 文本分类/情感分析#
这是最常见的应用之一。
任务: 判断一段文本的类别。例如,将新闻文章分为“体育”、“科技”或“财经”;或将用户评论判定为“正面”、“负面”或“中性”。
工作原理: 将整个输入文本喂给 BERT,然后取用第一个特殊字符
[CLS]的输出向量。这个向量被认为是整个文本的聚合表示,可以把它送入一个简单的分类器(如全连接层 + Softmax)来进行分类。
2. 命名实体识别 (Named Entity Recognition, NER)#
任务: 从文本中找出并分类命名实体,如人名、地名、组织机构名、日期等。
工作原理: 将文本喂给 BERT 后,利用每一个单词对应的输出向量。在每个向量之上增加一个分类层,来预测该单词是属于哪个实体类型(例如,B-PER 表示人名的开始,I-LOC 表示地名的中间,O 表示非实体)。
3. 抽取式问答#
任务: 给定一个问题和一段背景文章,模型需要从文章中抽取出连续的一段文本作为答案。
工作原理: 将问题和背景文章拼接后一同输入 BERT。模型学习预测两个东西:答案在文章中的“起始词元 (start token)”和“结束词元 (end token)”。通过这种方式,模型可以直接“框选”出答案。
4. 语义相似度匹配 / 语义搜索#
任务: 判断两个句子的意思是否相近,或根据一个查询从大量文档中找出语义最相关的文档。
工作原理: 分别将两个句子或(查询与文档)输入 BERT,提取它们的
[CLS]向量或其他形式的句子向量。然后,通过计算这两个向量之间的余弦相似度 (Cosine Similarity) 来判断它们的语义接近程度。分数越高,代表意思越相近。