现代AI大模型核心技术:BERT-从浅入深,小白也能看懂,附实例演示!
在它之前,AI在阅读文本。 在它之后,AI在理解世界。BERT是AI史上的一个里程碑。它首次让机器能够双向、深度地理解语境,改变了自然语言处理领域的格局。它就像AI世界的罗塞塔石碑,被解锁后,便释放出无穷潜力,成为了今天几乎所有高级语言智能应用(从GPT到各类智能助手)的基石和灵感之源。认识BERT,就是认识现代AI的起点。
简介:
在它之前,AI在阅读文本。 在它之后,AI在理解世界。
BERT是AI史上的一个里程碑。它首次让机器能够双向、深度地理解语境,改变了自然语言处理领域的格局。
它就像AI世界的罗塞塔石碑,被解锁后,便释放出无穷潜力,成为了今天几乎所有高级语言智能应用(从GPT到各类智能助手)的基石和灵感之源。
认识BERT,就是认识现代AI的起点。
第一部分:BERT是什么?为什么它如此重要?
在BERT出现之前,我们教机器理解语言,就像让一个学生在阅读时只能“从左到右”一个词一个词地看,或者顶多再“从右到左”看一遍。比如句子:“今天天气很好,我们去公园散步。”
传统的单向模型 (RNN/LSTM)
读到“公园”这个词时,它主要依赖于前面的“今天天气很好,我们去”。它无法直接“看到”后面的“散步”。
浅层双向模型 (Bi-LSTM)
虽然可以同时从左到右和从右到左看,但两个方向的信息是独立处理,最后简单地拼接在一起,融合得不够深入。
这两种方式都限制了机器对语言的深层理解。人类在阅读时,是会综合上下文来理解一个词的含义的。例如,“苹果”这个词,你看到“我吃了一个苹果”和“苹果发布了新手机”,会立刻知道它们是不同的意思。
BERT的核心突破,就在于它实现了真正的“双向”理解
它在阅读一个句子时,能够同时、且深入地融合一个词左右两边的所有上下文信息。这使得机器对词语的理解不再是孤立的、静态的,而是动态的、依赖于语境的。
为什么重要?因为它极大地提升了机器在各种NLP任务上的表现,比如:
情感分析:更准确地判断一段话是正面还是负面情绪。
问答系统:更精确地从文章中找到问题的答案。
文本分类:更有效地对新闻、邮件进行分类。
命名实体识别:更准确地找出文本中的人名、地名、机构名。
BERT的出现,确立了 “预训练-微调”(Pre-training and Fine-tuning) 的新范式,成为了后续众多NLP模型的基础。
第二部分:BERT的核心架构 - Transformer的编码器
BERT的名字里就包含了它的核心技术:Transformer。但BERT并没有使用完整的Transformer架构(包含编码器和解码器),而是只用了其编码器(Encoder) 的部分。
可以把Transformer的编码器想象成一个超级强大的“文本理解引擎”。当我们输入一个句子,这个引擎会通过一个叫做 “自注意力机制”(Self-Attention) 的核心部件来处理它。
自注意力机制(Self-Attention)
这是理解BERT的关键。它的作用是:在处理一个词的时候,计算句子中所有其他词对这个词的“重要性”或“关联度”,然后根据这个重要性来更新这个词的表示。
举个例子,句子:动物已经无法越过河流,因为它很累
这里的它指的是什么?动物还是河流?人类一看就知道是动物。自注意力机制就能让模型在处理它的时候,赋予动物更高的“注意力分数”,而给河流较低的分数。通过这种方式,模型就能学习到它在这个语境下的确切指代。
BERT模型就是将多个这样的编码器堆叠起来(BERT-Base有12层,BERT-Large有24层)。每一层都会对输入的文本进行一次更深层次的“加工”,让模型对句子的理解越来越深刻。
第三部分:BERT如何学习?- 革命性的预训练任务
BERT的强大之处,主要来自于它在海量文本数据(比如整个维基百科)上的“预训练”过程。这个过程不依赖人工标注,而是通过两个巧妙的任务来让模型自己学习语言知识。
任务一:掩码语言模型 (Masked Language Model, MLM)
这是BERT实现“双向”理解的秘诀。既然要同时看左右两边的信息,那就不能像传统模型那样预测下一个词。于是,BERT的作者想出了一个类似“完形填空”的方法:
1.随机遮盖 (Mask):随机将句子中15%的词用一个特殊的 [MASK]
标记替换掉。
原始句子:今天天气很好,我们去公园散步。
遮盖后:今天天气很好,我们去 [MASK] 散步。
2.预测被遮盖的词:模型的任务就是根据句子中所有未被遮盖的词(即“今天天气很好,我们去...散步”),来预测 [MASK]
处最可能是什么词。在这个例子里,模型应该要能预测出“公园”。
通过这个任务,模型被迫去学习词语之间的搭配、语法结构以及深层的语义关系。因为它必须综合利用 [MASK]
左右两边的所有信息,才能做出最准确的预测。
一个小细节
为了避免预训练和实际使用(微调)时的不匹配(因为实际任务中没有 [MASK]
标记),BERT在遮盖时还做了一点小花样:
80% 的情况下,用 [MASK]
替换。
10% 的情况下,用一个随机的词替换(比如把“公园”换成“汽车”)。
10% 的情况下,保持原词不变。
这样做是为了让模型不仅仅学会预测 [MASK]
,而是学会判断任何一个给定的词在当前位置是否合理。
任务二:下一句预测 (Next Sentence Prediction, NSP)
为了让BERT理解句子与句子之间的关系(这在问答、对话等任务中至关重要),它还进行了第二个预训练任务。
1.构造句子对:从文本语料中选取两个句子A和B。
2.判断关系:有一半的概率,B是A的真实下一句(标签为 IsNext
);另一半的概率,B是语料中随机选取的另一个句子(标签为 NotNext
)。
3.模型预测:BERT需要判断这两个句子是不是连续的。
示例:
正例 (IsNext):
句子A: 今天天气很好。
句子B: 我们去公园散步吧。
负例 (NotNext):
句子A: 今天天气很好。
句子B: 苹果公司发布了新款手机。
通过这个任务,BERT学会了理解文本的连贯性、逻辑关系和主题。
第四部分:如何使用BERT?- 微调 (Fine-tuning)
经过海量数据预训练后,我们就得到了一个通用的“语言理解大师”——预训练好的BERT模型。但是,它还不懂任何具体的任务。
微调,就是在这个通用模型的基础上,用我们自己特定任务的、少量的标注数据,对模型进行“二次训练”,让它适应我们的任务。
这个过程非常高效,因为BERT已经具备了强大的语言理解能力,我们只需要在它的顶层接上一个简单的分类器,然后用少量数据告诉它任务目标即可。
微调示例:
情感分析:
1.输入一句话,比如“这部电影太棒了!”。
2.在BERT模型的输出结果上,接一个简单的分类层(比如判断“正面”或“负面”)。
3.用带有情感标签的数据进行训练,模型会很快学会如何利用它强大的语义理解能力来判断情感。
问答系统:
1.同时输入“问题”和“包含答案的文章”。
2.训练BERT输出两个位置:答案在文章中的“开始位置”和“结束位置”。
3.微调范式极大地降低了训练一个高性能NLP模型的门槛。你不再需要从零开始用海量数据训练,而是可以站在BERT这个巨人的肩膀上。
第五部分:BERT的输入表示
为了让BERT能处理上述任务,它的输入需要一种特殊的格式,由三种“嵌入”(Embedding)相加而成:
词嵌入 (Token Embeddings):将每个词或子词(WordPiece)映射成一个固定维度的向量。
分段嵌入 (Segment Embeddings):用于区分两个句子,比如在NSP任务中,属于句子A的词和属于句子B的词会有不同的分段嵌入。
位置嵌入 (Position Embeddings):由于Transformer本身不包含顺序信息,所以需要明确地加入位置信息,告诉模型每个词在句子中的位置。
这三者相加,就构成了BERT最终的输入表示,其中包含了词义、句子归属和位置顺序的全部信息。
数据实例演示:
第一步:输入准备与词元化 (Tokenization)
计算机不认识汉字,只认识数字。所以第一步就是要把句子转换成BERT能理解的格式。
添加特殊标记:BERT需要知道句子的开始和结束。它会用两个特殊的标记来做到这一点:
[CLS] (Classification):放在句子的最前面。这个位置的最终输出向量,将被用作整个句子的聚合表示,非常适合用于分类任务。
[SEP] (Separator):放在句子的末尾。如果输入是两个句子(比如问答任务),它会用来分隔这两个句子。
所以,我们的句子变成了:[CLS] 我 爱 北 京 [SEP]
词元化 (Tokenization):BERT有一个预先训练好的“词汇表”(Vocabulary)。它会把输入序列中的每个字/词都查找词汇表,转换成对应的ID。对于中文,通常是基于“字”的。
假设在BERT的词汇表中(实际ID非常大,这里我们用小数字示意):
[CLS] -> 101
我 -> 2769
爱 -> 4231
北 -> 1266
京 -> 7741
[SEP] -> 102
现在,我们的输入就变成了一串数字(Token IDs):[101, 2769, 4231, 1266, 7741, 102]
第二步:生成输入嵌入 (Input Embeddings)
光有ID还不够,BERT需要将每个ID转换成一个包含丰富语义信息的向量(Vector)。这个初始向量由三种不同的嵌入信息相加而成。假设BERT-Base的向量维度是768。
1.词嵌入 (Token Embeddings):模型有一个巨大的嵌入矩阵。根据上面的ID,每个词元都会被映射成一个768维的向量。
E_我 = EmbeddingLookup(ID=2769) -> [0.1, 0.5, ..., -0.2] (一个768维的向量)
E_爱 = EmbeddingLookup(ID=4231) -> [0.3, -0.1, ..., 0.9]
...以此类推,每个词元都有一个初始的词嵌入向量。
2.分段嵌入 (Segment Embeddings):用来区分不同的句子。因为我们只有一个句子,所以所有词元都属于第一个句子。它们会获得相同的分段嵌入向量 E_A
E_A -> [0.2, 0.2, ..., 0.2] (一个代表“句子A”的768维向量)
3.位置嵌入 (Position Embeddings):为了让模型知道词的顺序,每个位置(从0开始)都会有一个独特的位置嵌入向量。
E_pos0 -> [0.0, 0.1, ..., 0.4] (给 [CLS] 的)
E_pos1 -> [0.1, 0.1, ..., 0.5] (给 我 的)
E_pos2 -> [0.2, 0.3, ..., 0.5] (给 爱 的)
...以此类推。
最终的输入向量 = 词嵌入 + 分段嵌入 + 位置嵌入。 例如,词“爱”的最终输入向量就是 E_爱 + E_A + E_pos2
。
至此,我们已经为每个输入词元([CLS]
, 我
, 爱
, 北
, 京
, [SEP]
)都准备好了一个768维的、融合了词义、句子归属和位置信息的初始向量。
第三步:通过Transformer编码器层 (The Core)
这是BERT处理信息的核心环节。我们准备好的6个向量会一起进入第一层编码器。
我们聚焦于“爱”这个词的向量,看看它在第一层会发生什么:
1.进入自注意力层 (Self-Attention):
“爱”的输入向量会被线性变换,生成三个新的向量:查询 (Query)Q_爱
,键 (Key)K_爱
,值 (Value)V_爱
。
句子中的其他所有词(包括[CLS]
, 我
, 北
, 京
, [SEP]
)也会做同样的操作,生成它们各自的Q, K, V向量。
计算注意力分数
BERT会用Q_爱
去和所有词的 K
向量(K_[CLS],
K_我,
K_爱,
K_北,
K_京,
K_[SEP]
)进行点积计算。这个计算结果代表了“为了更好地理解‘爱’,我们应该花多少注意力在其他每个词上”。
比如,模型可能会发现“我”和“北京”与“爱”的关系更密切,所以Q_爱
和 K_我
、K_京
的计算结果会比较高。
加权求和
将这些分数进行归一化(Softmax)后,作为权重,去加权求和所有词的 V
向量。
输出向量_爱
= score_CLS * V_[CLS]
+score_我 * V_我
+ score_爱 * V_爱
+ ...
经过这一步,生成的 输出向量_爱
不再是“爱”自己孤立的表示了,它已经融合了整个句子中所有词的信息。它现在是一个在“我爱北京”这个语境下的“爱”。
2.进入前馈神经网络 (Feed-Forward Network):
自注意力层输出的 输出向量_爱
会再经过一个全连接的前馈神经网络,进行一次非线性变换,进一步提炼信息。
这个过程(自注意力 -> 前馈网络)对所有6个词元向量是同时、独立地进行的。
堆叠12层: 第一层的输出(6个新的、包含了初步上下文信息的向量)会成为第二层的输入。第二层会重复同样的过程,但这次它是在一个已经融合过一次上下文信息的基础上,进行更深层次的融合。
就像一个侦探团队(12层)在分析案情(句子)。第一层侦探可能只是发现“爱”是一个动词。第二层侦探结合上下文,发现是“我”发出的动作。第三层发现动作的对象是“北京”。...到了第12层,模型对每个词的理解已经非常深刻和全面了。
第四步:获取最终输出
当6个向量走完所有12层编码器后,我们就得到了最终的输出。
C_final
:
[CLS]
位置的最终向量。它聚合了整个句子的信息,可以被看作是“我爱北京”这句话的“句向量”。如果要做情感分析(这句话是积极的),我们就会把这个768维的C_final
向量送入一个简单的分类器。
T_我_final
, T_爱_final
, T_北_final
, T_京_final
:对应每个词元的最终向量。这些向量是“动态的”,富含了深度的上下文信息。
比如这里的 T_京_final
向量,它不仅包含了“京”字本身的意思,还包含了它在这里是“北京”的一部分、并且是“被爱”的对象等信息。
如果任务是命名实体识别,我们就可以利用这些向量来判断“北”和“京”共同构成了一个“地名”实体。
总结实例流程
1.输入: 我爱北京
2.预处理: [CLS] 我 爱 北 京 [SEP]
-> [101, 2769, 4231, 1266, 7741, 102]
3.嵌入: 每个ID生成一个融合了词、位置、分段信息的初始向量。
4.编码: 6个初始向量并行进入12层Transformer编码器。在每一层,通过自注意力机制,每个词的向量都会与句子中所有其他词的向量进行信息交互和融合,然后通过前馈网络提炼。
5.输出: 得到6个富含深度上下文信息的最终向量。[CLS]
位置的向量代表整个句子,其他位置的向量代表各自词元在当前语境下的精确含义。
希望这个实例能帮助大家更好地理解BERT的内部工作机制
当然,BERT也有它的局限性,比如计算量大、对长文本处理不便等。但它无疑是NLP发展史上的一座丰碑。理解了BERT,你就掌握了现代NLP技术的核心钥匙。
更多推荐
所有评论(0)