• Don‘t Stop Pretraining: Adapt Language Models to Domains and Tasks


    在这里插入图片描述

    Abstract

    现有的语言模型大多是在大量且广泛的文本数据上训练而成的。作者思考有没有必要将模型迁移到特定目标任务领域上。作者在4个领域上的8个分类任务,将已经在大量且广泛文本上预训练过的模型进行第二阶段的预训练,作者分别在领域数据、任务数据、增强的任务数据进行了试验,即用这些数据对模型进行第二阶段的预训练,然后再用经过两个预训练阶段后得到的模型生成的数据做分类任务。试验结果表明,不要停止预训练,对于特定的任务,完全可以用任务相关的数据在对语言模型做第二次预训练,能大大提高模型性能。

    1.Instruction

    现有的语言模型都是在大型的通用语料库中做预训练,通过该模型学习得到的向量表示能够在许多不同的任务中都有很好的表现。这里存在一个问题:是否这样大型的预训练语言模型就能通用了呢?还是说在特定的领域上简历特定的预训练模型仍有价值?大而广好?还是小而精好?
    显然,对于特定的领域来说,追求的是该领域的高性能(小而精),因此,在通用语言模型BERT的基础上,有了基于生物医学文本的bioBERT,基于科学文本的sciBERT。
    但是,这些研究的只是某个特定的领域(生物医学、科学),缺少统一的有对比的研究,本文的工作就是做这项任务的。在8个分类任务中,进行了领域自适应训练、任务自适应预训练和增强训练数据的任务自适用预训练。
    源领域、目标领域和任务的关系如下图所示
    在这里插入图片描述
    黄色代表源LM预训练的领域,本文使用RoBERT。
    蓝色标识目标领域,该领域不一定在源领域内,两者可以有重叠,对应于本文中的四个领域。
    黑色代表任务数据,对应本文中的8个任务,每个任务数据都是该任务所在的领域数据的一个子集。
    灰色代表的也是任务数据,但它和黑色有区别,黑色为从灰色部分中非随机采样得到的,并且经过标记的数据,因此灰色是无标记数据,被用在“增强训练数据的任务自适应预训练”实验中。

    2. Model

    领域自适应预训练DAPT

    这篇文章进行领域自适应预训练的方法是直接的,就是在预训练完成的RoBERT基础上,分别使用4个领域的数据接着做第二阶段的预训练,生成4个领域自适应的语言模型。
    四个领域是:生物医学领域(BIOMED)、计算机科学领域(CS)、新闻领域(NEWS)、评论领域(Reviews)
    在这里插入图片描述
    最后一列是经过DAPT之后的,很显然,DAPT之后的各个模型在其对应的领域上都更加拟合。
    各预训练数据集的重合程度如下所示
    在这里插入图片描述
    RoBERT的原始预训练数据集(PT)与News预训练语料库重合部分最多,与BioMed和CS重合较少。根据预训练语料库的相似程度可以预估DAPT的潜力,即预料相似度越低,DAPT自适应的效果越好。

    任务自适应预训练TAPT

    进行TAPT的方法也很简单,即将各个任务的训练数据当做无标签数据来进行第二阶段的预训练。
    在这里插入图片描述

    增强训练数据的任务自适应预训练

    在TAPT中,本文使用的预选连数据仅仅知识任务数据本身,从TAPT的好结果中可以得到启发,如果能有与目标任务数据分数相同的更大的无标签数据集,会不会也会得到好结果呢?
    因此,作者将更大的无标签数据集应用到与训练中

    人工提供较大型的无标签数据集

    在这里插入图片描述

    使用算法自动在领域数据中心挑选出与任务数据分布相同的数据集

    由于并不是所有的任务数据都存在与其同分布的较大型无标签数据集,而DAPT需要消耗较大的计算资源。如果是任务设计者并没有释放更多的、与任务相关的无标签数据,且计算资源短缺的情况下,又怎么从TAPT中收益呢?
    作者结合这两点,提出了根据任务数据在领域数据中挑选出部分无标签数据的算法,从而得到TAPT的增强预训练数据集。
    本文采用的算法是使用领域数据对VAMPIRE进行训练(一个轻量级的预训练框架,用于在数据和计算资源有限的情况下进行有效的文本分类)。在这个向量空间中,对于每个任务数据嵌入点使用KNN找出它最近的K个领域数据嵌入点,所有任务点对应的领域点数据构成增强数据,作为任务相关的无标签数据进行TAPT。
    在这里插入图片描述
    在这里插入图片描述
    K表示KNN中选择的最近的K个点。

    3. 启示

    1. 做领域自适应训练时非常有必要的,但是作为论文的一个创新点有点勉强。
    2. 利用VAMPIRE框架进行文本分类,可以借鉴。
  • 相关阅读:
    在Ubuntu 系统下开发GUI,用哪种开发工具比较好?
    C++入门【c++】
    6-5 头插法创建单链表(C) 分数 10
    冰冰学习笔记:循环队列的实现
    软件测试/测试开发丨ChatGPT:带你进入智能对话的新时代
    UniApp 自定义条件编译详细使用流程
    python读取vivo手机截图,将满屏图片文件移动别的路径
    sql优化
    UEditorPlus v2.6.0发布 编辑器草稿功能,操作体验优化
    LeetCode-380. Insert Delete GetRandom O(1) [C++][Java]
  • 原文地址:https://blog.csdn.net/Jeaksun/article/details/125997988