版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
参考论文:Universal Language Model Fine-tuning for Text Classification
迁移学习最早是应用于机器视觉方向的,迁移学习是从general到specific的过程,在general过程中在大型语料库中进行预训练(pre-training),在specific过程中在specific task领域中进行微调(fine-tunning).
迁移学习的可行性
无论是在机器视觉还是在nlp领域中,预训练过程中发现底层特征的可复用性,而高层特征和任务的高相关性,nlp的ELMO就验证这一点。
为什么要进行预训练?
1. 训练数据小,不足以训练复杂网络
2.加速训练过程
3.参数初始化,找到好的初始点,便于优化。
为什么又要在specific task domain 进行微调?
1. 训练数据小,容易过拟合
2.从头开始基于预训练得到的特征训练,训练时间长
3.从头训练导致模型忘记pre-training的特征
这篇文章就nlp方向提出了一种新的微调方法,用于解决上面提到的微调存在的三个问题,并在nlp中的6项任务中验证本文提出的微调方式的有效性。这篇论文提出的预训练方法和之前的迁移学习中微调方法在nlp中的不同点如下,这个在ELMO中也提到过:
使用task数据fine-tuning词向量(如glove这种),只更改模型的第一层,将其他任务得到的词向量和本任务的输入concat起来,但其实这些pretrain的词向量都是被当做固定参数用的,且该任务的模型是从头训练的。因此出现了pretrain语言模型(language model),但是语言模型容易在小型数据上过拟合,且当训练分类器时容易忘记pretrain语言模型学到的知识。
整体框架:
(a)General-domain LM pretraining
训练集:包含了28,595 Wikipedia文章和103亿词
语言模型:采用了3层的单向LSTM,无attention,带有少量dropout 参数
只需要训练一次,用于提升下游任务的效果,和加速下游任务收敛的速度
(b)Target task LM fine-tuning
提出了两种在该阶段加速训练,不影响效果的两种策略。
Discriminative fine-tuning,即对layer1,layer2和layer3采用不同的学习速率,η(l−1) =ηl/2.6 ,ηl为第l层的学习率。 Slanted triangular learning rates,学习率不断下降未必是好事,需要先增后降。即每一个iteration都会对学习速率有一个修正(iteration和epoch不一样,一个iteration是一次参数的更新,相当于一个batch),具体的修正公式如下:
其中,
是总的迭代次数,
是当前的迭代次数,
是转折比例,
是最大的学习速率,
是最大和最小学习率的差值
学习率和迭代数之间的关系如下图所示:
(c) Classifier fine-tuning
在该阶段使用domain中的有标注数据进行分类器的训练,分类器为两个线性block,每个线性block包含(batch normalization,dropout,激活函数ReLU),最后跟一个softmax层,输出属于某一类的概率。对于每个任务来说,这两个线性block和softmax都是从头训练的。layer3的LSTM的输出变量进行一系列的变换操作,
,
,最后hc为输入分类器的形式,其中[]为向量连接符号,为了就是避免最后一层包含的信息太少,那么在对分类器进行训练的时候,除了Discriminative fine-tuning和Slanted triangular learning rates技术。为了避免全部fine-tuning导致语言模型对之前学到的general知识的遗忘,引入
Gradual unfreezing,从后往前(从layer3到layer1方向)逐步的添加。先只把最后一层解冻,接下来就把一个多余的网络层加入到解冻集合中去。由于后面的网络更多的是specific信息,前面的网络包含的更多general信息,这样的方式可以最大的幅度保存(a)、(b)阶段学习到的信息。
BPTT for Text Classification,为了当输入文本很长时,可以较好的fine-tuning分类器,将文档拆成几个batch,每个batch的长度是一致的,哪一个batch促成了最后的preciction,就反向传播给哪个batch。