有些时没有更新blog,最近被工作弄的很闹心,拖了又拖,还是把最近的一些nlp模型研究学一下。
虽然现在没有这这一块工作,但是总的来说,新出来的这些个模型,还是没有让人眼前一亮的东西出来。Bert的出现可能是暂时统一了江湖,但是底层结构不改,还是在提升那1%。
Elmo
Elmo(Embeddings from Language Models),是allen NLP 在18年6月NAACL上发的一个词向量训练模型。
就是说,Elmo的作用就是训练一个模型,用来表示某个词,换句话说,和word2vec和GloVe功能是一样的,这个新的训练方法有两点进步:
- 能够处理单词用法中的复杂特性(比如句法和语义)
- 有些用法在不同的语言上下文中如何变化(比如为词的多义性建模)
具体是什么意思呢,因为很多词它表达的意思是随着语境而变化的,比如说“今年的苹果很贵,13块一斤”和“今年的苹果很贵,高配要1万块”。这两个句子里的苹果显然不是一个东西,但是我们之前用的词向量word2vec和GloVe,都不能表达出这两个词之间的差别。
所以Elmo要解决这个问题。
Elmo为什么能有这个能力来联系上下文表达出词义。其实可以想想,什么模型可以联系上下文,无疑CRF和RNN对不对。而CRF是通过概率图的形式,将每一步的概率向下传递,这就没办法给出每一个词的输出。但是我们在LSTM中,每一个cell是又两个输出的,一个是c(x)(细胞状态),一个是h(x)(隐藏层状态),这两种状态中都包含之前的信息。
这里我们想到,从前到后是一种信息,从后到前又是一种信息,所以用双向模型所拥有的信息会更多。如果把双向每一个cell的隐藏层信息的向量组合起来,最后再接一个softmax(也有取最上一层的输出),最后训练出的向量即为我们想要的词向量。
大家其实看张图已经可以很清楚的看到ELMO的结构了,也没有那么复杂,对比和word2vec训练出的词向量:
- ELMo的假设前提一个词的词向量不应该是固定的,所以在一词多意方面ELMo的效果一定比word2vec要好。
- word2vec的学习词向量的过程是通过中心词的上下窗口去学习,学习的范围太小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,而后再通过语言模型生成的词向量就相当于基于整个语料库学习的词向量,更加准确代表一个词的意思。
- ELMo还有一个优势,就是它建立语言模型的时候,可以运用非任务的超大语料库去学习,一旦学习好了,可以平行的运用到相似问题。
上elmo的效果:
- Textual entailment: stanford natural language inference (SNLI)数据集上提升了1.4%。
- Question answering: 在stanford question answering dataset (SQuAD)数据集上提升了4.2%,将ELMo加入到之前的state-of-the-art的ensemble模型中,提升了10%。
- Semantic role labeling: 比之前的state-of-the-art模型提高了3.2%,将ELMo加入到之前的state-of-the-art的单模型中,提升了1.2%。
- Coreference resolution: 比之前的state-of-the-art模型提高了3.2%,将ELMo加入到之前的state-of-the-art的ensemble模型中,提升了1.6%。
- Named entity extraction: 在CoNLL 2003 NER task数据机上提高了2.06%
- Sentiment analysis: 比之前的state-of-the-art模型提高了3.3%,将ELMo加入到之前的state-of-the-art模型中,提升了1%。
也还是1-3%左右的提升。
GPT
因为bert统治性的地位,bert我要单独用一篇文章讲。这里来介绍GPT。
GPT是openAI早于BERT的一个模型,但是由于宣传原因,导致GPT1.0并没有出个大新闻,但是GPT的单项语言模型在GPT2.0为自己正名,虽然还没有在GLUE上大展拳脚,但是我相信,按照目前的趋势,GPT3.0一定会大展拳脚,打掉bert。这篇文章写的很不错GPT和BERT的现状和前景。
说GPT之前,我想说结合Bert和GPT来看,LSTM很有可能淘汰,而被Transformer全方位的取代,原因有两点:
- Transformer可以并行计算;
- Transformer有关联上下文的能力
GPT采用了单项的Transformer完成预训练任务,并且将12个Trm叠加起来,而训练的过程其实非常的简单,就是将句子n个词的词向量(第一个为<SOS>)加上Positional Encoding后输入到前面提到的Transfromer中,n个输出分别预测该位置的下一个词(<SOS>预测句子中的第一个词,最后一个词的预测结果不用于语言模型的训练)。
和Bert相同的是,GPT也是分两个阶段进行训练,第一阶段预训练后还有一个fine-tune。(因为GPT发布的比bert早,所以是不是bert抄GPT的呢?)
上一步中最后一个词的输出我们没有用到,在这一步中就要使用这一个输出来作为下游监督学习的输入,这样就运用少量的带标签数据对模型参数进行微调。
然后接下来一步就是我觉得这个模型很牛逼的地方了,为避免Fine-Tuning使得模型陷入过拟合,文中还提到了辅助训练目标的方法,类似于一个多任务模型或者半监督学习。具体方法就是在使用最后一个词的预测结果进行监督学习的同时,前面的词继续上一步的无监督训练,使得最终的损失函数成为:
针对不同任务,需要修改输入数据的格式:
站着把监督和无监督都办了,真是牛逼。这篇文章写的非常好https://zhuanlan.zhihu.com/p/69290203。
以上是GPT1.0,而GPT2.0主要改进我觉得除了对Transformer有细微的改动之外,还有就是增大了参数容量(变成了1.5亿参数。。),还有训练数据加大(800W高质量网页内容)。这些改变就让GPT2.0变得炙手可热(好像是有钱就是牛逼,暴力提升法),不得不期待一下GPT3.0 能做到什么地步。
好的,上到这里就完了,下来好好讲一讲Transformer和Bert。