bert算法原理
一、背景
介绍bert之前我们先来看一下NLP发展的几个阶段。
如果说把人类完全攻克人工智能(AI)比作上天的话,那么现在阶段人类已经爬上天梯的第二个阶梯了。再次之前人类总共进行的三个阶段。
- 第一阶段(地上爬):统计机器学习为代表
- 第二阶段(爬上第一阶梯):word2vec为代表
- 第三阶段(爬上第二阶梯):bert为代表
NLP发展历程请参考我的博客:
二、架构
1.架构图
我们只用到了transformer的Encode模块
2.参数
BERT-Base, Chinese: Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
bert可以分为两个阶段,预训练和微调
三、预训练
参看预训练的输入数据:
预训练使用无监督的方式来训练语言模型。预训练通过两种方法来找目标函数。
1.Task #1: Masked Language Model
说bert是双向语言模型体现在这里了。
- (1)目标函数:
$P(w_i|w_1,...,w_{i-1},w_{i+1},...,w_n)$ 求最大概率
注意:
1.ELMO模型用的是LSTM的目标函数:
$P(w_i|w_1,...,w_{i-1})+P(w_i|w_{i+1},...,w_n)$ 求最大概率
2.GPT模型用的是Transformer的目标函数:
???????
通过构建上面的目标函数训练模型,使用transformer的encode模型抽取特征,来训练模型,在pre-train阶段参数已经训练完成了。仅通过预训练模型我们可以得到两种文本向量:
(1).一句话中每个字的embedding,张量(L,D)
(2).一句话的embedding,张量(D)
- (2)遮蔽算法
在BERT的实验中,15%的WordPiece Token会被随机Mask掉,我们只预测被屏蔽的单词。
缺点:尽管这可以使我们获得双向的预训练模型,但缺点是我们在预训练和微调之间造成了不一致,因为 [MASK] 词符不会在微调期间出现。
解决缺点: 为了缓解这种情况,实际上我们并不总是用 [MASK] 词符替换“被屏蔽”的单词。
(1)80% 的时间用 [MASK] 词符
(2)10% 的时间用随机词符
(3)10% 的时间维持第 i 词符不变。
例如:
80%:my dog is hairy -> my dog is [mask]
10%:my dog is hairy -> my dog is apple
10%:my dog is hairy -> my dog is hairy
如何理解解决缺点的办法呢??引入噪音让泛化能力更强吗
1.为什么 15% 的 Token 不完全 MASK?如果只有 MASK,这个预训练模型是有偏置的,也就是只能学到一种方式,用上下文去预测一个词,这导致 fine-tune 丢失一部分信息。
2.加上 10% 的随机词和 10% 的真实值是让模型知道,每个词都有意义,除了要学习上下文信息,还需要提防每个词,因为每个词都不一定是对的,对于 Bert 来说,每个词都需要很好的理解和预测。
2.Task #2 :Next Sentence Prediction
任务是判断句子B是否是句子A的下文。如果是的话输出’IsNext‘,否则输出’NotNext‘。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]符号中。
3.损失函数
BERT 官方代码中的分类模型的损失函数叫做负对数似然函数(且是最小化,等价于最大化对数似然函数),数学表达式是:
其实和交叉熵损失是一样的:即最小化单标签多分类问题的交叉熵损失,其实就是对一个类别变量的广义伯努利分布作极大似然估计。
证明参考:https://zhuanlan.zhihu.com/p/51099880
note:在源码里面 Task1和Task2,分别构建了两个函数来求损失,然后用两个损失的和来当做损失。
3. 输入表示
如图4,这三个词嵌入特征是:
- 1.字嵌入[6]:token Embedding 在中文中会拆分成一个一个字;
- 2.位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。
- 3.句子嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。
在代码级别
4.特征抽取方法:transformer-encoder
四、微调
因为使用pre-training训练的模型参数,是面向所有的领域,词向量的粒度还是不够细,所以使用fine-tune来面向特定领域微调。如果把参数更新比作下山的话,pre-tune已经从珠穆朗玛峰下到了山底,fine-tune是在山底下的小土丘在进行下山。
根据微调的结果应用下游任务,微调可以应用两类任务到下游:
1.序列(句子)级任务
主要是获取句子级别embedding。
可以应用到:分类、判断句子是否相似
2.词符级任务
主要是获取字、词级别embedding
可以应用到:NER、问答
以下为bert技术点
三、bert的优缺点
1.缺点
- bert论文预训练、xlnet论文提到了bert的第一个缺点:
尽管这可以使我们获得双向的预训练模型,但缺点是我们在预训练和微调之间造成了不一致,因为 [MASK] 词符不会在微调期间出现。 为了缓解这种情况,实际上我们并不总是用 [MASK] 词符替换“被屏蔽”的单词。 训练数据生成器随机选择词符位置的 15% 进行预测。 如果选择第 i 个词符,我们替换这第 i 个词符为(1)80% 的时间用 [MASK] 词符(2)10% 的时间用随机词符(3)10% 的时间维持第 i 词符不变。 - xlnet论文摘要提到第二个缺点:
BERT 忽视了掩码位置之间的依赖关系 - bert没有考虑词性,句法分析
参考文献:
1.https://yiyibooks.cn/nlp/bert/main.html
2.https://zhuanlan.zhihu.com/p/268881814