摘要:别说什么“没数据就去标注啊,没钱标注就别做大模型啊”这种风凉话,有些人数据不足也能做大模型,是因为有野心,就能想出来稀缺数据场景下的大模型解决方案,或者整理出本文将要介绍的"Practical Guide to Fine-tuning with Limited
别说什么“没数据就去标注啊,没钱标注就别做大模型啊”这种风凉话,有些人数据不足也能做大模型,是因为有野心,就能想出来稀缺数据场景下的大模型解决方案,或者整理出本文将要介绍的 "Practical Guide to Fine-tuning with Limited Data" 这样的综述。
而有些人,像我,是因为老板想做大模型。
但是训练数据显然是不够的,我们行业主要是因为标注专业性太强,原始数据也本来就少,巧妇难为无米之炊,变不出很多的数据来。但是大模型是一定要做的,每个大点的公司都有老板想要一个大模型,君要臣做大模型,臣不得不做大模型。
所以我就去读了这篇文章,主要就是解决微调大模型时训练数据不足问题。
论文标题:
A Practical Guide to Fine-tuning with Limited Data
论文链接:
作者来自德国和英国,作者全是典型德裔,一作和二作是慕尼黑工业大学医学人工智能方向的,所以可能他们做这篇工作本来是关注小语种 + 医学 +AI 方向的解决思路。
我不是做医学的,不过我们行业的专业性也很强,所以完全可供参考。
除了专业性导致训练数据匮乏之外,小语种也可能导致数据匮乏。我目前倒是不需要解决语言方面的问题,只管中文就行,但是以后万一我们的大模型需要对接小语种客户怎么办呢?所以对于小语种方面我也可以关注关注。
现在大模型应用的范式一般是“预训练-微调-推理(提示学习)”,大模型在海量数据上进行预训练学习到通用知识,通过微调、few-shot 学习等方式将大模型的能力迁移到特定任务领域,这就是迁移学习。
预训练阶段需要海量数据,微调阶段一般也需要足量的数据,否则可能会出现过拟合、泛化能力差和性能不佳等问题。
本文按照预训练、微调、Few-shot 学习三个阶段,总结的全部方法如图所示:
以下我会对文中提及的方法做简单介绍,感兴趣的读者可以去详细阅读论文,或者评论私聊与我讨论。
包括最初的预训练和继续预训练阶段,主要是拿来看的,毕竟这种方案适合有条件的大户人家,从预训练开始做大模型那种。也可以拿来作为选大模型基底的标准,就是说如果没做这些事的大模型就不行,不用选了……
这块方法主要缺点就是计算量大,毕竟要把方法融进复杂的预训练之中:
Cross-lingual alignment(跨语言对齐):用多语种数据集进行预训练,不需要平行语料。高资源语言能够帮助低资源语言提升表现效果。Domain adaptation(领域适应):将特定领域的语料加入预训练阶段,将通用模型调整到特定领域。可以通过多种方式实现,包括使用术语表、引入对抗性域判别器(adversarial domain discriminator)以及结合少量有标签数据进行持续预训练等。Parameter-efficient fine-tuning(PEFT,参数高效训练):在微调时仅更新部分参数(部分微调),而不是更新所有参数(全量微调)。在数据稀缺时,少更新参数能减少灾难性遗忘的风险,而且这种方案也比全量微调更节省计算资源。包括三种方式:Masking-based methods(基于掩码的方法):仅更新神经网络的部分层Adapters(适配器):在 Transformer 里插一层小前馈神经网络(adapter),然后仅更新这个小网络Prefix-tuning(前缀微调):在输入前面加一串可训练的向量作为 soft token,然后仅更新这个“前缀”Reparametrization methods(重参数化):如 Lora 和 KronA 方法等,将大规模的网络权重投影到低维流形上来减少需要训练的参数量Hybrid methods(混合方法):结合了多种方法的优点Embedding learning(嵌入学习):包括确定分词的粒度(词、subword、字符、字节级别),固定词表,还有一些固定模型参数、仅训练词嵌入的方法。对比学习和对抗学习就是不需要手工标注很复杂的标签,但是需要设计好适当且合理的学习目标。感觉还是要看具体的数据情况,要讲个有道理的故事。
Contrastive learning(CL,对比学习):需要平行数据,通过提高相似文本的表征向量相似性、减少不同文本的表征向量相似性来训练模型。Adversarial learning(对抗学习):训练两个目标相矛盾的模型,互相促进模型效果。可以与 PEFT 方法结合使用。Semi-supervised learning(SSL,半监督学习):同时利用有标签和无标签的数据。常见的方法包括自训练(self-training)和协同训练(co-training)。自训练就是在有标签数据上训练模型,然后将置信度高的无标签数据预测结果作为伪标签用于进一步的训练。协同训练是将数据特征拆成两个视角,分别训练模型,用置信度高的无标签数据预测结果加进另一个模型的训练集来重新训练。Unsupervised methods(无监督学习):用无标签数据进行训练,比如大模型预训练学习目标就是自监督(self-supervised)的,语料没有标注标签,计算目标函数使用的标签是语料中本来就有的文本信息。Active learning(AL,主动学习):是一个迭代过程,每次采样最重要的训练数据进行标注。这个“最重要”一般是指模型预测不确定性最高的样本。Few-shot 学习就是仅给出特定领域的少量样本,就让模型学到该领域的知识,做出正确的回答。
In-context learning(ICL,上下文学习):在推理时,先给大模型几个例子,然后再让大模型针对问题参考例子做出回答。Pattern-exploiting training(PET,模式利用训练),或 prompt-based fine-tuning(基于提示的微调):将分类任务格式化为填空格式,使模型能够使用 MLM 目标进行预测。其实我的理解就是做了个更精细、与预训练目标函数更相似的提示模版。Multi-task learning(多任务学习):在多种任务上进行指令微调。我感觉这个对数据集的要求也高,如果做特定领域模型的话,可能就适合那种有不同任务问答对数据的场景,但是我们公司目前只希望大模型能解决特别具体的任务……就是那种专业小模型效果可能比通大模型还好的场景。但是大模型本来的优势就很大一部分在于其通用、泛化能力。那怎么办呢?算了这事以后再说。Meta-learning(元学习):学习新任务和原样本在隐空间中的相似性,借以更新模型参数,更好地适应少量新样本代表的新领域。这块是总结了各种论文的解决方案,以供参考。不过感觉这块其实是纯纯经验之谈,还是得具体问题具体分析:
图中的缩写是:
ER (Experience Replay):将智能体与环境交互过程中获得的经验(即状态、动作、奖励和下一个状态的四元组)缓存,然后从中随机抽取样本用于训练。LLRD (Layer-wise Learning Rate Decay):学习率逐层衰减策略LR (Learning Rate):学习率NLI (Natural Language Inference):自然语言推理,就是给出“前提”问模型“假设”成不成立RAG (Retrieval-Augmented Generation):检索增强最重要的似乎还是选择合适的预训练模型,对于低资源语言或专业领域建议使用较大规模、预训练策略丰富(使用了 cross-lingual alignment 和 domain adaptation)的模型。
(感觉这属于正确的废话,大家都知道大模型只要够好,什么提示模版都不用硬上,只要随便问问,大模型自己就能输出很不错的回答。)
在极低资源场景下,建议先考虑上下文学习,又快又不用训练,表现也可以。如果需要微调,优先考虑 PEFT 方法中的 adapter 和 prefix-tuning 方法。
其他方法也可以用于增强模型表现能力。
如果能弄到更多数据就去弄,能从根本上解决数据不足的问题。
实在是没数据,首先找最厉害的模型基底,先用提示学习(包括 ICL 和 PET)的方式测试模型效果,然后尝试部分微调(如 adapter 和 prefix-tuning),其它方法也可以增强模型效果。具体的方法可以在本文中找参考文献。
有需求的小伙伴在评论区留言。
本文,完。觉得本篇文章不错的,记得随手点个赞、收藏和转发三连,感谢感谢~如果想第一时间收到推送,请记得关注我们⭐~
来源:AIGC研究社一点号