BERT入门讲解(内附源码)【自然语言处理NLP-100例】

·  阅读 1882

大家好!我是K同学啊

前段时间在自然语言处理的项目,遇到了一些问题也有一些收获,把其中与BERT相关的内容整理出来分享给大家,希望可以帮到你。

如果你对自然语言处理方面的文章有兴趣的话,或许📚《自然语言处理NLP-实例教程》有你想要的

如果你想找一些毕设相关的实战案例做参考,你可以在📚《深度学习100例》找到带源码和数据的实战案例,深度学习小白建议先从📚《小白入门深度学习》这个专栏学起哦!

本文已加入 🚀 Python AI 计划,从一个Python小白到一个AI大神,你所需要的所有知识都在我的 GitHub:github.com/kzbkzb/Pyth… 了。

我的环境:

  • 语言环境:Python3
  • 深度学习环境:TensorFlow2.4.1
  • 编译器:Jupyter Lab

BERT是什么?

BERT(Bidirectional Encoder Representation from Transformers)是 Google 在2018年提出的一种NLP 模型,成为最近几年 NLP 领域最具有突破性的一项技术。BERT模型主要采用的是最原始 Transformer 的 Encoder 结构。

  • 论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

  • 结构:采用了 Transformer 的 Encoder 结构,但是模型结构比 Transformer 要深。Transformer Encoder 包含 6 个 Encoder block,BERT-base 模型包含 12 个 Encoder block,BERT-large 包含 24 个 Encoder block。

  • 训练:训练主要分为两个阶段:预训练阶段和 Fine-tuning 阶段。预训练阶段与 Word2Vec,ELMo 等类似,通过在大型数据集上进行训练得到预训练模型(预训练模型我们直接调用即可)。Fine-tuning 阶段主要是后续迁移到其他任务重需要进行的微调(这是我们要完成的部分),例如文本分类,词性标注,问答系统等,BERT 无需调整结构就可以在不同的任务上进行微调。

  • 预训练任务1:BERT 的第一个预训练任务是 Masked LM,在句子中随机遮盖一部分单词,然后同时利用上下文的信息预测遮盖的单词,这样可以更好地根据全文理解单词的意思。Masked LM 是 BERT 的重点。

  • 预训练任务2:BERT 的第二个预训练任务是 Next Sentence Prediction (NSP),下一句预测任务,这个任务主要是让模型能够更好地理解句子间的关系。

上图是 BERT 的结构图,左侧的图表示了预训练的过程,右边的图是对于具体任务的微调过程。

关于以上描述,在初学阶段了解有那么回事即可。花最少的时间学习最重要的东西,提高效率。

BERT 的输入

BERT 的输入可以包含一个句子对 (句子 A 和句子 B),也可以是单个句子。同时 BERT 增加了一些有特殊作用的标志位:

  • [CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
  • [SEP] 标志用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 后面增加 [SEP] 标志。
  • [MASK] 标志用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词是什么。

通过实例来了解具体是怎么一回事吧(当我们输入文本后,会在内部发生什么变化)

假定给了两个句子 "my dog is cute""he likes palying" 作为输入样本

BERT 会转为 "[CLS] my dog is cute [SEP] he likes play ##ing [SEP]"。BERT 里面用了 WordPiece 方法,会将单词拆成子词单元 (SubWord),有的词会被拆出词根,例如 "palying" 会变成 "paly""##ing"

BERT 得到要输入的句子后,要将句子的单词转成 Embedding,Embedding 用 E 表示。与 Transformer 不同,BERT 的输入 Embedding 由三个部分相加得到:Token Embedding,Segment Embedding,Position Embedding。

  • Token Embedding:单词的 Embedding,例如 [CLS] dog 等,通过训练学习得到。
  • Segment Embedding:用于区分每一个单词属于句子 A 还是句子 B,如果只输入一个句子就只使用 EA,通过训练学习得到。
  • Position Embedding:编码单词出现的位置,与 Transformer 使用固定的公式计算不同,BERT 的 Position Embedding 也是通过学习得到的,在 BERT 中,假设句子最长为 512。

对应的代码如下:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')

test_sentence = 'my dog is cute'
max_length    = 20

bert_input = tokenizer.encode_plus(test_sentence, 
                      add_special_tokens = True,      # add [CLS], [SEP]
                      max_length = max_length,        # max length of the text that can go to BERT
                      pad_to_max_length = True,       # add [PAD] tokens
                      return_attention_mask = True,   # add attention mask to not focus on pad tokens
                      truncation=True)
bert_input
复制代码
{'input_ids': [101, 8422, 13030, 8310, 12322, 8154, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
复制代码
  • input_ids:是一连串 token 在字典中的对应id,形状为(batch_size, sequence_length);
  • token_type_ids:是token对应句子的id,形状为(batch_size, sequence_length);
  • attention_mask:各元素的值为0或1,避免在padding的token上计算attention,形状为(batch_size, sequence_length)。

BERT 预训练

BERT 输入句子中单词的 Embedding 之后,通过预训练方式训练模型,预训练有两个任务。

第一个是 Masked LM,在句子中随机用 [MASK] 替换一部分单词,然后将句子传入 BERT 中编码每一个单词的信息,最终用 [MASK] 的编码信息 T[MASK] 预测该位置的正确单词。

第二个是下一句预测,将句子 A 和 B 输入 BERT,预测 B 是否 A 的下一句,使用 [CLS] 的编码信息 C 进行预测。

BERT 预训练的过程可以用下图来表示。

BERT 用于具体 NLP 任务

预训练得到的 BERT 模型可以在后续用于具体 NLP 任务的时候进行微调 (Fine-tuning 阶段),BERT 模型可以适用于多种不同的 NLP 任务,如下图所示。

  • 一对句子的分类任务:例如自然语言推断 (MNLI),句子语义等价判断 (QQP) 等,如上图 (a) 所示,需要将两个句子传入 BERT,然后使用 [CLS] 的输出值 C 进行句子对分类。

  • 单个句子分类任务:例如句子情感分析 (SST-2),判断句子语法是否可以接受 (CoLA) 等,如上图 (b) 所示,只需要输入一个句子,无需使用 [SEP] 标志,然后也是用 [CLS] 的输出值 C 进行分类。

  • 问答任务:如 SQuAD v1.1 数据集,样本是语句对 (Question, Paragraph),Question 表示问题,Paragraph 是一段来自 Wikipedia 的文本,Paragraph 包含了问题的答案。而训练的目标是在 Paragraph 找出答案的起始位置 (Start,End)。如上图 (c) 所示,将 Question 和 Paragraph 传入 BERT,然后 BERT 根据 Paragraph 所有单词的输出预测 Start 和 End 的位置。

  • 单个句子标注任务:例如命名实体识别 (NER),输入单个句子,然后根据 BERT 对于每个单词的输出 T 预测这个单词的类别,是属于 Person,Organization,Location,Miscellaneous 还是 Other (非命名实体)。

下一篇文章将讲解BERT在文本分类中的应用

参考文章


最后再送大家一本,帮助大家拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是谷歌和阿里的大佬写的,对于算法薄弱或者需要提高的同学都十分受用(提取码:9go2 ):

谷歌和阿里大佬的Leetcode刷题笔记

以及我整理的7K+本开源电子书,总有一本可以帮到你 💖(提取码:4eg0)

7K+本开源电子书

分类:
人工智能
标签:
分类:
人工智能
标签:
收藏成功!
已添加到「」, 点击更改