简介
BERT(Bidirectional Encoder Representations from Transformers,来自 Transformers 的双向编码器表示)是由 Google 开发的一种革命性自然语言处理 (NLP) 模型。它彻底改变了语言理解任务的格局,使机器能够深入理解语言的上下文和细微差别。本文将带您从 BERT 的基础知识出发,逐步深入到高级概念,包含详细的原理解释、代码示例及最佳实践。
BERT 简介
什么是 BERT?
在快速发展的自然语言处理领域,BERT 是一项突破性的创新。它不仅仅是一个缩写词,更代表了机器理解语言方式的范式转变。BERT 基于 Transformer 架构,通过双向上下文建模,使模型能够同时利用单词左侧和右侧的上下文信息,从而生成更丰富的语义表示。
为什么 BERT 很重要?
传统的语言模型通常采用单向或自回归的方式处理文本(例如从左到右),这导致它们在理解某些语境时存在局限。例如,句子'她小提琴拉得很漂亮'中,传统模型可能难以准确捕捉'小提琴'对整句含义的影响。BERT 则能理解单词之间的双向依赖关系,显著提高了语言理解的准确性和深度。
BERT 的工作原理
BERT 的核心是强大的 Transformer 神经网络架构,采用了自注意力(Self-Attention)机制。该机制允许模型根据每个单词的前后文来动态衡量其重要性。这种上下文感知能力使得 BERT 能够生成上下文相关的词嵌入(Contextualized Word Embeddings)。简单来说,BERT 会反复'阅读'句子,深入分析每个单词在不同语境下的具体作用。
例如,在句子'主唱将领导乐队'中,BERT 能轻松区分第一个'领导'是名词(指职位),而第二个'领导'是动词(指动作),展示了其在消除歧义方面的强大能力。
BERT 预处理文本
在 BERT 能够对文本进行处理之前,必须将其转换为模型可理解的格式。本章将探讨标记化、输入格式和掩码语言模型目标等关键步骤。
标记化:将文本分解为有意义的块
BERT 使用 WordPiece 标记化算法。它将单词拆分为更小的子词单元(Subword Tokens),例如将'running'拆分为'run'和'##ning'。这种方法有助于处理生僻词和未登录词(OOV),确保模型不会因遇到未知字符而失效。
示例: 原文:'ChatGPT 令人着迷。' WordPiece 标记:["Chat", "##G", "##PT", "is", "fascinating", "."]
输入格式:为 BERT 提供上下文
为了有效利用上下文,我们需要按照特定格式格式化令牌。我们在序列开头添加特殊标记 [CLS](代表分类任务,其最终输出向量可用于句子级分类),并在句子之间添加 [SEP](代表分隔符)。此外,我们还会分配分段嵌入(Segment Embeddings)来指示哪些标记属于哪个句子(用于句子对任务)。
示例: 原文:'ChatGPT 令人着迷。' 格式化标记:["[CLS]", "Chat", "##G", "##PT", "is", "fascinating", ".", "[SEP]"]
掩码语言模型 (MLM) 目标:教授 BERT 上下文
BERT 的核心训练目标是预测被屏蔽的单词。在训练过程中,句子中约 15% 的单词会被替换为 [MASK] 标记,BERT 需要学习根据上下文预测这些缺失的单词。这迫使模型掌握单词前后的相互关系,从而实现深度的双向理解。
示例: 原句:'猫在垫子上。' 蒙面句子:'[MASK] 在垫子上。'
from transformers import BertTokenizer, BertForMaskedLM
import torch
# 加载预训练分词器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForMaskedLM.from_pretrained('bert-base-uncased')
text = "The cat sat on the [MASK]."
inputs = tokenizer(text, return_tensors=, padding=, truncation=)
outputs = model(**inputs, labels=inputs[])
loss = outputs.loss
()


