参考:
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Bert时代的创新(应用篇):Bert在NLP各领域的应用进展
一、bert为什么会出现???
1、Word Embedding:Word2Vec(CBOW/Skip-gram)—>Glove
!!!无法解决词的多义问题
缺点:
Word Embedding在对bank这个单词进行编码的时候,是区分不开这两个含义的,因为它们尽管上下文环境中出现的单词不同,但是在用语言模型训练的时候,不论什么上下文的句子经过word2vec,都是预测相同的单词bank,而同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的word embedding空间里去。所以word embedding无法区分多义词的不同语义,这就是它的一个比较严重的问题。
**解决:**引入ELMO
2、ELMO:
实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
总结,ELMo使用双层BiLSTM来训练语言模型,创新是线性组合不同层的word vectors, 作为最终的word representation。核心公式:
-
第一层是普通的word embedding 可以用wrod2vec或者glove来得到,或者使用character
level得到token embedding》 这部分是general embedding,上下文无关。文中使用的character level的CNN+Highway. -
后面连接两个biLSTM 去encode 输入(同时也有残差连接), 每一层LSTM得到的输出(隐状态) 作为每个词的上下文相关的word vectors. 这样每个词就会有(L+1)个词向量,L为biLSTM的层数 ,1为原始词向量.
-
词向量的线性组合,针对不同的任务,不同层的向量做不同的权重加和。 其中权重s是一个维度为L的vector,参与训练。
因此ELMo的基本输入单元为句子,每个词没有固定的词向量,是根据词的上下文环境来动态产生当前词的词向量,常见的场景可以较好解决一词多义的问题,这一点跟word2vec与glove等通用词向量模型是不同的。
缺点:
一个非常明显的缺点在特征抽取器选择方面,ELMO使用了LSTM而不是新贵Transformer,很多研究已经证明了Transformer提取特征的能力是要远强于LSTM的
**解决:**引入GPT
3、GPT:
与ELMO主要不同在于两点:首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到过它的特征抽取能力要强于RNN,这个选择很明显是很明智的;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,
缺点:
采用单向语言模型
所谓“单向”的含义是指:wi之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。ELMO在做语言模型预训练的时候,预测单词 同时使用了上文和下文,而GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。
这个选择现在看不是个太好的选择,原因很简单,它没有把单词的下文融合进来,这限制了其在更多应用场景的效果,比如阅读理解这种任务,在做任务的时候是可以允许同时看到上文和下文一起做决策的。如果预训练时候不把单词的下文嵌入到Word Embedding中,是很吃亏的,白白丢掉了很多信息。
**解决:**引入Bert
4、Bert:
Bert采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。所以这里Bert的预训练过程不必多讲了。
缺点:
对领域内有标签数据的过分依赖:虽然有了预训练+精调的两段式框架,但还是少不了一定量的领域标注数据,否则很难取得不错的效果,而标注数据的成本又是很高的。
对于领域数据分布的过拟合:在精调阶段,因为领域数据有限,模型只能拟合训练数据分布,如果数据较少的话就可能造成过拟合,致使模型的泛华能力下降,更加无法应用到其他领域。
二、bert基础知识
语言表达模型BERT,全称为Bidirectional Encoder Representations from Transformers。
BERT模型的结构如下图最左:
BERT模型特点:
特征抽取器使用了Transformer,
看模型图,这个真的是做到了上下文信息一起进去了,所有的token都有一个指向每一个Transformer的箭头
BERT模型输入:
模型的输入包括三个部分,分别为
1)基于词级别的词向量(分隔以后)- 针对每一个单词的embedding
2)基于位置的向量 - 告诉模型每一个单词在一个句子中的位置信息
3)每一个句子的向量(分隔以后)- 告诉模型这个单词是来自第一个句子还是第二个句子的(训练方法二需要)
具体可以见下图
论文预训练方法 - Masked LM
为了训练一个深度双向表示模型,作者提出了一种屏蔽一句话中的部分词的训练方法,然后让模型来预测屏蔽的那个词(同比于CBOW,就是根据这个词的上下文,去预测每一个词,损失函数由所有词的loss组成(cross-entropy),而本文的loss只来源于那些被屏蔽的词)。
在作者的实验设置中,大约15%的词被随机屏蔽
论文预训练方法 -下一句预测(NSP)
在BERT训练过程中,模型接收成对的句子作为输入,并学习预测成对的第二个句子是否是原始文档中的后续句子。在训练期间,输入的50%是一对,其中第二个句子是原始文档中的后续句子,而在其他50%的输入中,从语料库中选择一个随机句子作为第二个句子。假定随机句子将与第一句断开。
Fine-tuning方式
Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。除了最后一层,所有的参数都变化了。
三、bert实践–文本分类
1、
应用领域:文本分类
文本分类是个NLP中历史悠久,源远流长……总之比较成熟的应用领域。它的意思是给定一个文档,模型告诉这是哪个类别,是讲的“体育”还是“娱乐”,总之就是这个意思。
那么,Bert应用在这个领域效果如何呢?目前也有工作。
论文:DocBERT: BERT for Document Classification(下载本地)
在四个常用的标准文本分类数据集合上,利用Bert的预训练模型进行了效果测试,应该说效果能够达到以及超过之前的各种方法,但是总体而言,相对之前的常用方法比如LSTM或者CNN模型,提升幅度不算太大,基本提升幅度在3%到6%之间。
对于文本分类,Bert并未能够获得非常大的效果提升,这个结果其实是可以理解的。因为把一个还比较长的文档分到一个类别里,这种任务偏语言浅层特征的利用,而且指示性的单词也比较多,应该算是一种比较好解决的任务,任务难度偏简单,Bert的潜力感觉不太容易发挥出来。