本文主要用于记录谷歌发表于2015年的一篇论文。该论文主要是提供了一种基于海量无标签数据的预训练NLP语言模型的思路。本笔记主要为方便初学者快速入门,以及自我回顾。
论文链接:https://arxiv.org/abs/1511.01432
基本目录如下:
- 摘要
- 核心思想
- 总结
------------------第一菇 - 摘要------------------
1.1 论文摘要
本文主要是提供了两种利用无标签数据来提高序列模型表现的方法。第一种是利用传统的神经语言模型(predict what comes next in a sequence),第二种就是利用序列的自动编码器(autoencoder)。这两种模型可以提前用海量无标注数据来训练,得到的参数可以用于后续有监督学习模型的初始化参数。在论文实验中,利用预训练参数训练的LSTM网络表现的更好且更稳定,并且在许多NLP分类任务中取得了不错的表现。
------------------第二菇 - 核心思想------------------
2.1 预训练模型的必要性
循环神经网络虽然已经被证明是NLP领域的第一大杀器,但是就如武侠小说中的上古神器,使用之人若非内力深厚,必被其伤。可见,循环神经网络这一套是真的很难调参,一会儿就调崩,一会儿就过拟合。(反正有一次训练句向量相似度,上了一套LSTM,折磨了一星期,最后还是弃用用了CNN,可见离驾驭这一套网络还有很长的路要走)。但是循环神经网络又确确实实在理论上会取得比其他网络更卓越的效果,只要好好调参。因此,本文提出了一种全新的基于预训练的参数初始化方法。
2.2 预训练模型的核心思想
其实本文的核心倒不是模型架构本身,而是一种预训练的思路。该思路就是,利用无标签数据先训练模型(非监督学习),由此得到的参数,作为下一阶段模型训练的初始化参数(监督学习)。因此,本文取名半监督学习(semi-supervised)。
而用无标签数据先训练模型的思路也很简单,就是两种。
1)把句子输入模型,再把相同的句子输出来,名为自编码器。该思路来自经典的seq2seq框架(具体看我前一篇论文笔记)。这一套自编码器模型,其实就是去学习句子的表达,用于之后的分类模型训练。其中ENCODER和DECODER参数一样。模型的框架如下图,
2)预测下一个词。这一套框架更简单了,本质就是把上面的自编码器的ENCODER部分给去掉。(其实就是普通多层循环神经网络模型)
论文中还有一个尝试的细节,就是一般我们拿去预测标签的都是循环神经网络最后一个timestep的输出,本文还尝试了一下,对各个隐状态的输出进行线性叠加(linear label gain)。并且还尝试了一下无监督和有监督的一起训练的方法(joint training)。
其实回顾一下,这套预训练的核心本质就是,我的理解就是,提前让循环神经网络学会句子的表达,再之后根据标签去学习分类的能力。而本文的后续实验也证明了,这样训练的模型具有更高的稳定性(不易训崩),应该说是一个很好的调参思路。
2.3 论文实验结果分析
论文作者后面进行了一系列的NLP经典分类任务的实验。我这里就不一一罗列了,大家有兴趣的可以看原论文。我仔细看了第一个实验的,大概的感觉就是LSTM的训练更加稳定了,也被他的80%的DROPOUT的概率小小震惊了一下(一般我们都是50%)。当然,这种实验,还需自己亲力亲为,毕竟发到论文上的都是经过精心设计的,也不一定适用于工业级的应用。大家还需根据具体业务需求,具体实验。
------------------第三菇 - 总结------------------
到这里,整篇论文的核心思想及其创新点已经说清楚了。本论文主要集中在于阐述谷歌这一套预训练模型的思路,以及如何利用无标签数据进行预训练。
简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下预训练模型的思路与方法。谷歌这篇还是划时代的产物,提供的思路也是很有启发性。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁