【Semantic Embedding】: BERT模型

时间过的是真快,bert已经是去年火起来的模型了。

论文"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"

地址:https://arxiv.org/abs/1810.04805   

要了解bert一定要先看看tranformer模型,就是那篇"attention is all your need"。

论文地址:https://arxiv.org/abs/1706.03762

可以看看这篇博客:http://jalammar.github.io/illustrated-transformer/ 讲的很不错。

我自己也写过一篇博客,不过写的一般。

本文的前提是了解了tranformer模型。

这样的话其实bert就比较简单了。

然后再看看这篇文章:https://zhuanlan.zhihu.com/p/49271699 就能了解bert的发展史。本文主要补充一下自己对bert的理解。

这里我把模型的细节当成一个黑盒子进行分析。

1.输入

模型的输入分三个部分:

首先输入是由两个句子concat组成的。如果只是一个句子的话,则只用一个句子的embedding。具体细节如下:

  1. token embedding. 针对英文,作者使用的是wordPiece,可以理解为一个hash trick,用于减少词汇字典的大小。

  其中,句首有一个分类标识符[CLS],该标识符对应一个embedding向量,针对分类任务,该标识符,用于聚合输入的整个embedding表示,分类的时候作为输出,用于分类函数进行分类。其他任务的话,该标识符可以忽略。

因为是两个句子合并的输入,所以句子之间还有一个分隔符[SEP],用于区分两个句子。

  2. Segment embedding. 有了一个分隔符还不够,作者还单独为每个token加入一个句子的embedding,用于区分两个句子。

  3. Position embedding. 位置编码,输入句子的每个token在句子中的位置都会训练出一个针对该位置的embedding。因为tranformer没有使用类似RNN的序列模型,因此针对位置的编码十分必要,不然无非就是个设计复杂的DNN模型。

2.训练方式

使用两个任务来同时预训练embedding。

任务一:Masked LM

   和word2vec很像,这里提到来双向模型,即同时利用masked词汇的上文和下文来进行训练。具体怎么操作呢?

随机将一定百分比的tokens变成mask标记符,然后去预测出这些masked的tokens。这个和CBOW

就很像了,网络把最终的隐藏层向量输入softmax,预测masked词即可。因为在训练过程中,并不像CBOW一样,挖掉一个词,这里是把那个词改写成'[MASK]'。这就会出现一个问题,预训练完成后,我们要在不同任务中使用就得做fine-tuning。在微调的时候是不需要这个‘[mask]’标记的,这样就会导致前后不匹配问题。而且如何只是按这种预训练方式来进行训练模型的话,模型可能会趋向于去学习‘[mask]’这个词的内在表示。因此作者在做随机mask的时候做了如下三种操作:

    80%的情况还是将句子的token变成[mask];

    10%的情况随机把该token替换成其他的token;

    10%的情况不做改变,让模型有机会尽量靠近真实的情况;

这样的话,比如随机替换的这种情况,transformer encoder 不知道哪个词是被预测的,所以被迫去记住整个句子的表示。

这可以被理解为一个加强版的word2vec。

任务二:Next Sentence Prediction

任务一是从token的角度去学习,任务则是从句子的角度去学习。希望模型也能学习到句子之间的相关性。该任务是希望模型能判断语料中前后两句话是不是连着的。即选择的两个句子A和B,50%的情况B是语料中A的下一句,50%的情况A和B是随机选择的。

如图所示

 

整个预训练过程,输入为三种embedding向量的求和,模型行transformer encoder,目标为masked LM 和next sentence prediction 两个目标同时训练。然后用大量的语料来训练网络。

训练完成后就可以将预训练好的模型经过各种fine-tuning应用到不同的场景去了。

完。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章