【BERT系列】——一文看懂BERT

BERT,即双向Transformer编码器,由谷歌于2018年推出,革新了自然语言处理领域。模型采用多层双向Transformer提取上下文信息,通过预训练和微调两阶段,解决NLP任务。核心任务包括遮掩语言模型(MLM)和下句预测(NSP),输入包含特殊标记和三种嵌入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是BERT

BERT 全名 Bidirection Encoder Representations from Transformers,是谷歌于2018年发布的NLP领域的 预训练模型,一经发布就霸屏了NLP领域的相关新闻,味道是真香。果不其然,2019年出现了很多BERT相关的论文和模型,本文旨在对 BERT 模型进行一个总结。

首先从名字就可以看出,BERT模型是使用双向Transformer模型的EncoderLayer进行特征提取(BERT模型中没有 Decoder 部分)。Transformer模型作为目前NLP领域最牛的特征提取器其原理不需要多做介绍,其中的EncoderLayer-block结构如下图所示:
在这里插入图片描述
BERT的模型图如下所示:
在这里插入图片描述
从图中可以看出BERTGPTELMO三个模型的区别:

  1. BERT VS GPTBERT模型使用多层双向Transformer作为特征提取器,同时提取上下文信息GPT模型使用多层单向Transformer作为特征提取器,用于提取上文信息。相较于GPTBERT多使用了下文信息
  2. BERT VS ELMOBERT模型使用多层双向Transformer作为特征提取器,同时提取上下文信息ELMO模型使用两对双层双向LSTM分别提取上文信息下文信息,然后将提取的信息进行拼接后使用。相较于ELMOBERT使用了更强大的Transformer作为特征提取器,且BERT是同时提取上下文信息,相较于ELMO分别提取上文信息和下文信息,更加的“浑然天成”。

2. 两个阶段

在这里插入图片描述
使用BERT模型解决NLP任务需要分为两个阶段:

  1. pre-train:用大量的无监督文本通过自监督训练的方式进行训练,把文本中包含的语言知识(包括:词法、语法、语义等特征)以参数的形式编码到Transformer-encoderlayer中。预训练模型学习到的是文本的通用知识,不依托于某一项NLP任务;
  2. fine-tune阶段:使用预训练的模型,在特定的任务中进行微调,得到用于解决该任务的定制模型;

3. 两个任务

3.1 MLM

遮掩语言模型(Masked Language Modeling)。标准的语言模型(LM)是从左到右或者从右到左进行训练,但是BERT模型多层双向进行训练,因此BERT在训练时随机mask部分token,然后只预测那些被屏蔽的token。MLM学习的是单词与单词之间的关系。

但是MLM存在两个问题:

  1. pre-train阶段与fine-tune阶段不匹配,因为在fine-tune期间不会有[mask] token
  2. 每个batch只预测15%的token,因此需要训练更多的训练步骤才能收敛;

因此:

  1. 防止模型过度关注特定位置或masked token,模型随机遮掩15%的单词;
  2. mask token并不总被[mask]取代,在针对特定任务fine-tune时不需要进行[mask]标注;

具体做法:

  1. 随机选择15%的token;
  2. 选中的token并不总是被[mask] 取代,其中的80%的单词被[mask]取代;
  3. 其余10%的单词被其他随机单词取代;
  4. 剩余的10%的单词保持不变;

3.2 NSP

下句预测(Next Sentence Prediction),该任务是一个二分类任务,预测第二句sentence是不是第一句sentence的下一句。NSP学习的是句子与句子之间的关系。

具体做法:

  1. 训练数据中的50%,第二句是真实的下句;
  2. 另外50%,第二句是语料库中的随机句子;
  3. 前50%的标签是isNext,后50%的标签是notNext

4. 模型输入

在这里插入图片描述
如上图所示,BERT模型有两个特殊的token:CLS (用于分类任务)、 SEP(用于断句),以及三个embedding

  1. token embedding:输入的文本经过tokenization之后,将CLS插入tokenization结果的开头,SEP插入到tokenization结果的结尾。然后进行token embedding look up。shape为:[seq_length, embedding_dims]。流程如下图所示:
    在这里插入图片描述
  2. segment embedding:在NSP任务中,用于区分第一句和第二句。segment embedding中只有 01两个值,第一句所有的token(包括cls和紧随第一句的sep)的segment embedding的值为0,第二句所有的token(包括紧随第二句的sep)的segment embdding的值为1。shape为:[seq_length, embedding_dims]。流程如下图所示:
    在这里插入图片描述
  3. position embedding:因Transformer-encoderlayer无法捕获文本的位置信息,而文本的位置信息又非常重要(“你欠我500万” 和 “我欠你500万”的感觉肯定不一样),因此需要额外把位置信息输入到模型中。BERT的位置信息是通过sin函数cos函数算出来的,shape为:[seq_length, embedding_dims]。该部分参数在训练时不参与更新,。

BERT的输入为:token_embedding + segment_embedding + position_embedding

5. BERT为什么效果好

BERT模型用大量的无监督文本通过自监督训练的方式进行训练,把文本中包含的语言知识(包括:词法、语法、语义等特征)以参数的形式编码到Transformer-encoderlayer中。有研究表明:

  1. 低层的Transformers-EncoderLayer:主要学习了编码表层的特征;
  2. 中层的Transformers-EncoderLayer:主要学习了编码句法的特征;
  3. 高层的Transformers-EncoderLayer:主要学习了编码语义的特征;
### BERT中的Class Token定义与用法 在自然语言处理领域,特别是基于Transformer架构的预训练模型中,`class token` 是一种特殊标记,通常用于表示整个输入序列的聚合特征。尽管BERT本身并未显式引入 `class token` 的概念[^3],但在后续的一些改进模型(如RoBERTa、DistilBERT以及视觉-语言模型)中,这一机制被广泛采用。 #### Class Token的作用 `class token` 主要用于分类任务,在这些场景下,它作为输入序列的一部分嵌入到模型的第一位置上。通过这种方式,模型可以学习将该token映射至特定类别标签的空间。具体而言: 1. **初始化阶段**: 在构建输入张量时,会在原始文本对应的tokens之前加入 `[CLS]` token。此操作使得每一组输入都具备统一结构以便于下游任务建模。 2. **前向传播过程中**: 当执行自注意力计算时,其他所有position上的hidden states都会影响到 `[CLS]` 所处的位置状态更新;因此最终得到的结果能够反映整句话的信息浓缩版本。 3. **输出层设计方面**, 对应于 `[CLS]` 这一维度提取出来的vector会被送入全连接网络或者softmax函数当中去预测目标类别的概率分布情况. 值得注意的是虽然上述描述适用于许多现代transformer-based NLP systems, 但是严格来说,Bert原版并没有真正意义上的"class token", 而是以 "[CLS]" symbol 来承担相似功能.[^1] ```python import torch from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "Replace me by any text you'd like." encoded_input = tokenizer(text, return_tensors='pt', truncation=True, padding=True) with torch.no_grad(): outputs = model(**encoded_input) cls_output = outputs.last_hidden_state[:, 0, :] # Extract [CLS] embedding print(cls_output.shape) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值