迁移学习在nlp领域的应用之pretrain language representation,四连载,建议按顺序看,看完对该方向一定会非常清楚的!
(一)ELMO:Deep contextualized word representations
(二)Universal Language Model Fine-tuning for Text Classification
(三)openAI GPT:Improving Language Understanding by Generative Pre-Training
(四)BERT: Pretraining of Deep Bidirectional Transformers for Language Understanding
这篇paper对细节描述的很清楚,建议直接看原文!!!建议直接看原文!!!
nlp任务一般分为两类:
sentence-level:预测句子间的关系,如natural language inference和paraphrasing。
token-level:需要在token层面上生成输出,如named entity recognition和SQuAD question answering。
迁移学习在nlp的应用主要是采用无标注数据预训练language representation,分为两类:
feature-based:将预训练的language representation用作额外的输入和原词向量拼接在一起,不参与整个task模型的fine-tuning,不同的task有自己的模型,如ELMO。
fine-tuning:在预训练的language representation后面加上一层全连接和softmax组成分类器,用有标注数据fine-tuning整个分类器,这样的话不同task都可以使用类似的模型,不同的部分比较少,如openAI GPT。
这篇google的神作,语言模型是采用Transformer encoder(openAI GPT使用的是Transformer decoder,所以只能从左到右),引入masked LM促成双向深层语言模型(每一层都可以利用双向context,而不像ELMO一样只是在最后一层concat双向context),采用双向LM对token-level的任务很有效。使用了next sentence prediction模拟以句子对为输入的情况。并且在sentence-level和token-level共11个问题上做了实验。
和openAI GPT类似处理输入句子之间的连接,注意起始这个[CLS]的最后一层hidden state,在分类任务中是用这个hidden state作为整个输入的表示输入到全连接层的。
图中token embedding就是普通的词向量啦,segment embedding是句子A中所有token用的是学到的句子A的embedding(这个具体是用什么恐怕要看代码),句子B中所有token用的是学到的句子B的embedding,position embedding就是token位于句子的第几个单词。将这三种embedding加起来即可。
随机将输入中15%的token换成[mask]这个字符,相应的也使用这个字符的词向量,在这个字符的最后一层接上全连接+softmax预测原本的token的概率,使这个概率最大(这就是语言模型啦)。只需预测换成[mask]的token,不用像ELMO和openAI GPT一样预测所有token。但是这样的话在inference的时候[mask]从来不会出现在输入中,这样就不同分布了,怎么办呢?
80%的时间将token换成[mask],10%的时间换成其他某个token,10%还是这个token。
那这样需要更多的迭代会收敛吗?看下面的实验结果。
至于为什么transformer encoder可以利用双向context,而transformer decoder不行,看attention is all you need。
从一篇文档中,找出句子对,其中50%一个句子是另一个句子的下一句,50%不是。就用语言模型预测句子对是不是下一个这种关系。这样语言模型可以学到句子间的关系。
如上图所示,蓝色的框是语言模型,如图a、b,对于分类模型,将[CLS]的最后一层hidden state,作为整个input的表示输入到全连接层,后面跟softmax输出属于某一类的概率。如图c,对于需要输出答案的start和end位置,是token level,预测start时,将所有paragraph token的最后一层hidden state送入全连接层,得到一个值,比如共有500个token,那么就有500个值,将这500个值送入softmax输出start属于某一token的概率,end也是一样预测,只是end的全连接和start的全连接权重不共享。在inference时,因为end的预测没有依赖start,那么需设一个限制end一定要在start之后。如图d,命名实体识别,也是token level,将每个token的最后一层hidden state送入全连接层+softmax,得到输入某个tag的概率,权重共享。
在11个task上效果都非常好,并且验证了双向模型的有效性以及transformer相对于lstm的优越性。
模型越深,效果越好(即使模型以及很深了,效果依然有提升)。
masked 语言模型虽然收敛略微慢一点点,但是效果好很多。
BERT像ELMO一样用作feature效果也比较好(也就是说语言模型不参与最后整个task模型的fine-tuning或者只有少数层参与)
最后的fine-tining对于task数据较少的不友好,数据量大的对超参数的变化不太敏感。