缺钱缺数据时的大模型微调方法汇总

AITNT-国内领先的一站式人工智能新闻资讯网站
# 热门搜索 #
AITNT-国内领先的一站式人工智能新闻资讯网站 搜索
缺钱缺数据时的大模型微调方法汇总
8211点击    2024-12-09 09:30

别说什么“没数据就去标注啊,没钱标注就别做大模型啊”这种风凉话,有些人数据不足也能做大模型,是因为有野心,就能想出来稀缺数据场景下的大模型解决方案,或者整理出本文将要介绍的 "Practical Guide to Fine-tuning with Limited Data" 这样的综述。


而有些人,像我,是因为老板想做大模型。


但是训练数据显然是不够的,我们行业主要是因为标注专业性太强,原始数据也本来就少,巧妇难为无米之炊,变不出很多的数据来。但是大模型是一定要做的,每个大点的公司都有老板想要一个大模型,君要臣做大模型,臣不得不做大模型。


所以我就去读了这篇文章,主要就是解决微调大模型时训练数据不足问题。


论文标题:


A Practical Guide to Fine-tuning with Limited Data


论文链接:


https://arxiv.org/pdf/2411.09539


缺钱缺数据时的大模型微调方法汇总


作者来自德国和英国,作者全是典型德裔,一作和二作是慕尼黑工业大学医学人工智能方向的,所以可能他们做这篇工作本来是关注小语种 + 医学 +AI 方向的解决思路。


我不是做医学的,不过我们行业的专业性也很强,所以完全可供参考。


除了专业性导致训练数据匮乏之外,小语种也可能导致数据匮乏。我目前倒是不需要解决语言方面的问题,只管中文就行,但是以后万一我们的大模型需要对接小语种客户怎么办呢?所以对于小语种方面我也可以关注关注。


现在大模型应用的范式一般是“预训练-微调-推理(提示学习)”,大模型在海量数据上进行预训练学习到通用知识,通过微调、few-shot 学习等方式将大模型的能力迁移到特定任务领域,这就是迁移学习


预训练阶段需要海量数据,微调阶段一般也需要足量的数据,否则可能会出现过拟合、泛化能力差和性能不佳等问题。


本文按照预训练、微调、few-shot 学习三个阶段,总结的全部方法如图所示:


缺钱缺数据时的大模型微调方法汇总


以下我会对文中提及的方法做简单介绍,感兴趣的读者可以去详细阅读论文,或者评论私聊与我讨论。


预训练阶段


包括最初的预训练和继续预训练阶段,主要是拿来看的,毕竟这种方案适合有条件的大户人家,从预训练开始做大模型那种。也可以拿来作为选大模型基底的标准,就是说如果没做这些事的大模型就不行,不用选了……


这块方法主要缺点就是计算量大,毕竟要把方法融进复杂的预训练之中:


  1. Cross-lingual alignment(跨语言对齐):用多语种数据集进行预训练,不需要平行语料。高资源语言能够帮助低资源语言提升表现效果。
  2. Domain adaptation(领域适应):将特定领域的语料加入预训练阶段,将通用模型调整到特定领域。可以通过多种方式实现,包括使用术语表、引入对抗性域判别器(adversarial domain discriminator)以及结合少量有标签数据进行持续预训练等。


微调阶段


  1. Parameter-efficient fine-tuning(PEFT,参数高效训练):在微调时仅更新部分参数(部分微调),而不是更新所有参数(全量微调)。
  2. 在数据稀缺时,少更新参数能减少灾难性遗忘的风险,而且这种方案也比全量微调更节省计算资源。包括三种方式:
  3. Masking-based methods(基于掩码的方法):仅更新神经网络的部分层
  4. Adapters(适配器):在 Transformer 里插一层小前馈神经网络(adapter),然后仅更新这个小网络
  5. Prefix-tuning(前缀微调):在输入前面加一串可训练的向量作为 soft token,然后仅更新这个“前缀”
  6. Reparametrization methods(重参数化):如 Lora 和 KronA 方法等,将大规模的网络权重投影到低维流形上来减少需要训练的参数量
  7. Hybrid methods(混合方法):结合了多种方法的优点
  8. Embedding learning(嵌入学习):包括确定分词的粒度(词、subword、字符、字节级别),固定词表,还有一些固定模型参数、仅训练词嵌入的方法。


对比学习与对抗学习


对比学习和对抗学习就是不需要手工标注很复杂的标签,但是需要设计好适当且合理的学习目标。感觉还是要看具体的数据情况,要讲个有道理的故事。


  1. Contrastive learning(CL,对比学习):需要平行数据,通过提高相似文本的表征向量相似性、减少不同文本的表征向量相似性来训练模型。
  2. Adversarial learning(对抗学习):训练两个目标相矛盾的模型,互相促进模型效果。可以与 PEFT 方法结合使用。


受限的有监督学习


  1. Semi-supervised learning(SSL,半监督学习):同时利用有标签和无标签的数据。常见的方法包括自训练(self-training)和协同训练(co-training)。自训练就是在有标签数据上训练模型,然后将置信度高的无标签数据预测结果作为伪标签用于进一步的训练。协同训练是将数据特征拆成两个视角,分别训练模型,用置信度高的无标签数据预测结果加进另一个模型的训练集来重新训练。
  2. Unsupervised methods(无监督学习):用无标签数据进行训练,比如大模型预训练学习目标就是自监督(self-supervised)的,语料没有标注标签,计算目标函数使用的标签是语料中本来就有的文本信息。
  3. Active learning(AL,主动学习):是一个迭代过程,每次采样最重要的训练数据进行标注。这个“最重要”一般是指模型预测不确定性最高的样本。


Few-shot 阶段


Few-shot 学习就是仅给出特定领域的少量样本,就让模型学到该领域的知识,做出正确的回答。


  1. In-context learning(ICL,上下文学习):在推理时,先给大模型几个例子,然后再让大模型针对问题参考例子做出回答。
  2. Pattern-exploiting training(PET,模式利用训练),或 prompt-based fine-tuning(基于提示的微调):将分类任务格式化为填空格式,使模型能够使用 MLM 目标进行预测。其实我的理解就是做了个更精细、与预训练目标函数更相似的提示模版。
  3. Multi-task learning(多任务学习):在多种任务上进行指令微调。我感觉这个对数据集的要求也高,如果做特定领域模型的话,可能就适合那种有不同任务问答对数据的场景,但是我们公司目前只希望大模型能解决特别具体的任务……就是那种专业小模型效果可能比通大模型还好的场景。但是大模型本来的优势就很大一部分在于其通用、泛化能力。那怎么办呢?算了这事以后再说。
  4. 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),其它方法也可以增强模型效果。具体的方法可以在本文中找参考文献。


以后可能会分享一下我在数据永远不够条件下做大模型的实践思路和工作成效,以本文作为初步调研结果。


文章来自于“夕小瑶科技说”,作者“不如水”。


缺钱缺数据时的大模型微调方法汇总

AITNT-国内领先的一站式人工智能新闻资讯网站
AITNT资源拓展
根据文章内容,系统为您匹配了更有价值的资源信息。内容由AI生成,仅供参考
1
cursor

【免费】cursor-auto-free是一个能够让你无限免费使用cursor的项目。该项目通过cloudflare进行托管实现,请参考教程进行配置。

视频教程:https://www.bilibili.com/video/BV1WTKge6E7u/

项目地址:https://github.com/chengazhen/cursor-auto-free?tab=readme-ov-file


2
智能体

【开源免费】AutoGPT是一个允许用户创建和运行智能体的(AI Agents)项目。用户创建的智能体能够自动执行各种任务,从而让AI有步骤的去解决实际问题。

项目地址:https://github.com/Significant-Gravitas/AutoGPT


【开源免费】MetaGPT是一个“软件开发公司”的智能体项目,只需要输入一句话的老板需求,MetaGPT即可输出用户故事 / 竞品分析 / 需求 / 数据结构 / APIs / 文件等软件开发的相关内容。MetaGPT内置了各种AI角色,包括产品经理 / 架构师 / 项目经理 / 工程师,MetaGPT提供了一个精心调配的软件公司研发全过程的SOP。

项目地址:https://github.com/geekan/MetaGPT/blob/main/docs/README_CN.md

3
RAG

【开源免费】graphrag是微软推出的RAG项目,与传统的通过 RAG 方法使用向量相似性作为搜索技术不同,GraphRAG是使用知识图谱在推理复杂信息时大幅提高问答性能。

项目地址:https://github.com/microsoft/graphrag

【开源免费】Dify是最早一批实现RAG,Agent,模型管理等一站式AI开发的工具平台,并且项目方一直持续维护。其中在任务编排方面相对领先对手,可以帮助研发实现像字节扣子那样的功能。

项目地址:https://github.com/langgenius/dify


【开源免费】RAGFlow是和Dify类似的开源项目,该项目在大文件解析方面做的更出色,拓展编排方面相对弱一些。

项目地址:https://github.com/infiniflow/ragflow/tree/main


【开源免费】phidata是一个可以实现将数据转化成向量存储,并通过AI实现RAG功能的项目

项目地址:https://github.com/phidatahq/phidata


【开源免费】TaskingAI 是一个提供RAG,Agent,大模型管理等AI项目开发的工具平台,比LangChain更强大的中间件AI平台工具。

项目地址:https://github.com/TaskingAI/TaskingAI

4
微调

【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。

项目地址:https://github.com/InternLM/xtuner

5
prompt

【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。

项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md

在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0