第12章 BERT:Transformer Encoder 如何成为语言理解模型
本章目标
学完本章,你不需要记住 BERT 的所有实现细节,但应该能够回答:
- BERT 为什么出现?
- BERT 到底解决了什么问题?
- BERT 和 Transformer Encoder 是什么关系?
- BERT 到底能做什么?
- 为什么 BERT 能够理解上下文?
- BERT 和 GPT 有什么不同?
- BERT 与 Embedding、RAG 又有什么关系?
本章只建立完整的 BERT 认知框架。MLM、CLS、Sentence-BERT、Embedding、预训练和源码实现等深入内容,将在后续专门的 BERT 专题中展开。
12.1 为什么需要 BERT?
在学习 BERT 之前,先思考一个问题:
为什么我们不能直接把一个词转换成一个固定向量?
例如:
bank在:
I deposited money in the bank.中表示"银行"。
而:
I sat on the river bank.中表示"河岸"。
如果我们使用传统的静态词向量:
bank → 一个固定向量那么无论bank出现在哪个句子中,它的基础表示都相同。
但人类理解语言时,会根据上下文判断一个词的具体含义。
因此我们真正希望得到的是:
Token + 上下文 ↓ 上下文相关的向量即:
同一个 Token 在不同上下文中,可以得到不同的表示\text{同一个 Token 在不同上下文中,可以得到不同的表示}同一个 Token 在不同上下文中,可以得到不同的表示
这就是 BERT 要解决的核心问题之一。
12.2 BERT 是什么?
BERT 的全称是:
Bidirectional Encoder Representations from Transformers
即:
基于 Transformer 的双向编码器表示模型。
BERT 由 Google 于 2018 年提出。
理解 BERT 最重要的一句话是:
BERT 的核心不是直接生成文本,而是把输入文本编码成包含上下文语义的向量表示。
可以把 BERT 看成一个文本理解器 / 文本编码器。
其基本过程是:
BERT 的输出通常不是一个答案,而是一组 Hidden States:
H=[h1,h2,…,hn]H = [h_1, h_2, \ldots, h_n]H=[h1,h2,…,hn]
其中每一个hih_ihi都表示一个 Token 在当前上下文中的语义表示。
12.3 BERT 到底能做什么?
这是理解 BERT 最重要的问题。
BERT 本身更像一个 NLP Backbone,而不是一个最终业务应用。
它负责:理解上下文,产生高质量的语言表示。然后根据具体任务,在 BERT 后面连接不同的任务头。
12.3.1 文本分类
例如:
这家餐厅非常好吃,服务也很好。可以: