BERT模型
上一篇写了一下transformer:https://blog.csdn.net/qq_41664845/article/details/84969266
原理简述
BERT 的创新点在于它将双向 Transformer 用于语言模型。Transformer的decoder 是从左到右单向的,因而是串行的(也体现在当前时间片输出对下一时间片输入的影响上),而Transformer的encoder是双向的、无序的,因而是并行的(位置通过位置向量嵌入,和左右阅读顺序无关)。
BERT是一个预训练模型,所谓预训练模型就是比如我们先用维基的所有文本资料对这个模型进行训练,等到你要用的时候再结合应用场景对模型进行增强训练就可以了。
BERT 的目标是生成语言模型,只需要Transformer 的 encoder 机制。
我们在训练模型的时候都需要一个预测目标(类似损失函数),很多模型在一个序列中预测下一个单词:
“The child came home from ___”
Transformer的Decoder也是这样的(利用上一个词生成下一个词)。
双向的方法在这样的任务中是有限制的,为了克服这个问题,BERT 使用两个策略:
Masked LM (MLM)和Next Sentence Prediction (NSP)
Masked LM (MLM)
训练数据生成器随机选择15%的token,但不是始终用[MASK]替换所选单词。然后模型尝试基于序列中其他未被 mask 的单词的上下文来预测被掩盖的原单词:
80%的时间:用[MASK]标记替换单词,例如,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.
这样做的目的是将表示偏向于实际观察到的单词。
由于encoder的输出是利用attention加权求和之后输入词的词向量,即词的“编码向量”,我们还需要将这个中间编码向量映射到目标单词上。Transformer是使用Decoder来实现这一“解码”过程的。在BERT中由于没有了解码器Decoder,所以要在encoder的上面添加一个全连接层(承担“解码”功能),然后把结果向量映射到总的词袋向量列表上,再通过softmax计算词汇表中每个单词的概率,取概率最大的单词作为预测结果。过程非常的类似Transformer的Decoder的输出过程:
Next Sentence Prediction (NSP)
在 BERT 的训练过程中,模型接收成对的句子作为输入,并且预测其中第二个句子是否在原始文档中也是后续句子。在训练期间,50% 的输入对在原始文档中是前后关系,另外 50% 中是从语料库中随机组成的,并且是与第一句断开的。为了预测第二个句子是否是第一个句子的后续句子,用下面几个步骤来预测:
1.整个输入序列输入给 Transformer 模型
2.用一个简单的分类层将 [CLS] 标记的输出变换为 2×1 形状的向量
3.用 softmax 计算 IsNextSequence 的概率
NSP的输入是3个向量的求和:词嵌入向量、句向量和位置嵌入向量。
BERT的使用
BERT 可以用于各种NLP任务,只需在核心模型中添加一个层,例如:
1.在分类任务中,例如情感分析等,只需要在 Transformer 的输出之上加一个分类层
2.在问答任务(例如SQUAD v1.1)中,问答系统需要接收有关文本序列的 question,并且需要在序列中标记 answer。 可以使用 BERT 学习两个标记 answer 开始和结尾的向量来训练Q&A模型。
3.在命名实体识别(NER)中,系统需要接收文本序列,标记文本中的各种类型的实体(人员,组织,日期等)。 可以用 BERT 将每个 token 的输出向量送到预测 NER 标签的分类层。
参考博文:https://www.jianshu.com/p/d110d0c13063