参考https://www.cnblogs.com/bubblebeee/p/15517950.html
Bert
-
BERT 可以用于问答系统,情感分析,垃圾邮件过滤,命名实体识别,文档聚类等任务中,作为这些任务的基础设施,语言模型
-
使用了双向Transformer作为算法的主要框架,但只利用了 Transformer 的 encoder 部分。因为BERT 的目标是生成语言模型,所以只需要 encoder 机制。
-
使用了Mask Language Model(MLM)和 Next Sentence Prediction(NSP) 的多任务训练目标
-
输入表示包含了3个组成部分: 词嵌入张量: word embeddings;语句分块张量: segmentation embeddings;位置编码张量: position embeddings。最终的embedding向量是将上述的3个向量直接做加和的结果。
Bert中的Transformer结构
Bert 只使用了 transformer 的 encoder 模块,原论文中,作者分别用了 12 层和 24 层 Transformer的Encoder 组装了两套 Bert 模型,分别是:
其中,层(即 Transformer Encoder 块)的数量为 L,隐藏层的维度是 H,自注意头的数量是 A。在所有例子中, 我们将前馈/过滤器(即 Transformer Encoder 端的 feed-forward 层) 的维度设置为 4H,即当 H=768 时是 3072;当 H=1024 时是 4096.
注意:与 transformer 本身的 encoder 端相比, Bert 的 Transformer Encoder 端输入的向量中多了Segent Embedding 向量。
Bert 模型的输入和输出
Bert 模型的主要输入是文本中各个字/词(token)的原始词向量,该向量可以是随机初始化的也可以利用 Word2Vector 等算法进行预训练作为初始值; 输出是文本中各个字/词(token)融合了全文语义信息后的向量表示:
1.Transformer中(多数NLP任务中)的输入都是有2个句子的。但是这里BERT只有Encoder,就把两个句子拼起来
2.position embeddings:Transformer中是用sin和cos来做位置编码的,而这里是先随机初始化,然后再让模型去学习这个位置编码
3.Segment Embeddings:Segment Embeddings 层只有两种向量表示。前一个向量是把O赋给第一个句子中的各个token,后一个向量是把1赋给第二个句子中的各个token。如果输入仅仅只有一个句子,那么它的 segment embedding 就是全0。
训练过程 【两个预训练任务】
作者提出了两个预训练任务: Maked LM 和 Next Sentence Prediction
Maked LM
Masked LM 的任务描述为:给定一句话,随机 Mask 掉这句话中的一个或几个词,要求根据剩余词汇预测被 Mask 掉的几个词是什么。
注意:
在 BERT 的 Masked LM 训练任务中, 会用 [MASK] token 去替换语料中 15% 的词,然后在最后一层预测。但是下游任务中不会出现 [MASK] token,导致预训练和 fine-tune 出现了不一致,为了减弱不一致性给模型带来的影响,在这被替换的 15% 语料中:
- 80% 的 tokens 会被替换为 [MASK] token
- 10% 的 tokens 会称替换为随机的 token
- 10% 的 tokens 会保持不变但需要被预测
第一点中的替换:是 Masked LM 中的主要部分,可以在不泄露 label 的情况下融合真双向语义信息;
第二点的随机替换:因为需要在最后一层随机替换的这个 token 位去预测它真实的词,而模型并不知道这个 token 位是被随机替换的,就迫使模型尽量在每一个词上都学习到一个 全局语境下的表征,因而也能够让 BERT 获得更好的语境相关的词向量(这正是解决一词多义的最重要特性);
第三点的保持不变:也就是真的有 10% 的情况下是 泄密的(占所有词的比例为15% * 10% = 1.5%),这样能够给模型一定的bias,相当于是额外的奖励,将模型对于词的表征能够拉向词的真实表征(此时输入层是待预测词的真实 embedding,在输出层中的该词位置得到的embedding,是经过层层 Self-attention 后得到的,这部分 embedding 里多少依然保留有部分输入embedding 的信息,而这部分就是通过输入一定比例的真实词所带来的额外奖励,最终会使得模型的输出向量朝输入层的真实 embedding 有一个偏移)。 而如果全用 mask 的话,模型只需要保证输出层的分类准确,对于输出层的向量表征并不关心,因此可能会导致最终的向量输出效果并不好。
被随机选择15%的词当中以10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为BERT模型赋予了一定的文本纠错能力;被随机选择15%的词当中以10%的概率保持不变,缓解了finetune时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有mask,而finetune时候输入是完整无缺的句子,即为输入不匹配问题)
缺点:由于每批次数据中,只有 15%的标记被预测,这意味着模型需要更多的预训练步骤来收敛。
为什么要使用Mask
原因就是使用 mask 是为了引入噪声,属于增强模型鲁棒性的一种手段。通过上面的内容可以知道,
通过在输入X句子中随机mask掉一部分单词, 然后在预训练过程中根据上下文单词来预测这些mask
掉的单词,这种模式就是典型的 Denosing Autoencoder 的思路,那些被 mask 掉的单词就是在输入
侧加入的所谓噪音。类似 Bert 这种预训练模式,被称为 DAE LM。
DAE LM 预训练模式的优点: 它能比较自然地融入双向语言模型, 同时看到被预测单词的上文和下文。
缺点: 主要在输入侧引入[Mask]标记, 导致预训练阶段和 Fine-Tune 阶段不一致问题。 (这个问题的
解决参考 6.2 内容)
其 mask 相对于 CBOW 有什么异同点?
相同点: CBOW 的核心思想是,给定上下文,根据它的上文 context-before 和下文 context-after 去
预测 input word。 Bert 本质上也是如此。
不同点: 首先, 在 CBOW 中, 每个单词会称为 input word, 而 Bert 中只有 15%的词会称为 input word。
其次,对于数据输入部分, CBOW 中的输入数据只有待预测单词的上下文,而 Bert 的输入是带有
[MASK] token 的“完整”句子, 也就是说 Bert 在输入端将待预测的 input word 用[MASK] token 代替
了。
另外, 通过 CBOW 模型训练后, 每个单词的 word embedding 是唯一的, 因此并不能很好的处理一
词多异的问题; 而 Bert 模型得到的 word embedding (token embedding) 融合了上下文信息, 就算
是同一个单词,在不同的上下文环境下,得到的 word embedding 是不一样的。
Next Sentence Prediction
Next Sentence Prediction 的任务描述为:给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后,如下图所示:
Next Sentence Prediction 任务实际上是段落重排序的简化版:只考虑两句话,判断是否是一篇文章中的前后句。在实际预训练过程中,文章作者从文本语料库中随机选择 50%正确语句对和 50%错误语句对进行训练, 与 Masked LM 任务相结合, 让模型能够更准确地刻画语句乃至整篇文章层面的语义信息。
Bert预训练任务的损失函数
Bert 损失函数组成:
第一部分是来自 Mask-LM 的单词级别分类任务;
另一部分是句子级别的分类任务;
优点:通过这两个任务的联合学习,可以使得 BERT 学习到的表征既有 token 级别信息,同时也包含了句子级别的语义信息。
损失函数:
在第一部分的损失函数中,如果被 mask 的词集合为 M,因为它是一个词典大小 |V| 上的多分类问题,所用的损失函数叫做负对数似然函数(且是最小化,等价于最大化对数似然函数),那么具体说来有:
在第二部分的损失函数中,在句子预测任务中,也是一个分类问题的损失函数:
两个任务联合学习的损失函数是:
应用场景
- 句子分类
- 句子语义相似度的任务
- 命名实体识别(多标签分类)
- 针对翻译的 | 针对文本生成的任务 (问题回答)