本文的目的是为了帮助大家面试Bert,会结合我的面试经历以及看法去讲解Bert,并非完整的技术细致讲解,介意请移步。
深入浅出】深入浅出Bert(附面试题)
- 网络结构
- Pre-Training
- Fine-Tuning
- 输入编码
- 词向量编码
- 句子编码
- 位置编码
- 面试题
提到Bert网络模型,首先离不开的应该是Transformer网络?由此引出第一个问题
-
Bert和Transformer有什么不同?
结构不同
- Bert网络网络结构是一个双向的Transformer网络,Bert的双向结构使得每个单词能够同时看到句子前后的单词,极大的增强了上下文理解的效果。
- Bert则仅使用了Transformer的编码器部分,专注于双向上下文的语言理解任务
任务不同
。与Transformer网络原用于翻译的任务不同,Bert一开始只做了两种任务。- 完形填空(随机Masked一些单词,用于推理缺失的单词)
- 句子推理(判断前后两个句子是否有关联关系)
-
Bert和同时期的GPT2(后面会讲)有什么不同?
-
结构不同
。Gpt2采用采用单向Transformer解码器架构。 -
场景不同
。双向上下文理解能力让BERT在自然语言理解(NLU)任务中表现出色,适用于需要上下文理解和信息提取的任务,例如问答、文本分类、命名实体识别等。
自回归文本生成架构的单向性使GPT-2擅长自然语言生成。
-
网络结构
观察这个网络结构,可以发现Bert模型的训练是通过预训练和微调两部分组成的。这两部分分别是什么?
Pre-Training
-
Pre-Training阶段的作用?
预训练阶段是一个无监督任务。在Bert模型中的预训练阶段中,有15%的词语被换成了[MASK]。
在这15%中,还有80%的内容被替换成[MASK],有10%是随机换一个词,10%是不换的(原文真这么写的,有点烧脑是吧,别急,等我慢慢讲)
替换成[MASK]比较好理解,就是为了通过前后文关联来对[MASK]的内容进行预测进而更好的帮助模型理解语义信息。
**随机换成其他的token其实是为了增加模型的鲁棒性。**你想想,大家使用GPT的时候每次提问的内容都是完全正确的吗?会不会经常出现一些错别字什么的?
Fine-Tuning
-
Fine-Tuning是做什么的?
Bert预训练好后,他没有具体的任务。而现实生活中我们需要它去做具体的任务,比如文本分类、问答系统、情感分析等,因此需要微调bert使得模型在任务上表现得更好。
微调会保留BERT的预训练权重,但在任务数据上继续训练,并加上适应该任务的头部层(output head),这样Bert可以适用于特定的任务。
-
Fine-Tuning具体是怎么做的?
- 分类任务:将Bert的
[CLS]
标记输出嵌入向量接一个全连接层,用于句子分类 - 句子关系判断任务:类似分类任务,用
[CLS]
嵌入接全连接层输出句对关系 - 序列标注任务:如命名实体识别(NER),Bert会针对每个token的输出都连接一个分类层,预测每个token的标签。
- 分类任务:将Bert的
不知道大家看着一段内容的时候有没有注意到有的任务是[CLS]
而有的任务用的是每个token的输出
?
-
CLS
标签在预测过程中是做什么的?或者说使用Bert做句子分类任务和实体识别任务有什么不同?高频问题Bert在预训练时,
[CLS]
标记被设计为整个句子或句对的表示,它可以在微调过程中学习到句子的整体信息。因此CLS
代表的是整个句子的全局向量,将这个向量用于分类即可。在Bert中,每个token的输出代表其对应的上下文信息,能够更精细地反映局部语义,从而更适合逐个token的预测。使用每个token的输出,模型可以为每个词单独生成标签或确定其在句中的位置。
输入编码
词向量编码
用于判断有没有被【mask】
吃饭了【mask】?–》吃饭 了 【mask】–》[cls] 1 1 0 [seq]相当于三个token
句子编码
区分句子a 和 b**,用在两个句子中间
这里不分词了啊,麻烦。
今天天气怎么样?很晴朗。
[cls] 0 0 0 0 0 0 0 0 [seq] 1 1 1 [seq]
位置编码
在最初训练的时候,Bert随机赋值位置编码。Bert使用可训练的位置嵌入,即位置编码和token的embedding一样,作为模型参数的一部分,在训练过程中被更新。用于表示每个token在序列中的位置,定义每个位置的向量,这些位置向量是可学习的。
面试题
好啦,终于到这里了,看看你学废了吗?
-
Bert分为什么任务?作用是什么?
-
在参与损失函数的计算时,参与计算的Token有哪些?是全部的15%吗?
只有被真正mask的才会参与计算。15%的80%
-
在实现损失函数的时候,怎么确保那些填充(padding)的token不参与损失计算?
计算损失时,将每个token中的损失值与mask位相乘,确保填充位损失变成0。
-
Bert的优缺点有什么?
-
Bert的三个Embedding为什么直接相加?
BERT的三个Embedding(Token Embedding、Position Embedding和Segment Embedding)直接相加是因为它们分别表示输入信息的不同方面,合并后形成了每个token的整体嵌入表示。