大模型微调概述
1. 什么是通用大模型?
大模型(Large Model)是指在深度学习中具有大量参数和复杂结构的机器学习模型,通常用于处理复杂的任务,如自然语言处理、计算机视觉和语音识别等。这些模型的参数数量通常在数亿到数千亿之间,能够从海量数据中学习到丰富的特征和模式。
- 按照应用领域分类
语言大模型(NLP):专注于自然语言处理任务,如文本生成、问答和翻译。例如,GPT系列(如GPT-3、GPT-4)、BERT、T5等。
视觉大模型(CV):用于图像处理和分析的模型,如图像分类、目标检测等。例如,ResNet、VGG、Vision Transformer(ViT)等。
多模态大模型:能够处理多种类型数据(如文本、图像、音频)的模型。例如,CLIP(结合图像和文本的理解)和DALL-E(生成图像的模型)等。
- 按照模型规模分类

通用大模型:可以在多个领域和任务上通用的大模型,具有较强的泛化能力。使得在不同的应用场景中都能发挥作用,相当于AI的“通识教育”。
行业大模型:针对特定行业或领域进行优化的大模型,通常使用行业相关的数据进行预训练或微调。能够更好地理解行业特有的术语、数据和上下文,从而提供更精准的结果。
垂直大模型:专注于某一行业特定任务或场景的大模型,通常使用任务相关的数据进行训练,以提高在该任务上的性能。导致在特定应用场景中表现优异,但在其他领域的适用性可能较低。
2. 大模型微调企业应用与发展
2.1 微调的前景



大模型微调技术对于一家希望利用大模型进行创新的公司非常重要,或者说只要想用大模型好好的为一个行业领域或者公司服务,模型微调都是`必不可少的一环`。

1、适应特定领域问答
经过预训练的基座模型虽然可以完成很多任务,比如回答问题、总结数据、编写代码等。但是,并没有一个模型可以解决所有的问题,尤其是行业内的专业问答、关于某个组织自身的信息等,是通用大模型所无法触及的。在这种情况下,就需要使用特定的数据集,对合适的基座模型进行微调,以完成特定的任务、回答特定的问题等。在这种情况下,微调就成了重要的手段。 为什么大模型不能很很好地的回答特定场景的问题?
2、基础数据缺少特定领域的数据
其根本原理在于,机器学习模型只能够代表它所接收到的数据集的逻辑和理解,而对于其没有获得的数据样本,其并不能很好地识别/理解,所以对于大模型而言,就无法很好地回答特定场景下的问题。
例如,一个通用大模型涵盖了许多语言信息,并能够进行流畅的对话。但是如果需要医药方面能够很好地回答患者问题的应用,就需要为这个通用大模型提供很多新的数据以供学习和理解。例如,布洛芬到底能否和感冒药同时吃?有没有什么注意事项?为了确定模型可以回答正确,我们就需要对基础模型进行微调使其更好的解答相关领域问题。

3、预训练成本高(对比下微调就是`花小钱办大事`)
计算资源需求:大型模型的训练需要大量的计算资源,通常依赖于高性能的GPU(图形处理单元)或TPU(张量处理单元)。这些硬件设备的采购和维护成本非常高,尤其是在训练过程中需要长时间运行时。 电力消耗、 数据处理和存储(海量的数据,数据的收集、清洗和存储等多个环节。数据的获取和管理也需要投入大量的时间和资源)、研发和人力成本(专业的团队,包括数据科学家、工程师和研究人员)
谷歌的T5模型:训练110亿参数的T5模型的单次运行成本超过130万美元。如果考虑到多次运行和其他小模型的训练,整个项目的成本可能达到1000万美元。BERT模型:1.1亿参数的BERT模型训练成本在0.25万到5万美元之间,而15亿参数的BERT模型训练成本则在8万到160万美元之间

4、数据安全与隐私
许多应用场景中,数据的安全性和隐私保护至关重要。使用预训练模型时,数据通常需要上传到云端进行处理,这可能带来数据泄露的风险。通过在本地进行微调,可以避免将敏感数据上传到云端,从而确保数据的安全和隐私。
这对于金融、医疗等对数据安全有严格要求的行业尤为重要。
5、降低计算成本
prompt过长时大模型会进行截断,会导致上下文理解不完整,直接影响大模型推理结果,相对提示词到上限后也会影响大模型响应效果与对应token所需要的费用。微调后大模型对指定领域相对会比较熟悉,从而可以使用简洁的提示,减少token的输入,降低使用成本的同时也会让大模型响应更快。
最终目的:`将通用模型转变为专用模型`,弥合通用预训练模型与特定应用需求之间的差距,确保语言模型更贴近人类的期望
2.2 模型微调的场景与案例
1. 特定任务需求
行业特定应用:如医疗、金融、法律等,微调可以帮助模型学习行业特有的术语和知识。例如,医疗领域的模型需要通过学习专业知识才能能够回答患者的具体问题。
文本分类和情感分析:社交媒体评论的情感分类。通过微调模型,使其能够识别评论是正面、负面还是中性,帮助企业了解用户反馈并改进产品或服务。
2. 数据集较小的情况
当可用的数据集较小且与预训练模型的任务存在较大差异时,微调可以帮助模型更好地适应新任务。通过使用特定领域的数据进行微调,模型能够在小样本情况下提高对当前专业的处理性能。
例如:当企业推出新产品时,可能只有有限的用户反馈数据。通过微调大模型,企业可以在小样本数据上进行训练,使模型能够有效地分析用户对新产品的反馈,识别潜在问题和改进建议。
3. 语言风格和个性化需求
希望模型生成的文本具有特定的语言风格或个性。例如,企业希望其客服机器人能够使用更友好的语气与客户交流,微调后使得客服机器人在回答问题时更加友好和幽默,又或者说希望模型使用方言回答。
4. 复杂的业务规则
通用大模型不具有对某一行业复杂业务规则的推断与监督,微调可以使模型学习这些规则,从而在实际应用中更好地执行业务流程。例如,在线银行业务需要遵循特定的审核流程和规则。通过使用合规相关的数据集对模型进行微调,使其能够识别和标记潜在的合规风险,如可疑交易或不符合规定的客户行为。
5. 提高模型的准确性和泛化能力
当现有模型在特定任务上的表现不理想时,微调可以通过引入新的数据和任务特定的训练来提升模型的准确性和泛化能力。例如:在线教育平台的自动评分系统:在线教育平台可以微调大模型,使其能够更准确地评估学生的作业和考试。通过使用历史评分数据对模型进行微调,提升其在特定学科和题型上的评分准确性。
各行业微调模型的案例
医学类:本草


数据:
公开和自建的中文医学知识库
2023年关于肝癌疾病的中文医学文献,利用GPT3.5接口围绕医学文献多轮问答数据
算力:
A100-SXM-80GB,10 epochs, 2h17m, batch_size=128
院校:哈尔滨工业大学社会计算与信息检索研究中心健康智能组
法律类:LaWGPT


基础模型: Chinese-Alpaca-Plus-7B
数据:
https://github.com/pengxiao-song/awesome-chinese-legal-resources
官方数据
中国检查网:起诉书等
中国裁判文书网:裁决书、裁定书、决定书等
中国法律智能技术评测(CAIL)历年赛题数据
算力: 8 x NVIDIA Tesla V100 32GB, 24h/epoch (pre-training), 12/epoch (fine-tuning)
院校: 南京大学
金融类:FinGPT


FinGPT v1
ChatGLM-6B + LoRA
FinGPT v2
LLaMA-7B + LoRA
数据:Reuters、CNBC、东方财富、Financial Modeling Prep、Twitter、Facebook 等
3. 大模型微调的必要性
3.1 微调与RAG的区别


场景 | RAG | 微调 |
---|---|---|
动态数据 | ✅ | |
成本 | ✅ | |
可解释性 | ✅ | |
场景需要通用能力 | ✅ | |
特色能力 | ✅ | |
延迟 | ✅ | |
微智能设备 | ✅ | |
模型幻觉 | ✅ | ✅ |
场景一:医学论文整理
1、了解医学领域相关知识:微调
2、依赖整理能力:微调
场景二:智慧库房
1、需要经常更新库房清单:RAG
2、具有正常对话能力:RAG
场景三:智慧销售
1、经常更新产品数据:RAG
2、销售语气让人感到舒适有特色:微调
3.2 微调与其他技术方向的区别与联系
技术阶段 | 面向人群 | 技术积累 | 应用场景 | 特征总结 |
---|---|---|---|---|
提示工程 (Prompt Engineering) | 终端用户 | 对ChatGPT等应用的提示词有基本的了解和使用 | 文本生成、机器翻译等 | 门槛低,易于上手 |
AI智能体 (Agents) | 大模型应用开发人员 | 了解大模型基础原理和理论,熟悉特定领域的业务逻辑和流程 | 自动客服、虚拟助手 | 侧重于交互性和用户体验 |
大模型微调 (Fine-tuning) | 领域模型研发、私有化团队开发人员 | 掌握神经网络和机器学习概念,有数据处理和模型训练经验 | 语义理解、领域知识学习 | 通用性强、性价比高 |
预训练技术 (Pre-training) | 大模型研究开发人员、数据科学家 | 熟悉深度学习原理和网络架构,有大规模数据处理和模型训练经验 | 多模态学习、语言模型预训练 | 前期投入大、效果显著 |
预训练是一个小学生。
微调大模型就相当于一个具有写作能力的小学生。
提示工程就是老师给出的文章大纲,希望学生按照这个格式输出。
Agents就是学生可以使用的工具:百度、书籍等。
提示工程、agents的工具本质上都是来服务于大模型,如果大模型本身具有期望领域的能力,输出的效果会更好。三个融合在一起才能在指定领域发挥出最好的效果。
就好比专门学文科学生A、普通学生B、专门学理科的C来写一首散文诗,同样大纲、有限且相同工具写出来的效果一定是A>B>C ,B如果想要写出与A相同水平的散文诗就要使用更好的提示词以及更丰富的工具才行。
4.怎么去微调模型
4.1微调的步骤

1. 选择预训练模型
选择一个在大规模数据集上预训练好的模型,如BERT、GPT等。
2. 准备新任务数据集
收集并处理与特定任务相关的数据集,包括训练集、验证集和测试集。
3. 设置微调参数及方法
根据任务特性和模型特点,设置合适的微调参数,如学习率、批处理大小、训练轮次等。
4. 进行微调训练
在新任务数据集上对预训练模型进行进一步训练,通过调整模型权重和参数来优化模型在新任务上的性能。
5. 评估与调优
使用验证集对微调后的模型进行评估,并根据评估结果调整模型结构和参数,直到达到满意的性能。
6. 模型部署
将微调后的模型部署到实际的应用场景中,以实现模型的实用价值。
4.2 微调的必备条件

2、工具运用:微调的热度催生了很多框架,操作界面友好大大降低了代码门槛,这部分至少要掌握一种框架。如果可以最好基于原生模型进行微调,会更加清楚的了解大模型微调的全生命周期。增加微调的印象处理异常会更加得心应手。
3、应用实践:开发人员必备技能,会让程序输出效果更好、鲁棒性更强程序更有适应性。例如国产芯片部署、适配企业的模型选型。
5. 大模型微调方向概述
5.1 微调模型的范围

选择原则:最好能支持私有服务器部署及线下微调,数据是非常敏感的信息,大部分公司对数据保密性要求非常高,线上训练及闭源代码通常会将数据传给第三方,传输过程可能会有数据泄露的风险,不要因为一时便捷引起数据泄露的风险。
线上微调:大部分使用对数据保密要求不那么强烈的情况。
5.2 根据微调方法分类
全量微调(Full Fine-tuning)
全量微调是指在预训练好的大模型基础上,针对特定任务或特定数据集进行进一步的训练,来适应新的任务需求。预训练模型通常在大规模数据上进行了广泛的训练,已经具备了一定的通用知识和特征提取能力。通过全量微调,可以将这些通用知识迁移到特定任务上,从而提高模型在该任务上的性能。
主要调整内容:
1. 模型参数
所有层的权重:预训练模型的所有层(包括输入层、隐藏层、输出层等)的权重都会在微调过程中进行更新。每一层的所有部分都会根据提供的数据进行优化。
偏置项:除了权重外,每个神经元的偏置项也会被调整。
2. 任务特定的输出层调整:通常情况下,预训练模型的输出层不适合特定任务。因此,需要在预训练模型的基础上添加任务特定的输出层。
3. 学习率:初始学习率通常设置得较小,以避免破坏预训练模型的权重。
4.损失函数.......
优点:
充分利用预训练模型的通用知识,减少从零开始训练所需的时间和资源。数据集较小情况下性能较为好
缺点:
计算资源大,数据集较小情况下,容易导致过拟合,大规模数据集上消耗时间长。
部分微调-高效微调(Parameter-Efficient Fine-Tuning, PEFT)
模型中间层方向
定义:只更新模型的顶层或少数几层,而保持预训练模型的底层参数不变。
应用场景:目标任务与预训练模型之间有一定相似性,或者任务数据集较小。但是微调性能很难达到最佳。
逐层微调(Layer-wise Fine-tuning)
定义:从顶层开始,逐渐向底层推进。这种方法允许更细粒度地控制模型的调整过程,直到所有层都被微调。
应用场景:适用于需要精细调整模型的任务。但是需要多次调整与训练,且花费时间较长
动态微调(Dynamic Fine-tuning)
定义:在微调过程中动态调整学习率、批量大小等超参数,以优化模型性能。
应用场景:适用于需要高性能和高精度的任务。实现方式复杂且对资源要求较高
提示词方向
前缀微调(Prefix-tuning):

理论方法:冻结原有预训练模型,在transformer的每一层增加一个神经网络来引导大模型行每一层针对这个这个特定任务进行指导性输出与权重倾斜计算。当 有点类似于大模型刚开始时候,大家不知道怎么使用大模型,怎么给提示让大模型更好理解我们想法,索性针对专项方向比如图片生成类型、生成范围等直接进行框选,让模型专门来处理这种问题。不用大家一条一条的去试提示词。
假设我们有一个任务,要求模型生成一个描述图片的句子。输入为["这张图片的内容是:", "图片内容"]
初始化前缀向量:
增加前缀向量”这是一辆家用小轿车“,假设向量化后 [p1, p2, p3]。
输入序列:
将前缀向量和输入文本一起传递给模型。
例如:[p1, p2, p3, "这张图片的内容是:", "图片内容"]。
训练过程:
将输入序列传递给预训练模型,进行前向传播和反向传播。
优化前缀向量 [p1, p2, p3],以最小化任务的损失函数。
[p1, p2, p3]优化计算后变为[p1, p2, p3*]
优化后的输入序列:
[p1, p2, p3*, "这张图片的内容是:", "图片内容"],其中 [p1, p2, p3*] 是优化后的前缀向量作为默认整体进行输入。
提示微调(Prompt Tuning)

通过设计和优化输入提示(prompt)来引导模型生成所需输出,而不对模型进行重新训练。
使用固定的一种或者几种提示词,对这种录入的提示词进行优化训练,使得大模型对这类提示词输出效果更优秀,当用户输入了其中一种完全相同的提示词,会让模型输出的效果更好更稳定。
示例:假设我们有一个任务,要求模型生成一个描述图片的句子。["这张关于家用小轿车图片的内容是:", "图片内容"] 初始化提示:
选择一个固定的文本提示,如 "这张关于家用小轿车图片的内容是:" 。
嵌入参数:
将提示转换为嵌入向量,例如 [e1, e2, e3, e4]。
训练过程:
将提示嵌入向量和输入文本一起传递给模型。
优化提示嵌入向量,以最小化任务的损失函数。
最终训练出:"这张关于家用小轿车图片的内容是:"的最优向量不再是[e1, e2, e3, e4] 而是 [e1, e2, e3, e4]
输入序列:
["这张关于家用小轿车图片的内容是:", "图片内容"]
优化后的输入序列:
[e1, e2, e3, e4, "图片内容"],其中 [e1, e2, e3, e4] 是优化后的嵌入向量直接替代了原始"这张图片的内容是:"这句话。
P-tuning:

prompt tuning与prefix tuning比较融易产生强耦合并且只适用于指定场景,限制范围也比较多。
p-tuning开始另外的思考,不适用外部加载方式对提示进行生成后让模型二次理解,直接在输入层对当前输入系列进行向量化,就会让一个词在整个模型里不同组合与定位描述的更加丰富,对这个主题理解也更加丰富。直接对这个主题进行向量化嵌入到模型中就行了。就采取了`连续提示嵌入+离散提示`。连续提示嵌入就比如这是一辆车,车的定义就会是有轮子、有座位带发动机.... 。这些定义粉笔生成向量在大模型输入层进行存储,等用户输入信息会将这些输入与用户写的提示词统一输入,让模型来理解,相对理解场景更加泛化与全面。
假设我们有一个任务,要求模型生成一个描述图片的句子。["这张图片的内容是:", "图片内容"]
初始化向量:
这是一辆有四个车轮,真皮座椅的家用轿车:[v1, v2, v3]。
离散提示:
选择一个固定的文本提示,如 "这张图片的内容是:"。
输入序列:
将连续提示嵌入和离散提示组合成输入序列。
例如:[v1, v2, v3, "这张图片的内容是:"]。
训练过程:
将输入序列传递给预训练模型,进行前向传播和反向传播。
优化连续提示嵌入 [v1, v2, v3],以最小化任务的损失函数。
优化后的输入序列:
[v1*, v2*, v3*, "这张图片的内容是:"],其中 [v1*, v2*, v3*] 是优化后的向量。
P-tuning v2

算力资源现在是非常稀缺的,单纯使用堆参数构建的大模型是没有意义的,就好像世界上第一台电脑到现在的笔记本电脑、手机等产品,小模型才是大家卷的方向也是未来发展的方向。为了适应未来的发展p-tuning进行了改进成为了p-tuning2。
与p-tuning的区别是不会仅在输入层进行向量化,而是在所有transform层都进行向量化嵌入,同时对初始化策略进行优化,减少对初始化向量权重的敏感性,方便模型自我调整。
外部引入方向
适配器微调(Adapter Tuning)

因原理是在大模型不同层次中插入适配器多个适配器可以存在同一模型中,每种适配器可以处理单独的一类问题,同一模型中可以插入不同的适配器模块,能够同时处理多种不同的任务。
因这种需要直接插入到模型层级中,导致训练复杂度与设计度较高。比较容易产生过拟合等问题。
低秩矩阵微调Lora(Low-Rank Adaptation)

优点:减少了训练参数数量,从而降低了计算和存储成本。资源少的情况下依然可以进行模型微调。灵活行较高能使用多种场景。
缺点:有一定技术复杂性相对全参调整需要多次尝试与实验。
强化学习
人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)



第一步:训练监督策略模型
从提示词数据集中取样一个提示词:首先,从包含各种提示词的数据集中随机选取一个提示词作为初始输入。
数据标记工程师给出期望的输出行为:然后,由人工标注员为这个提示词提供一个期望的故事内容或结构,这将作为模型的目标输出。
通过监督学习微调:接下来,使用监督学习的方法对模型进行微调,使其能够基于提供的提示词生成接近于预期结果的故事。
第二步:训练奖励模型
取样一个提示词和模型多个输出:在这个阶段,再次从数据集抽取一个提示词,并让模型产生多个不同的故事版本。
数据标记工程师给出优劣排序:人工标注员会对这些不同版本的故事进行评估并按质量高低进行排序。
训练奖励模型:最后,用这些带有评分的故事样本去训练一个奖励模型,该模型学会预测哪些故事更符合人类的标准。
第三步:采用近端策略优化进行强化学习
从提示词数据集取样一个新的提示词:继续从数据集中获取新的提示词作为下一个迭代的基础。
PPO模型由模型初始化:使用之前训练好的模型开始生成故事。
模型生成一个输出:模型尝试根据新提示词生成一个完整的故事。
奖励模型计算输出奖励值:接着,奖励模型会评价这个新生成的故事,并给出相应的分数。
利用PPO算法结合奖励更新策略:最后,通过Proximal Policy Optimization (PPO)算法,结合奖励模型的反馈来调整模型的行为,使得它在未来能够生成更加高质量的故事。
人工标注花费成本太高产生了——》`AI反馈强化学习(RLAIH)`相当于大模型替代了人工标记的工作。
PPO(近端优化策略)
在每个训练周期(epoch)内,使用当前策略在环境中收集一批经验(状态、动作、奖励、下一状态等)。在环境内进行交互,并且将每一次循环后的经验存储在一个缓冲区方便后续迭代累计使用。
通过限制每次更新的幅度来提高训练的稳定性,比较适合处理复杂的决策任务。
DPO(直接偏好优化)
DPO的核心在于创建一个包含人类偏好的数据集,每个数据对由一个提示和两个可能的输出(一个是首选,另一个是不受欢迎)组成。模型通过最大化生成首选输出的概率,同时最小化生成不受欢迎输出的概率来进行微调。这一过程可以看作是一个分类问题,模型的目标是提高对首选输出的生成概率,并降低对不受欢迎输出的生成概率

6.主流微调框架


DeepSpeed是一个由微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。它通过多种技术手段来加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。DeepSpeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等等。
核心技术ZeRO(零冗余优化器)减少了训练内存占用
ZeRO-1:优化器状态分区,适合中等规模模型,内存使用效率高。
ZeRO-2:优化器状态和梯度分区,支持更大模型,训练速度显著提升。
ZeRO-3:全面的状态分区,支持超大规模模型,具有超线性可扩展性和优化器卸载功能。



特点:
用户友好:提供零代码的图形用户界面(LlamaBoard),用户可以通过简单的操作进行模型微调
高效微调:集成了多种参数高效微调技术,如LoRA和Prompt Tuning,能够在有限资源下实现高效训练
多模型支持:LLaMA Factory支持超过100种大型语言模型,包括LLaMA、ChatGLM、Falcon等。
适合需要快速原型开发和实验的用户,尤其是在小型和中型数据集上。
`适用于对大模型微调有需求但缺乏深厚技术背景的用户。`

本节课概览
