BERT基本原理

1 前言

1.1 NLP

在大量没有标号的数据集上训练模型比有标号的好。

1.2 两种任务

句子层面的任务,建模句子之间的关系或句子情绪的识别
词元层面,识别实体名词或答案

1.3 预训练语言特征模型

有两种(预训练时都是单向的)
基于特征:ELMo,双向RNN
对每一个下游任务构造相关的神经网络,将预训练好的特征和输入一起放入模型。即原模型不能直接用于下游任务
基于微调:GPT
直接将预训练好的模型对下游任务进行微调,微调预训练好的参数。模型是从左到右浏览,不是双向的

1.4 一词多义问题

如果单向预测则下面两个句子至少有一个会出错
We went to river bank. I went to the bank to make a deposit.

  • 由于 word2vec 采用静态方式,
    • 第一阶段:训练结束后,每个单词 只对应 一个固定的词向量;
    • 第二阶段:在使用时, 该词向量 不会 根据上下文场景 而变化
  • 因此 word2vec 解决不了 多义词 问题

2 BERT

=ELMo双向+GPTtransformer

2.1 两个任务

词元层面
双向,带掩码的语言模型MLM(masked language model)。相当于将句子中的某些词挖掉,用模型来预测这些空(完形填空),这允许看空左右的信息(双向)。
句子层面
NSP(next sentence predict),下一个句子的预测。判断两个句子在原文中是不是相邻。

2.2 结构

由12个Transformer encoder组成,没有decoder
多层双向Transformer encoder
L:Transformer块的个数
H:MLP隐藏层的大小
A:多头自注意力的头个数

参数个数计算

2.2.1 输入

  • 一个序列是单句或一对句子(QA),区别于Transformer的输入是序列对,因为BERT没有解码器。原文使用的是WordPiece,大小30000的词典,因为英文中词的词根可能更常用,所以会切开留下一部分作为词典。
  • 序列的第一个token是CLS,可以得到与句子中的所有词的关系(attention),也就是聚合表征。**其中,CLS是用来做二值化NSP任务的,保存的信息不足以直接用于推测语义信息。**同时,CLS用来做分类任务,非分类任务将被忽略。
  • 句子中间用SEP分开。给第一句的每一个标记添加一个学习到的句子 A 的嵌入,给第二句的每个标记添加一个学习到的句子 B 的嵌入;对于单句输入,只使用句子A嵌入
    BERT基本原理_第1张图片
  • Token embedding 字向量: BERT模型通过查询字向量表将文本中的每个字转换为一维向量,作为模型输入;
  • Segment embedding 文本向量: 该向量的取值在模型训练过程中自动学习,用于刻画文本的全局语义信息,并与单字/词的语义信息相融合;
  • Position embedding 位置向量:由于出现在文本不同位置的字/词所携带的语义信息存在差异(比如:“我爱你”和“你爱我”),因此,BERT模型对不同位置的字/词分别附加一个不同的向量以作区分

输入序列首先变成词向量,然后添加句子标识的嵌入,然后添加位置信息。这些都是学习得来。position embedding没有用正余弦函数,而是随机初始化
BERT基本原理_第2张图片

2.2.2 Transformer

2.3 步骤

预训练:
没有标号的数据上训练
微调:
用预训练的参数和有标号的数据,不同的下游任务用不同的BERT,初始化参数为预训练参数。

2.3.1 预训练

MLM+NSP
无标注的语料,无监督

2.3.1.1 MLM

普通的自注意力模块允许一个位置看到它左右侧单词的信息,使得 每个词 都能 通过多层 上下文 “看到自己”(作为mask);

无监督的目标函数

AR:autoregressive,自回归模型,只考虑单侧信息,(GPT)
AE:autoencoding,自编码模型,从损坏的输入数据中预测重建原始数据,可以利用上下文信息,(bert)

以“我爱吃饭”为例:
AR:P(我爱吃饭)=P(我)P(爱|我)P(吃|我爱)P(饭|我爱吃)
AE:mask后:我爱[mask]饭 → \rightarrow P(我爱吃饭|我爱mask饭)=P(mask=吃|我爱饭)

AE的缺点:
mask后:我爱[mask][mask],此时P(我爱吃饭|我爱maskmask)=P(吃|我爱)P(饭|我爱),即认为两个mask是相互独立的,事实上’吃’'饭’是有相关性的

bert的做法

随机挑选15%的单词进行mask,其中10%替换成其他,10%不变,80%替换成mask。论文中的理由是微调中没有mask,但为什么这么做还不清楚。然后预测那些mask。
BERT基本原理_第3张图片

2.3.1.2 NSP

理由:
很多重要的下游任务,例如问答(QA)和自然语言推理(NLI),都是基于对两个文本句子间关系的理解,而这种关系并非通过语言建模直接获得

原文样本
正样本:从语料库中取出两个连续段落
负样本:从不同文档中随机选择两句

缺点:主题预测(不同文档)和连贯性预测(连续两句)合并为一个单项任务

BERT基本原理_第4张图片

2.3.2 微调

获取谷歌中文BERT(已经预训练的)
基于任务数据进行微调
更详细的是
pretrain-> domain transfer-> task transfer-> fine-tune
如微博文本情感分析:
domain对应微博文本,task对应微博情感文本

不同任务的使用:
BERT基本原理_第5张图片

一些trick:
使用动态mask,对于每个epoch时mask不是同一个单词
n-gram mask
learning rate(adam):5e-5,3e-5尽量小,避免灾难性遗忘
batch size: 16,32
number of epochs: 3, 4
weighted decay修改后的adam,使用warmup搭配线性衰减
数据增强,自蒸馏,外部知识融入

3 BERT的优缺点

优点:

  • 语料大,能覆盖更多的信息。
  • 双向模型(完形填空),有利于多义词的预测
  • 预训练完对下游任务进行微调即可,无需重新生成新模型。
  • 同时完成两个任务的联合学习,既能得到token级别信息,又可以得到句子级别的语义信息
    缺点:
  • 主题预测(不同文档)和连贯性预测(连续两句)合并为一个单项任务(在2.3.1.2中阐述)
  • 训练过程中因为每个batch_size中的数据只有15%参与预测,模型收敛较慢

你可能感兴趣的:(深度学习,人工智能,nlp)