返回介绍

数学基础

统计学习

深度学习

工具

Scala

四十二、ULMFiT [2018]

发布于 2023-07-17 23:38:25 字数 32123 浏览 0 评论 0 收藏 0

  1. 虽然深度学习模型在许多 NLP 任务上达到了 SOTA ,但这些模型都是从头开始训练的,需要大量的数据集,而且需要几天的时间来收敛。NLP 的研究主要集中在 transductive transfer 上。对于 transductive transfer ,微调 pretrained word embedding (一种简单的迁移技术,只针对模型的第一层)在实践中产生了很大的影响,并被用于大多数 SOTA 的模型。最近的方法是将来自其他任务的 embedding 与不同层的 input 相拼接,仍然从头开始训练 main task model ,并将 pretrained embedding 视为固定参数,限制了其有用性。

    即,这些方法仅仅迁移了 word embedding

    鉴于预训练的好处,我们应该能够比随机初始化模型的其余参数(即,embedding 之外的参数)做得更好。然而,通过微调的 inductive transfer对于 NLP 来说是不成功的。《Semisupervised Sequence Learning》 首次提出对语言模型 language model: LM 进行微调,但需要数百万的 in-domain 文档来实现良好的性能,这严重限制了其适用性。

    论文 《Universal Language Model Fine-tuning for Text Classification》 表明,不是语言模型微调的思想,而是缺少如何有效训练语言模型的知识,从而阻碍了语言模型微调的更广泛的采用。语言模型对小数据集过拟合,并且在用分类器进行微调时遭遇灾难性遗忘 catastrophic forgetting 。与 CV 模型相比,NLP 模型通常更浅,因此需要不同的微调方法。

    因此,论文 《Universal Language Model Fine-tuning for Text Classification》 提出了一种新的方法,即 Universal Language Model Fine-tuning: ULMFiT ,它可以解决这些问题,并为任何 NLP 任务实现强大的 inductive transfer learning ,类似于微调 ImageNet 模型:同样的 3LSTM 架构,具有相同的超参数,除了调优 dropout 超参数之外没有其他改变,在6 个广泛研究的文本分类任务中胜过高度特征工程的模型、以及迁移学习方法。

    论文贡献:

    • 作者提出了 Universal Language Model Fine-tuning: ULMFiT ,这种方法可以用来实现任何 NLP 任务的类似 CV 的迁移学习。

    • 作者提出了 discriminative fine-tuning 、斜三角学习率、逐渐解冻 gradual unfreezing 等新技术,以保留以前的知识并避免微调过程中的灾难性遗忘。

    • 作者在六个有代表性的文本分类数据集上的表现明显优于 SOTA 的方法,在大多数数据集上的误差降低了 18%-24%

    • 作者表明,ULMFiT 能够实现极其 sample-efficient 的迁移学习,并进行了广泛的消融分析。

    • 作者提供了预训练好的模型和代码,以便能够更广泛地采用。

  2. 相关工作:

    • CV 中的迁移学习:在 CV 中,深度神经网络的特征已经被观察到,从第一层到最后一层对应于通用任务过渡到特定任务。由于这个原因,CV 中的大多数工作都集中在模型的第一层的迁移上。近年来,这种方法已经被微调 pretrained model 最后一层或最后几层并让其余层冻结所取代。

    • Hypercolumns:在 NLP 中,最近才提出了超越 transferring word embedding 的方法。流行的方法是预训练 embedding ,通过其他任务捕获额外的上下文。 然后将不同 levelembedding 作为特征,与 word embedding 或中间层的input 相拼接。这种方法在 CV 中被称为 hypercolumns,并在 NLP 中被一些工作所使用,这些工作分别使用语言建模、转述paraphrasing 、蕴含 entailment 和机器翻译等任务进行预训练。在 CV 中,hypercolumns 已经几乎完全被端到端的微调所取代。

    • 多任务学习:一个相关的方向是多任务学习 multi-task learning: MTLMTL 要求每次都要从头开始训练任务,这使得它的效率很低,而且经常需要对特定任务的目标函数进行仔细加权。

    • 微调:微调已经成功地用于相似任务之间的迁移,但已被证明在不相关的任务之间失败(《How Transferable are Neural Networks in NLP Applications? 》)。《Semi-supervised Sequence Learning》 也对语言模型进行了微调,但对 10k 个标记样本上过拟合,并且需要数百万的 in-domain 文档才能有好的表现。相比之下,ULMFiT 利用通用领域的预训练、以及新的微调技术来防止过拟合,即使只有 100 个标记样本,也能在小数据集上取得 SOTA 的结果。

42.1 模型

  1. 我们对 NLP 的最通用的 inductive transfer learningsetting 感兴趣:给定一个源任务TS$ \mathcal T_S $ 和任意目标任务TT$ \mathcal T_T $ ,其中TTTS$ \mathcal T_T\ne \mathcal T_S $ ,我们希望能提高TT$ \mathcal T_T $ 的性能。语言建模 language modeling 可以被看作是理想的源任务,也是 NLPImageNet 的对应物:

    • 首先,它捕获了(与下游任务相关的)语言的许多方面,如长期依赖关系、层级关系 hierarchical relation 、情感 sentiment

    • 其次,与机器翻译和 entailment 等任务相比,语言建模为大多数领域和语言提供的数据数量近乎无限。

    • 此外,预训练的语言模型可以很容易地适配目标任务的特有性质,我们表明这可以大大改善性能。

    • 最后,语言建模已经是现有任务的一个关键组成部分,如机器翻译和对话建模 dialogue modeling

    正式地,语言建模引入了一个假设空间 hypothesis spaceH$ \mathcal H $ ,它应该对许多其他 NLP 任务有用。

  2. 我们提出了 Universal Language Model Finetuning: ULMFiT,它在大型通用领域语料库上预训练语言模型,并使用新技术在目标任务上进行微调。该方法具有普遍性,因为它符合这些实践准则:

    • 它可以在不同的文档 size 、数量、标签类型的任务中工作。

    • 它使用单个架构、单一的训练过程。

    • 它不需要定制化的特征工程或预处理。

    • 它不需要额外的 in-domain 文档或标签。

    在我们的实验中,我们使用 SOTA 的语言模型 AWD-LSTM ,这是一个普通的 LSTM (没有注意力、没有 short-cut connection 、也没有其它额外的复杂组件),具有各种调优好的 dropout rate 超参数。与 CV 类似,我们希望未来可以通过使用更高性能的语言模型来提高下游的性能。

    因为这篇论文是 2018 年提出的,因此还没有使用 transformer-based 语言模型。

  3. ULMFiT 包含如下步骤,如下图所示:

    • (a):通用领域的语言模型预训练。

    • (b):目标任务的语言模型微调。

    • (c):目标任务的分类器微调。

    注意,这里是三个阶段的训练。能否合并为 “通用领域 + 目标任务”的语言模型、目标任务的分类模型两阶段? 或者通用领域的语言模型、目标任务的”语言模型 + 分类模型“ 两阶段?然而,论文对目标任务的语言模型、目标任务的分类模型采用了不同的学习率调度和微调策略,因此需要分开。

  4. General-domain LM pretraining:类似于 ImageNet 的语言模型语料库应该是大型的,并能捕获到语言的通用属性。我们在Wikitext-103 上预训练语言模型,该模型由 28595 篇预处理的维基百科文章和 103M 个单词组成。

    预训练对具有小数据集的任务最有利,即使有100 个标记的样本,也能进行泛化。我们把探索更多样化的预训练语料库留给未来的工作,但预计它们会提高性能。虽然这个阶段是最昂贵的,但它只需要执行一次,并能提高下游模型的性能和收敛速度。

  5. Target task LM fine-tuning:无论用于预训练的 general-domain 数据有多么多样化,目标任务的数据都可能来自不同的分布。因此,我们在目标任务的数据上对语言模型进行微调。给定预训练好的 general-domain LM ,这个阶段收敛得更快,因为它只需要适配目标数据的特殊属性,而且它允许我们训练一个鲁棒的语言模型,即使是针对小数据集。 我们提出了用于微调语言模型的 discriminative fine-tuning 和斜三角学习率:

    • discriminative fine-tuning:由于不同的层捕获不同类型的信息,它们应该被微调到不同的程度。为此,我们提出了一种新的微调方法,即 discriminative fine-tuning

      discriminative fine-tuning 不是对模型的所有层使用相同的学习率,而是允许我们用不同的学习率对每一层进行微调。 针对模型参数θ$ \theta $ 的常规随机梯度下降,其公式为:

      (16)θt=θt1η×θJ(θ)

      其中:η$ \eta $ 为学习率,θJ(θ)$ \nabla_\theta J(\theta) $ 为模型目标函数关于θ$ \theta $ 的梯度。

      对于 discriminative fine-tuning ,我们将θ$ \theta $ 拆分为{θ1,,θL}$ \{\theta^1,\cdots,\theta^L\} $ ,其中θl$ \theta^l $ 包含模型第l$ l $ 层的参数,L$ L $ 为模型的层的数量。类似地,学习率为{η1,,ηL}$ \{\eta^1,\cdots,\eta^L\} $ ,其中ηl$ \eta^l $ 为模型第l$ l $ 层的学习率。则具有 discriminative fine-tuningSGD 更新为:

      (17)θtl=θt1lηl×θlJ(θ)

      实验中我们发现,首先选择ηL$ \eta^L $ 并且仅仅微调最后一层,然后使用ηl1=ηl/2.6$ \eta^{l-1} = \eta^l/2.6 $ 来微调剩余的层,这样的效果最佳。

      因为 target task LM 任务的数据集很小且收敛很快,因此这里多次微调的代价较小。

    • 斜三角学习率:为了使模型参数适配 task-specific features ,我们希望模型在训练开始时能迅速收敛到参数空间的一个合适区域,然后再 refine 模型参数。在整个训练过程中使用相同的学习率、或使用退火的学习率,并不是实现这种行为的最佳方式。相反,我们提出了斜三角学习率 slanted triangular learning rate: STLR,它首先线性增加学习率,然后根据以下 update schedule 来线性衰减,如下图所示:

      (18)cut=T×cutfrac,p={t/cut,ift<cut1tcutcut×(1/cutfrac1),otherwiseηt=ηmax×1+p×(ratio1)ratio

      其中:

      • T$ T $ 是总的训练迭代步数。

      • cutfrac 是增加学习率的迭代步数的占比。

      • cut 是从增加学习率切换到减少学习率的迭代步数的切换点。

      • p$ p $ 是截止到t$ t $ 时刻,学习率增加(或减少)的迭代步数的占比。

      • ratio 指定最小的学习率比最大的学习率小多少。

      • ηt$ \eta_t $ 为截止到t$ t $ 时刻的学习率。

      我们通常选择 cutfrac = 0.1ratio = 32ηmax=0.01$ \eta_\max = 0.01 $ 。STLR 修改了三角学习率,其中学习率具有较短的上升期、较长的衰减期,我们发现这是良好性能的关键。在实验部分,我们与余弦退火 cosine annealing 进行了比较。

  6. Target task classifier fine-tuning:最后,为了对分类器进行微调,我们用两个额外的 linear block 来增强 pretrained language model 。遵从 CV classifier 的标准做法,每个 block 使用了 batch normalizationdropout ,中间层使用 ReLU 激活函数、最后一层使用 softmax 激活函数从而输出关于 target classes 的概率分布。注意,这些 task-specific classifier layers 的参数是唯一从头开始学习的。第一个线性层将最后一个隐藏层的池化后的状态作为输入。

    • Concat pooling:文本分类任务中的信号往往包含在几个单词中,这些单词可能出现在文档的任何地方。由于输入文档可能由数百个单词组成,如果我们只考虑模型的最后一个隐状态,信息可能会丢失。出于这个原因,我们将文档最后一个 time step 的隐状态hT$ \mathbf{\vec h}_T $ ,与尽可能多的 time steps 的隐状态H={h1,,hT}$ \mathbf H = \left\{\mathbf{\vec h}_1,\cdots,\mathbf{\vec h}_T\right\} $ (只要能够满足 GPU 内存的限制)的 max-pooled representationmean-pooled representation 相拼接:

      (19)hc=[hT;maxpool(H);meanpool(H)]

      其中[;]$ [\cdot;\cdot] $ 表示向量拼接。

    • Gradual unfreezing:微调 target classifier 是迁移学习方法中最关键的部分:

      • 过于激进的微调会导致灾难性的遗忘,消除了通过语言建模捕获的信息的好处。

      • 过于谨慎的微调会导致缓慢的收敛(以及由此产生的过拟合)。

      除了 discriminative finetuning 和斜三角学习率,我们还提出了针对 fine-tuning the classifier 的渐进式解冻。我们建议从最后一层开始逐步解冻模型,而不是一下子对所有层进行微调,因为这样做有灾难性遗忘的风险:

      • 我们首先解冻最后一层,并微调所有未被冻结的层一个 epoch

        此时,未被解冻的层包括:最后一层、以及 target classifier

      • 然后我们解冻下一个较低的 frozen layer 并微调一个 epoch

        此时解冻的层有两层了。

      • 我们不停地重复这种解冻操作,直到我们对所有层进行微调。

      这类似于 "chain-thaw" ,只是我们每次在 "解冻"层的集合中增加一个层,而不是每次只训练一个层。

      discriminative fine-tuning 、斜三角学习率、渐进式解冻本身都是有益的,但我们在实验部分表明,它们相互补充,使我们的方法在不同的数据集上表现良好。

    • BPTT for Text Classification:语言模型是通过 back-propagation through time: BPTT 来训练的,以实现大输入序列的梯度传播。为了使大型文件的分类器的微调可行,我们提出了 BPTT for Text Classification: BPT3C

      • 我们将文件分为 batch size = bbatch

      • 在每个 batch 的开始,模型用前一个 batchfinal state 进行初始化。

      • 我们跟踪 hidden states 从而用于计算 mean-poolingmax-pooling

      • 梯度被反向传播到其隐状态对 final prediction 有贡献的 batch

      在实践中,我们使用可变长度的反向传播序列。

    • 双向语言模型:我们不限于微调单向语言模型。在我们所有的实验中,我们同时预训练一个 forward LM 和一个 backward LM 。我们使用 BPT3C 为每个 LM 独立微调一个分类器,并对分类器的预测进行平均。

    这些训练方式过于古老,在 transformer-based 模型中已经不被使用。

42.2 实验

  1. 数据集:我们在六个被广泛研究的数据集上评估我们的方法,这些数据集具有不同的文档数量和不同的文档长度,对应于三种常见的文本分类任务:情感分析、问题分类、主题分类:

    • Sentiment Analysis:对于情感分析,我们在二元电影评论 IMDb 数据集、二分类版本和五分类版本的 Yelp 评论数据集上评估我们的方法。

    • Question Classification:我们使用六分类版本的小型 TREC 数据集,该数据集由开放领域的、基于事实的问题组成,被划分到一组语义类别 semantic category

    • Topic Classification:对于主题分类,我们对大规模 AG 新闻数据集和 DBpedia 本体数据集进行评估。

    数据集和任务的统计信息如下表所示。

  2. 预处理:我们使用与早期工作相同的预处理方法(《Deep pyramid convolutional neural networks for text categorization》《Learned in Translation: Contextualized Word Vectors》)。此外,为了让语言模型能够捕获到可能与分类相关的方面,我们为大写字母的单词、elongationrepetition 添加了 special tokens

  3. 超参数:我们感兴趣的是一个在各种任务中表现鲁棒的模型。为此, 默认情况下,我们在不同的任务中使用相同的超参数集合,我们在 IMDb 验证集上进行调优。

    我们使用 AWD-LSTM 语言模型, emebdding size = 4003 层,每层 1150 个隐藏单元,BPTTbatch size = 70 。默认情况下我们对所有的层采用 dropout rate = 0.4,但是对 RNN 层采用 dropout rate = 0.3embedding layer 采用 dropout rate = 0.05 、对 RNN hidden-to-hidden matrix 采用 dropout rate = 0.5

    classifier 有一个大小为 50 的隐层。我们使用β1=0.7$ \beta_1= 0.7 $ 的 Adam ,而不是默认的β1=0.9$ \beta_1=0.9 $ 和β2=0.99$ \beta_2=0.99 $ 。我们使用 batch size = 64 ,用于微调语言模型、分类器的 base learning rate 分别为 0.0040.01 ,并在每个任务的验证集上微调 epoch 的数量。除此之外,我们还使用了 《Regularizing and Optimizing LSTM Language Models》 中使用的相同做法。

  4. baseline

    • 对于 IMDb 数据集和 TREC-6 数据集,我们与 CoVe 进行比较,这是一种用于 NLP 的最新的迁移学习方法。

    • 对于 AG 数据集、Yelp 数据集和 DBpedia 数据集,我们与 《Deep pyramid convolutional neural networks for text categorization》SOTA 的文本分类方法进行比较。

  5. 为了保持一致性,我们以错误率的形式报告所有结果(越低越好),结果如下表所示。可以看到,我们的方法在所有数据集上都超越了 baseline 。这很有前景,因为现有的 SOTA 需要复杂的架构、多种形式的注意力、和复杂的 embedding 方案,而我们的方法采用了普通的 LSTMdropout

  6. 消融研究:我们在 IMDbTREC-6AG 这三个代表不同任务、类型和规模的语料库上进行了实验。在所有的实验中,我们从训练集中分离出 10% 作为验证集,并在这个验证集上报告单向语言模型的错误率。我们对分类器微调了 50epoch ,并对除了 ULMFiT 外的所有方法进行了带 early stopping 的训练。

    • Low-shot learning:迁移学习的主要好处之一是能够用少量的标签为任务训练一个模型。我们在两种情况下对 ULMFiT 进行了评估:只有标记样本被用于 LM 的微调("supervised" ),所有的任务数据都可以用来微调 LM"semi-supervised" )。我们将 ULMFiT 与从头开始训练("from scratch")进行比较。我们保持固定的验证集,并使用与之前实验相同的超参数。实验结果如下表所示。可以看到:

      • IMDbAG 上,仅仅具有 100 个标记样本的 supervised ULMFiT ,就匹敌了具有 10 倍和 20 倍数据的从头开始训练的性能。这清楚地表明了通用领域的语言模型预训练的好处。

        如果我们允许 ULMFiT 也利用未标记的样本,那么具有 100 个标记样本的 supervised ULMFiT ,能够匹敌了具有 50 倍和 100 倍数据的从头开始训练的性能。

      • TREC-6 上,ULMFiT 明显改善了从头开始的训练。由于样本内容更短、数量更少,supervised ULMFiTsemi-supervised ULMFiT 取得了相似的结果。

    • 预训练的影响:我们在下表中比较了不使用预训练、以及使用预训练的效果(预训练在 WikiText-103 上进行)。预训练对中小规模的数据集最有用,这在商业应用中是最常见的。然而,即使对于大型数据集,预训练也能提高性能。

    • LM质量的影响:为了衡量选择一个合适的语言模型的重要性,我们在下表中比较了具有相同超参数、没有任何 dropout 的常规 LM ,以及具有调优的 dropout 参数的 AWD-LSTM LM 。使用我们的微调技术,即使是常规的语言模型在较大的数据集上也能达到令人惊讶的良好性能。在较小的 TREC-6 数据集上,没有 dropout 的常规语言模型有过拟合的风险,从而降低了性能。

    • LM fine-tuning 的影响:我们比较了几种微调方法:没有微调/微调整个模型("Full",即最常用的微调方法)、具有/没有 discriminative fine-tuning"Discr")、斜三角学习率( "Stlr")。微调语言模型对较大的数据集最为有利。"Discr""Stlr" 提高了所有三个数据集的性能,并且在较小的 TREC-6 上是必要的(在 TREC-6 数据集上,常规微调是没有好处的)。

    • classifier fine-tuning 的影响:我们比较了几种微调方法:头开始训练、微调完整模型("Full")、只微调最后一层("Last")、"Chain-thaw"、渐进式解冻('Freez')。我们进一步评估 discriminative fine-tuning'Discr' )和斜三角学习率('Stlr' )的重要性。我们将后者与另一种激进的余弦退火调度器('Cos' )进行比较。我们对 'Discr' 使用的是学习率ηL=0.01$ \eta^L=0.01 $ ,对 'Chain-thaw' 使用的是最后一层的学习率 0.001 而其他层的学习率为 0.0001 ,其它方法使用 0.001 的学习率。结果如下表所示。

      • 微调分类器比从头开始训练有明显的改善,特别是在小型的 TREC-6 上。

      • CV 中的标准微调方法,即 "Last" ,在这里效果严重不佳,而且永远无法将训练误差降低到 0

      • "Chain-thaw" 在较小的数据集上效果较好,但是在大型的 AG 数据集上效果较差。

      • "Freez" 提供了与 "Full" 类似的性能。

      • 余弦退火方法在大数据集上与斜三角学习率有竞争力,但在小数据集上表现不佳。

      • 最后,完整的 ULMFiT 分类器微调(最下面一行)在 IMDBTREC-6 上实现了最好的性能,在 AG 上也有竞争力。重要的是,ULMFiT是唯一在各方面都表现出优异性能的方法,因此是唯一的通用方法。

    • 分类器微调行为:虽然我们的结果表明,如何微调分类器会有很大的不同,但目前在 NLP 中对 inductive transfer 的微调的探索不足,因为它大多被认为是无益的。为了更好地理解我们模型的微调行为,我们在下图中比较了训练期间用 ULMFiT 微调的分类器、以及用'Full' 微调的分类器的验证误差。

      • 在所有的数据集上,在训练的早期,例如在 IMDb 上的第一个 epoch 之后,对 Full 模型的微调导致了最低的误差。然后,随着模型开始过拟合,并且丢失了通过预训练获得的知识,误差会增加。

      • 相比之下,ULMFiT 更稳定,没有这种灾难性的遗忘;性能保持相似或改善,直到最后的 epoch ,这显示了学习率调度的积极作用。

    • 双向性的影响:以训练第二个模型为代价,将 forward LM-classifierbackward LM-classifier 的预测 ensemble 在一起,带来了大约 0.5-0.7 的性能提升。在 IMDb 上,我们将测试误差从单个模型的 5.30 降低到双向模型的 4.58

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文