预训练语言模型核心原理与 BERT 实战
引言:为什么需要预训练?
传统的自然语言处理模型(如 LSTM+ 词嵌入)往往面临两个核心痛点:一是依赖大量标注数据才能训练出高性能模型,二是对语言上下文的理解能力有限。预训练语言模型的出现有效解决了这些问题。
其核心思路是先在大规模无标注文本语料上进行预训练,学习通用的语言知识和语义表示,再针对特定任务进行微调。这种'预训练 + 微调'的范式,极大降低了对标注数据的依赖,同时显著提升了模型在各类 NLP 任务上的性能。
发展历程简述
预训练语言模型的发展大致经历了三个阶段:
- 单向语言模型阶段:以 ELMo 为代表,通过双向 LSTM 分别学习正向和反向的语言表示,再拼接得到词向量。但本质还是基于 RNN 的特征提取器,无法捕捉深层的上下文依赖。
- 自回归语言模型阶段:以 GPT 为代表,采用单向 Transformer 解码器架构,通过自回归的方式预测下一个词。但单向模型只能利用前文信息,无法利用后文信息,在理解类任务上表现受限。
- 双向语言模型阶段:以 BERT 为代表,采用双向 Transformer 编码器架构,通过掩码语言模型任务,让模型同时学习前文和后文的信息,真正实现了双向上下文理解。
核心流程:预训练与微调
应用流程分为两个关键步骤:
- 预训练阶段:在大规模无标注语料(如维基百科、书籍语料)上,通过设计特定的预训练任务(如掩码语言模型、下一句预测),让模型学习语言的语法、语义和常识知识,得到通用的语言表示模型。
- 微调阶段:针对具体的 NLP 任务(如文本分类、命名实体识别、机器翻译),在预训练模型的基础上,添加少量任务相关的输出层,使用少量标注数据进行训练,得到任务专用模型。
⚠️ 注意:预训练阶段通常需要海量的计算资源和数据,一般由大厂或研究机构完成。普通开发者只需下载预训练好的模型权重,直接进行微调即可。
BERT 模型架构详解
BERT 的全称是Bidirectional Encoder Representations from Transformers,即基于 Transformer 编码器的双向表示模型。它的核心架构是多层双向 Transformer 编码器,没有解码器部分。
BERT 的模型结构有两个版本,满足不同的算力需求:
- BERT-Base:12 层 Transformer 编码器,12 个注意力头,隐藏层维度 768,参数量约 110M。
- BERT-Large:24 层 Transformer 编码器,16 个注意力头,隐藏层维度 1024,参数量约 340M。
BERT 的输入表示是三种嵌入的求和:
- 词嵌入(Token Embedding):表示每个词的基础语义信息。
- 分段嵌入(Segment Embedding):用于区分两个句子(如判断句子是否为上下文关系),取值为 0 或 1。
- 位置嵌入(Position Embedding):和 Transformer 一样,用于注入词的位置信息,因为 Transformer 本身是无序的。
import tensorflow as tf
from transformers import BertConfig, BertModel
config = BertConfig.from_pretrained()
bert_model = BertModel.from_pretrained()
input_ids = tf.random.randint(, config.vocab_size, (, ))
attention_mask = tf.ones((, ))
token_type_ids = tf.zeros((, ))
outputs = bert_model(
input_ids=input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids
)
last_hidden_state = outputs.last_hidden_state
pooler_output = outputs.pooler_output
(, last_hidden_state.shape)
(, pooler_output.shape)


