ULMFiT和其他算法的比较
上篇介绍了ELMo。ELMo有以下几个步骤:
- 利用LM任务进行预训练,
- 再利用目标领域的语料对LM模型做微调,
- 最后针对目标任务进行最后的训练
ULMFiT一样需要执行上述步骤。它的论文名字(Universal Language Model Fine-tuning for Text Classification)顾名思义就是一个利用LM模型给出的统一的在文本分类方面进行transfer learning的解决方案。
一直以来都有人试图在NLP领域进行transfer learning的尝试,可惜从来都没有像ImageNet在CV里那样成功的案例。也许指望某个特定的方法一统江湖是不可能了,但是总结迄今的研究,显然LM基于其对语言内在结构的学习能力成为主流模型。
下面这张表概括一些近年来寻找NLP领域"ImageNet"的尝试:
项目 | 任务 | 数据 | 模型 |
---|---|---|---|
InferSent | NLI | SNLI | encoder: BiLSTM+Maxpooling |
Conversations | Multitask(Input-response&NLI) | SNLI+Reddit | encoder: DAN/Transformer |
QuickThought | classification | BookCorpus/UMBC corpus | encoder: GRU |
ELMo | LM | WMT11 | Stacked BiLSTM |
ULMFiT | LM | Wiki text | stacked forward&backward LSTM |
ELMo和ULMFiT在任务上给出的答案是语言模型LM; 在数据上虽有不同,但是WMT11和Wiki都同为general text数据,并无本质差别。模型方面二者都选择了LSTM,区别仅在于前者是双向的,后者是独立的两个模型:forward和backward的平均。
看来在预训练任务这方面,ELMo和ULMFiT都把这一票投给了语言模型。
前面的文章介绍过另外两种做transfer learning的模型InferSent和Conversations, 它们走的是解决NLI(和Input-response)任务的路子。直觉上,NLI任务的语义学特性很适合作为产生通用语言features的预训练任务。
QuickThought 比较特殊,它的任务是判断给定的句子是否是相邻的句子,属于经典的classification的问题。
哪一种方法更好,当然要看具体的应用。不过粗略的说,还是可以用土办法大概分析一下。围棋上有个术语叫“手割”,用来判断局部的好坏。就是把对弈双方效率相近的棋子拿掉,那么剩下的效率不同的棋子就是决定优劣的关键。这里也可以用手割的方法来分析一下。
直觉上看第一类(ELMo和ULMFiT)的效果会更好,因为它们除了预训练和在目标任务(包括label)上fine tuning,还包括了在目标语料(不包括label)上fine tuning,比其他两类多出了domain adaptation的步骤。
ELMo和ULMFiT之间来比较,ELMo要更好。原因是ELMo在最终解决目标任务时,需要使用下游的模型,并不是直接的把自己的sentence或者doc embeddings拿出来使用。相反,ELMo只提供了自己的word embeddings给下游的模型。相比ULMFiT,ELMo更加“谨慎”,步子迈的更小,只专心把word embedding给做到极致,下游的模型不操心。它不像其他的方法,直接把压缩好的句子embedding拿出来给下游任务使用。
总结了那么多,可能还是没说清楚ULMFiT是什么。下面这张图表示了它的三个步骤:
预训练,目标领域的微调,(把最后一层拿掉后,对最后一层微调)目标任务的训练。
接下来看一下ULMFiT在第二第三个步骤上的独特之处。
目标任务语言模型的微调
作者引入了一些微调上有用的算法:
-
订制的微调(discriminative fine-tuning)
一般来讲, SGD算法如下:
但是这里定义为:
是第 层的learning rate。作者给出的经验公式是
低层的学习率要递减。道理是:低层学习较低级较普遍的features,高层学习较高级较特殊(task-specific)的features。
对于高层来说,要避免overfitting,尽量跳出local最优解,所以要较大的学习率; 对于低层来说,学到的feature比较generalized,所以要放慢学习率。
这和drop out从高层到低层递减的道理是一样的:正因为高层网络要避免overfitting,所以往往采用比低层大的droput。 -
坡度三角学习率(slanted triangular learning rates)
为了尽快找到task-specific的features, 我们需要模型快速的收敛到一个足够好的参数空间,之后再进行微调。作者为每一层定义了如下图的学习率:
上图表示了学习率如何随iteration变化。这里采用了一个“迅速上升,缓慢下降”的方式。 具体学习率的公式从略。至于作者是如何找到这样一种学习率,我想这是学术界的优势。作者发现无论是常数值还是衰减的学习率都不是最好的方案,这说明他们有时间去实验各种的办法。
目标任务classifier模型的微调
-
连接pooling
仅使用最后一个时间步上的隐变量 显然会有信息的丢失,尤其是在长文本的情况下。
ULMFiT给出的办法是:
这里 。把maxpool和meanpool放在一起使用也挺常见的。以前介绍过的Concatenated p-mean word embeddings把max和mean包含在了p-mean的定义之下,在应用中使用了更多的操作,显得“求生欲”更强。不知道这里采取和p-mean同样的做法效果会怎么样,应该说信息的丢失会减少,效果有可能更好。
-
逐渐解冻
目标classifier的微调是transfer learning最重要的部分。太“急躁”的微调会很快失去通过LM学到features的优势; 太谨慎的微调会导致收敛太慢,甚至过拟合。针对此作者提出了gradual unfreezing。
具体做法是:
在第一个epoch, 先解冻最后一层,然后fine-tune它;
在第二个epoch, 解冻最后一层和它的下一层,然后fine-tune它们;
…
直到我们fine-tune所有层。
重复,直到收敛。
实验
实验用到的数据及对应的任务类型:
和其他方法的比较如下:
实验在每个任务上和现在的state-of-the-art算法比较。其中包含了task specific的算法和transfer learning方面最好的算法。
ULMFiT在所有的任务上都有明显优势。
有没有目标任务LM预训练的效果不一样:
上图的三个任务从左到右分别是IMDb, TREC-6和AG。蓝线代表没有目标任务LM预训练,红线仅用有label的目标任务数据做LM预训练,绿线使用所有的目标任务数据做预训练(包括没有label的数据)。 显然为达到一样的训练精度,蓝色需要的样本数量巨大,是其他两种方法的10到100倍左右。使用更多的预训练数据的方法比较少使用目标任务数据的方法在利用训练样本上更高效。(在TREC-6这种差别不明显,是因为TREC-6测试集比较小)
为证明作者提出的订制微调(discr)和三角学习率(stlr)的效果,相关实验如下:
结论
ULMFiT是一种非常有效而且样本利用率很高的迁移学习方法,在各种NLP任务中效果都很好。它和前面介绍过的ELMo很像但是也有巨大的差异:ELMo提供了新的词向量的表达,但是没有提供目标任务的模型; ULMFiT使用的是AWD-LSTM语言模型。另外ULMFiT的作者对Hypercolumns提出了不同的看法。所谓Hypercolumns是指把多个中间层的输出和输入层的embedding放在一起在做一些engineering,提供给下游任务。ELMo采用的就是这种做法,理论依据是这样可以把低层的语法和高层的语义信息结合起来。但是ULMFiT作者认为完全不需要这样做也可以取得好的结果。
关注公众号《没啥深度》有关自然语言处理的深度学习应用,偶尔也有关计算机视觉