今天我们来一起解读由Jeremy Howard和Sebastian Ruder∗在2018年1月18号发布的论文Universal Language Model Fine-tuning for Text Classification(用于文本分类的通用语言模型微调ULMFiT)
这篇论文对自然语言处理(NLP)领域具有重要影响,它提出了迁移学习在 NLP 任务中的有效应用,为减少训练数据需求和提升模型性能提供了新的思路。极大地推动了 NLP 中迁移学习的发展,展示了如何通过通用的预训练语言模型来有效地解决文本分类等任务。它开创了一种更高效的数据使用方法,并对后续预训练模型(如 BERT、GPT)的发展提供了启发。迄今为止被3891次引用。
论文链接
摘要:
归纳迁移学习已经对计算机视觉产生了巨大影响,但现有的自然语言处理(NLP)方法仍然需要针对具体任务进行修改,并从头开始训练。我们提出了通用语言模型微调(ULMFiT),这是一种可以应用于任何 NLP 任务的有效迁移学习方法,并介绍了对语言模型进行微调的关键技术。我们的方法在六个文本分类任务上显著超过了最新的技术水平,在大多数数据集上将错误率减少了 18-24%。此外,使用仅 100 个标记样本时,其性能能够与从头训练所需 100 倍数据量的效果相匹敌。我们开源了我们的预训练模型和代码。
说明:
归纳迁移学习指的是将一个任务中学到的知识转移到另一个相关任务中。这个概念在计算机视觉中已经有很大的应用和成功。
接下来简单介绍一下这个用于NLP的迁移学习方法:
目前的很多CV模型比如说目标识别, 分类, 语义分割等, 并不会从头开始训练模型, 而是在一些基于ImageNet, MS-COCO等数据集训练出的预训练模型上进行微调
而文本分类是一项具有相当应用前景的自然语言处理任务, 这其中就包括垃圾邮件、欺诈和机器人检测,应急响应以及商业文档分类等等
虽然深度学习模型在许多 NLP 任务上取得了最新的技术成果,但这些模型通常从头开始训练,要有大量数据集,并且需要几天的时间才能收敛。NLP 研究主要集中在传递式迁移学习上。对于归纳式迁移学习,一种简单的迁移技术(微调预训练的词嵌入)主要作用于模型的第一层,已经在实际应用中产生了巨大影响,并且在大多数最新的模型中被使用。近期的一些方法将从其他任务中得出的嵌入向量与输入在不同层级进行连接,但这些方法仍然从头开始训练模型,并将预训练的嵌入视为固定参数,限制了它们的效用。
鉴于预训练的好处,我们应该能够做得比随机初始化模型的其余参数更好。然而,通过微调实现的归纳迁移在 NLP 中并不成功。Dai 和 Le(2015)首次提出对语言模型(LM)进行微调,但他们的方法需要数百万篇领域内的文档才能取得良好的性能,这极大地限制了其应用范围。
并不是语言模型(LM)微调的想法本身有问题,而是我们缺乏如何有效训练它们的方法。语言模型在小数据集上容易过拟合,并且在与分类器一起进行微调时会出现灾难性遗忘。相比于计算机视觉(CV),NLP 模型通常更浅层,因此需要不同的微调方法。
论文提出了一个新的方法–通用语言模型微调(ULMFiT),该方法解决了这些问题,并使得任何 NLP 任务的归纳迁移学习更加稳健,这个方法使用类似于微调 ImageNet 模型相同的 3 层 LSTM 架构, 使用相同的超参数,除了微调了 dropout 超参数外没有其他改动, 这个方法在六个广泛研究的文本分类任务上表现优于高度工程化的模型和迁移学习方法。
在 IMDb 数据集上,使用 100 个标记样本时,ULMFiT 的表现相当于从头训练并使用 10 倍数据量的效果;而在有 50,000 个未标记样本的情况下,其表现相当于使用 100 倍数据量训练的效果。
说明:
ImageNet 是一个广泛用于图像分类任务的标准数据集,MS-COCO 则主要用于物体检测、分割和其他计算机视觉任务。它们是迁移学习的常用预训练数据集,能帮助模型学习到通用的视觉特征。传递式迁移学习方法从目标任务和源任务中获取信息,主要用于数据分布相同或相似的任务,常用于领域自适应等场景。归纳式迁移学习这种方法旨在将从源任务中学到的知识应用到与之不同的目标任务上。文中提到的词嵌入微调是其中一种常用的迁移技术。通过预训练生成的词嵌入(如 Word2Vec、GloVe),是 NLP 模型的基础部分,可以作为模型的第一层输入。这种方式极大地提升了模型在不同任务中的表现。
接下来详细介绍一下相关工作:
微调已成功用于在相似任务之间进行迁移学习,例如在问答(QA)任务中,用于远程监督的情感分析,或者在机器翻译(MT)领域中,但研究表明,微调在不相关任务之间效果较差。Dai 和 Le(2015)也微调了语言模型,但在仅有 10k 个标记样本的情况下出现过拟合,并且需要数百万篇领域内文档才能取得良好表现。相比之下,ULMFiT 利用了通用领域预训练和创新的微调技术,即使在只有 100 个标记样本的情况下也能防止过拟合,并且在小型数据集上也取得了最新的性能。
语言建模被视为一个理想的源任务,它捕捉了语言中的许多方面,如长期依赖、层次结构和情感等,这些特征在各种 NLP 下游任务中都很重要。因此,语言建模类似于 NLP 中的 ImageNet,在多个任务中具有广泛的适用性。与机器翻译和蕴涵任务相比,语言建模为大多数领域和语言提供了近乎无限的数据。
论文提出了通用语言模型微调(ULMFiT),该方法首先在一个大型的通用领域语料库上预训练语言模型(LM),然后使用创新技术在目标任务上进行微调。这种方法之所以被称为‘通用的’,是因为它满足了以下实际标准:1)它适用于不同文档大小、数量和标签类型的任务;2)它使用单一的架构和训练过程;3)不需要特定的特征工程或预处理;4)不需要额外的领域内文档或标签。
在实验中,使用了最新的语言模型 AWD-LSTM,这是一种常规的 LSTM 模型(没有使用注意力机制、快捷连接或其他复杂的改进),但调整了各种 dropout 超参数。类似于计算机视觉领域,我们预期未来通过使用性能更高的语言模型可以进一步提升下游任务的表现。
我们使用了如下步骤构建出ULMFiT:
通用领域语言模型预训练
先在大规模通用语料库上对语言模型进行预训练,以学习语言的基础特征和结构。 目标任务语言模型微调
将预训练的语言模型微调到具体的目标任务上,使其能够更好地适应该任务的特点。 模板任务分类器微调
对目标任务中的分类器进行微调,进一步提高模型在分类任务上的表现。
我们将在接下来的部分详细介绍这些步骤
通用领域语言模型预训练
对于语言来说,一个类似 ImageNet 的语料库应该规模大,并能捕捉语言的通用特性。我们在 Wikitext-103上预训练语言模型,该数据集包含 28,595 篇预处理的维基百科文章和 1.03 亿个单词。预训练对小数据集的任务最为有益,甚至在只有 100 个标记样本的情况下也能实现泛化。虽然这个阶段的计算成本最高,但只需执行一次,并能提高下游模型的性能和收敛速度。
目标任务语言模型微调
无论用于预训练的通用领域数据多么多样化,目标任务的数据可能依然来自不同的分布。因此,我们需要在目标任务的数据上微调语言模型(LM)。给定一个预训练的通用领域语言模型,这一阶段的收敛速度更快,因为它只需要适应目标数据的特定特点,而且这允许我们即使在小数据集上也能训练出一个稳健的语言模型。我们提出了判别式微调和倾斜三角学习率来微调语言模型,接下来我们会介绍这些技术。
判别式微调
在神经网络中, 不同层的神经网络可以提取文本的不同特征, 那么我们也应该考虑为不同层提供相对不同的调参, 所以不同与常规的随机梯度下降(SGD)为每一层反向传播时提供相同的学习率, 在论文中提出的判别式微调提出, 将权重参数调整的函数
Θ
t
=
Θ
t
−
1
−
η
⋅
∇
Θ
J
(
Θ
)
\Theta_{t}=\Theta_{t-1}-\eta\cdot \nabla_{\Theta} J(\Theta)
Θt=Θt−1−η⋅∇ΘJ(Θ)中的
Θ
\Theta
Θ记作
(
Θ
1
,
Θ
2
,
.
.
.
,
Θ
l
)
(\Theta^1,\Theta^2,...,\Theta^l)
(Θ1,Θ2,...,Θl),这里的每一个
Θ
\Theta
Θ都包含了一层神经网络的权重 , 也就是说每一层权重的跟新都有其各自的学习率, 那么每一层权重的更新函数如下:
Θ
t
l
=
Θ
t
−
1
l
−
η
l
⋅
∇
Θ
l
J
(
Θ
)
\Theta^{l}_{t}=\Theta^{l}_{t-1}-\eta^{l}\cdot \nabla_{\Theta^{l}}J(\Theta)
Θtl=Θt−1l−ηl⋅∇ΘlJ(Θ) 而且通过试验发现, 当
η
满足
η
l
−
1
=
η
l
/
2.6
\eta满足\eta^{l-1}=\eta^l/2.6
η满足ηl−1=ηl/2.6时, 只调整最后一层的学习率可以使得效果非常好
倾斜三角学习率
为了使模型参数适应任务特定的特征, 我们希望模型在训练初期快速收敛到参数空间的一个合适区域, 然后再对参数进行细化. 使用相同的学习率或整个训练过程中逐步递减的学习率并不是实现这一目标的最佳方法, 所以论文提出了一种随着迭代进行学习率动态变化的方法, 这个方法中学习率先线性增加然后再线性减小, 如图所示: 公式如下:
p
=
{
t
/
c
u
t
,
i
f
t
<
c
u
t
1
−
t
−
c
u
t
c
u
t
⋅
(
1
/
c
u
t
_
f
r
a
c
−
1
)
c
u
t
=
⌊
T
⋅
c
u
t
_
f
r
a
c
⌋
η
t
=
η
m
a
x
⋅
1
+
p
⋅
(
r
a
t
i
o
−
1
)
r
a
t
i
o
p = \begin{cases}t/cut,\ \ if\ t p={t/cut, if t η m a x \eta_{max} ηmax的差距大小, η t \eta_t ηt是第 t 次迭代的学习率, 这其中的 c u t f r a c , r a t i o , η m a x cut_frac, ratio, \eta_{max} cutfrac,ratio,ηmax都是会提前给出的超参数, 一般给出0.1, 32, 0.01 模板任务分类器微调 为了微调分类器, 我们在预训练的语言模型上增加了两个额外的线性块,每个块使用批量归一化和 dropout, 其中中间层采用 ReLU 激活函数, 最后一层使用 softmax 激活函数来输出目标类别的概率分布, 第一个线性层的输入是经过池化的最后一个隐藏层状态. Concat pooling(连接池化):在文本分类任务中,重要信息通常仅包含在少数词语中,这些词语可能出现在文档的任何地方。由于输入文档可能包含数百个词,如果我们只考虑模型的最后一个隐藏状态,信息可能会丢失。因此,我们将文档最后一个时间步的隐藏状态 h t h_t ht与最大池化和平均池化后的隐藏状态表示连接起来,最大和平均池化是在 GPU 内存允许范围内对多个时间步的隐藏状态 H = h 1 , . . . , h T H={h_1,...,h_T} H=h1,...,hT进行操作: h c = [ h T , m a x p o o l ( H ) , m e a n p o o l ( H ) ] h_c=[h_T,maxpool(H),meanpool(H)] hc=[hT,maxpool(H),meanpool(H)] 其中[]是连接操作 微调目标分类器是迁移学习方法中最关键的部分。过于激进的微调会导致灾难性遗忘,从而消除通过语言建模所获取的信息的优势;而过于谨慎的微调则会导致收敛过慢,并因此导致过拟合。除了判别式微调和三角学习率,我们还提出了逐步解冻策略来微调分类器。 逐步解冻策略; 不要一次性微调所有层,因为这样会增加灾难性遗忘的风险。我们建议从最后一层开始逐步解冻模型,因为这层包含最少的通用知识。我们首先解冻最后一层,并对所有解冻的层进行一次微调。接着,解冻下一个冻结的层,重复此过程,直到在最后一次迭代时微调所有层直到收敛 语言模型使用BPTT进行训练,以使梯度在较大的输入序列中得以传播。为了使大型文档的分类器微调变得可行,我们提出了用于文本分类的 BPTT (BPT3C):我们将文档分成固定长度为 b 的批次。在每个批次的开始,模型使用前一批次的最终状态进行初始化;我们跟踪隐藏状态以进行均值池化和最大池化;梯度会反向传播到那些其隐藏状态对最终预测有贡献的批次。实际应用中,我们使用可变长度的反向传播序列。 双向语言模型:我们不仅限于微调单向的语言模型。在所有实验中,我们同时预训练前向和后向语言模型。我们使用 BPT3C 独立地微调每个语言模型的分类器,并对分类器的预测结果进行平均处理。 以上是关于作者提出的三点新方法的具体介绍, 有关试验部分这里就不继续放出来了