今天浅谈一下「继续预训练」
程序媛驿站最近和同事聊天,聊到一次面试时,同事作为面试官,提问了一个小问题:「如果你拥有的预训练的语料和下游任务的语料分布差异很大,你会怎么做」
「那他答上来了吗」我问到
「没有」他说
一、基本概念
继续预训练是什么?
常见为:
· 基于大规模预训练语言模型(如bert/ernie/gpt等),针对(或使用)下游NLP任务的特定语料,对模型进行领域/任务的继续训练。范式的更迭可以表示为:
· pre-training + fine-tuning
· pre-training + continual pre-training + fine-tuning
为什么要继续预训练?
继续预训练的目的:
· 为了得到适应不同行业/任务领域的预训练模型,提升下游任务的效果
什么时候需要继续预训练?
· 预训练(pre-train)的语料与下游任务(finetune)语料的【数据分布/领域差异】大时
· 例如:现在你的任务是从法律文件中做NER任务,但你使用的bert模型为普通的bert-base-chinese,那么如果想要达到一个下游任务上更好的效果,你最好使用大量的法律领域语料来继续预训练从而得到一个适应法律领域的预训练模型。
那么,领域差距是怎么造成的?
· 领域差距的本质,究其根本原因,还是数据问题。
· 本质:词汇/n-gram不匹配
· 领域差距主要是由特定领域的n-gram的不同以及其出现的上下文的不同造成的
· 不同领域的token/word/n-gram的不同直接导致了语言模型可以在相应领域语料中获取的embedding/feature表征的不同,因此在通用领域上预训练好的模型feature在特定领域语料上使用时往往不会达到最优的效果。
二、如何继续预训练?
数据设计直接设计数据是解决数据的领域差异的一种通用且高效的方法(毕竟领域差距的本质,究其根本原因,还是数据问题)。
· 挖掘领域数据:
· 【任务适应/领域适应】方法
· 如:Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
· BioBERT: a pre-trained biomedical language representation model for biomedical text mining
· SCIBERT: A Pretrained Language Model for Scientific Text
· FinBERT: Financial Sentiment Analysis with Pre-trained Language Models
· 设计训练方法:
· 新词挖掘 + whole word masking
· 行业/领域新词挖掘
· 知识增强的mlm
· 实体 mask
· 如:ERNIE2.0
· 数据增强:
· UDA(Unsupervised Data Augmentation)
· 对抗训
· 练伪标签(半监督)
· 对比学习(infoNCE-loss)
参数设计
· 参数平滑泛化:
· SWA(Stochastic Moving Average,随机滑动平均)和EMA(Exponential Moving Average,指数滑动平均)
模型设计
· 模型学习使用领域知识:
· 固定原始PLM,额外训练一个adapter去学习/利用领域知识
· 如:Taming Pre-trained Language Models with N-gram Representations for Low-Resource Domain Adaptation
· 模型适应不同任务:
· 多任务学习(偏向于Pre-train+Massive Multi-tasking的领域)
· prompt
三、现存问题
数据问题
· 数据数量
· 如数据数量不够/缺少人工标注
· 数据长尾
· 数据普遍遵循长尾理论,存在大多数数据出现次数少,少数数据出现次数多的特点。出现次数少的大多数数据即为长尾数据,长尾数据的特征表示往往很难准确建模。
· 可以通过针对长尾数据做特定的知识引入的方式来解决
· 如:Enhancing Language Model Pre-training with Dictionary
· 数据分布
· 分布不全面或有偏差
· 如现有医疗数据-外科类别,只是医疗体系中的冰山一角,并不能覆盖全部的所需医疗行业知识。
· 类别不均衡
1 可以使用数据增强/过采样/欠采样/集成学习/resample/reweight的方法来解决
· 标注数据的噪音/质量
· 如虽然数据有标注,但是不同标注人员对于数据存在认知偏差
· 可以使用交叉验证/置信学习/聚类分析的方法来解决
知识缺乏
预训练与下游任务存在偏差,模型缺乏下游特定知识
· 前面我们说过「领域差距的本质,究其根本原因,还是数据问题,是不同领域之间的词汇/n-gram的不匹配」,这其中也是领域知识不匹配的问题。
知识引入方法:
· 显式:通过语料/词条释义/SPO等引入知识;隐式:通过向量方法。
· 现有论文&解决方案:
· Enhancing Language Model Pre-training with Dictionary
· Kformer:Knowledge Injection in Transformer Feed-Forward Layers
· Decomposable Knowledge-enhanced Pre-trained Language Model for Natural Language Understanding
但这里需要注意的是:常见数据中的知识含量会很容易的被大规模语言模型学习到,而长尾数据中包含的知识由于模型见的比较少,其中的知识很难学到,所以解决知识问题研究者们通常会从长尾数据入手,但-解决「数据长尾」问题并不等于解决「知识缺乏」问题!
· 因为长尾数据并不一定是需要引入知识的数据,也有可能是错误的表述方法导致出现的数据
· 如:
· 对于句子:「医生:那你最近的话,给宝宝多吃一点白粥米汤淌少喝一点,然后吃一点妈咪爱或者益生菌类的菜。」
· 如果进行长尾数据的检测,其中的「米汤淌」和「妈咪爱」很容易会被判别为长尾数据,其中「妈咪爱」作为一种药的别称或许是需要相关词条/知识的引入,但人类很容易看出「米汤淌」并不需要引入知识
· 如果不加判断的把所有的长尾数据都加入知识,很大概率会引入大量噪音,导致最终效果不升反降。
那么如何判别长尾数据是否需要引入知识呢?
· 一些论文提出了知识实体的判别方法
· 如:Decomposable Knowledge-enhanced Pre-trained Language Model for Natural Language Understanding
理解缺乏
现存的模型普遍缺乏深度理解,偏向于字面匹配,推理成分较少,能力较弱。
· 引用:
· 如:模型无法很好的处理下述问题
虽然现有的大模型在发布/发论文的时候,给出的指标都看起来是非常高(各个任务上都是8/90+),但本质上这些数据集提供的都是一些偏向于使用学习字面含义就能够解决的任务,如文本分类/生成/NER等。
然而,一旦使用一些较难的,需要推理能力的任务,所有的模型都会出现远不如人类的奇差的表现。如:
现有论文&解决方案:
· Chain of Thought Prompting Elicits Reasoning in Large Language Models
大模型推理能力「reasoning」的研究,是一个难点,也是一个亮点
四、参考文献
论文
· Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
· Taming Pre-trained Language Models with N-gram Representations for Low-Resource Domain Adaptation
· Exact solutions to the nonlinear dynamics of learning in deep linear neural networks
· BioBERT: a pre-trained biomedical language representation model for biomedical text mining
· SCIBERT: A Pretrained Language Model for Scientific Text
· FinBERT: Financial Sentiment Analysis with Pre-trained Language Models
· Enhancing Language Model Pre-training with Dictionary
· Knowledge Injection in Transformer Feed-Forward Layers
· Decomposable Knowledge-enhanced Pre-trained Language Model for Natural Language Understanding
· Chain of Thought Prompting Elicits Reasoning in Large Language Models