初学者如何对大模型进行微调?

粗略地说,大模型训练有四个主要阶段:预训练、有监督微调、奖励建模、强化学习。

预训练消耗的时间占据了整个训练pipeline的99%,其他三个阶段是微调阶段,更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非常高,对于普通开发者来说基本上不用考虑了。

对于开发者来说,如果你有几块GPU显卡,那么就可以尝试微调了。不过在微调之前,我们要弄明白为什么要微调,大模型为什么不能直接用?

一、为什么要微调?

大语言模型的预训练的目标很简单:文字接龙,通过前面的词语预测下一个字也就是预测token序列的下一个token。

预训练基于大规模无监督数据集训练,得到的大语言模型可以保存很多知识,但是可能无法充分利用这些知识来回答问题。

我的理解是预训练就是一个班上学习很好的学霸,不过只会死记硬背,脑袋里记忆了很多知识,但是不会灵活应用这些知识。一般预训练的数据格式如下所示:

复制代码
[
  {"text": "中国的首都是北京"},
  {"text": "初学者如何对大模型进行微调"}
]

如果将"中国的首都是"输入大模型,大模型做文字接龙,可以很轻松的补全"北京"作为回答。但是如果问题的形式是"中国的首都是哪个城市?"这种疑问句形式时,虽然只进行了预训练的大模型大概率也能回答这个简单问题,比如采用Few-shot prompt等方法。

但这种形式的问题如果内容更复杂一些,大模型可能无法很好的作答(尽管预训练语料中可能包含了问题的答案)。这时我们就需要指令微调来挖掘大语言模型的潜力。让大模型不仅仅满足于文字接龙,而是要真正具备逻辑推理、文案总结等能力。

一般来说我们可以在modelscope中搜索最新的大模型,以Llama系列为例子。其中

  • Meta-Llama-3-8B不包含Instruct关键词,说明它只有预训练,未经过指令微调。

  • Meta-Llama-3-8B-Instruct包含Instruct关键词,经过预训练、指令微调。

二、初学者如何微调?

对于初学者来说,我们不需要指令微调来挖掘大语言模型的潜力,虽然这个时候的指令微调相比预训练资源消耗小很多,但是对于初学者来说还是很困难的,在微调过程中会碰到灾难性遗忘、复读机等问题。

我建议初学者做微调是在指令微调模型的基础加入特定领域的数据,比如法律文档、医疗诊断等领域,模型需要调整其参数以更好地理解和执行这些特定任务的要求,微调允许大语言模型在特定任务的数据集上进一步学习,从而提高其在该领域的准确性和表现。

比如我在Qwen1.5-7B-Chat 的基础上(Qwen1.5-7B-Chat是一个预训练、指令微调后的大模型),准备训练数据集45366 条,测试数据集5032 条,再微调大模型来实现商品评论情感分析,准确率高达91.70%,具体实现方法如下:

微调大模型来实现商品评论情感分析

学习微调最好的办法就是自己亲身实践一遍。在去年的时候微调大模型还是一件比较困难的事情。微调工具链不太成熟,碰到了问题只能一个接一个去提issue,费时费力效果还一般。

不过随着大厂在大模型领域真金白银的投入,大模型方面的技术快速发展,产生了大量大模型训练岗。如果你对大模型训练微调感兴趣,强推听一下知乎知学堂推出的AI大模型公开课,主要针对是想进阶AI方向的产品经理跟程序员,其中大模型原理到AI应用开发框架,LangChain,AI Agent,模型微调技术这几个方面,对你训练大模型都会很有帮助。

入口我直接给大家找过来了,直接听就可以⬇️

【卡片】

其中AGI 课堂顾问团成员来自百度、腾讯、京东、阿里、微软等大厂和头部大模型创业公司、顶尖高校实验室,最低职级P9,含金量还是挺高的。

回到主题上,从我自身角度出发,我推荐使用LLaMA-Factory统一微调框架,它能够支持数百种大模型的微调,并且集成了大量训练加速算法,比很多大模型repo主页训练方法还要快。下面我们来看一看如何使用它。

1.依赖下载

复制代码
git clone https://github.com/hiyouga/LLaMA-Factory.git
conda create -n llama_factory python=3.10
conda activate llama_factory
cd LLaMA-Factory
pip install -e .[metrics]

如果依赖有问题,可以。

2.大模型下载

这里以Baichuan2-13B-Chat为例。

复制代码
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('baichuan-inc/Baichuan2-13B-Chat')

默认模型会下载到~/.cache/modelscope/hub中,如果需要修改下载目录,可以手动指定环境变量:MODELSCOPE_CACHE,modelscope会将模型和数据集下载到该环境变量指定的目录中

比如更改默认位置:

复制代码
export MODELSCOPE_CACHE=/home/test/models

3.数据集构建

(1)使用开源数据集

llama_factory中的 data文件夹提供了大量整理好的开源数据集

(2)构建自己的数据集

比如我我按照alpaca 格式准备数据集,包括 instruction, input, output,history 4条内容,其中instruction、 input 为输入,output 为输出标注,数据文件存储格式一般为json。

复制代码
[
  {
    "instruction": "用户指令(必填)",
    "input": "用户输入(选填)",
    "output": "模型回答(必填)",
    "system": "系统提示词(选填)",
    "history": [
      ["第一轮指令(选填)", "第一轮回答(选填)"],
      ["第二轮指令(选填)", "第二轮回答(选填)"]
    ]
  }
]

例子如下:

复制代码
[
  {
    "instruction": "判断该文章是观点类还是新闻类",
    "input": "报纸报道称政府已宣布决定在该地区部署更多武装部队。",
    "output": "该文章被归类为新闻类。"
  },
  {
    "instruction": "电子邮件信息的三个最重要的组成部分是什么?",
    "input": "",
    "output": "电子邮件信息的三个最重要的组成部分是主题行、邮件正文和签名。"
  },
  ...
]

(3)引入自己的数据集

构建自己的数据集后,需更新 data/dataset_info.json 文件,并将数据集放置data文件夹

比如我构建了一个数据集test.json,需更新data/dataset_info.json 文件,并将test.json放置于data文件夹

复制代码
{
  "test": {
    "file_name": "test.json",
  },
  "alpaca_en_demo": {
    "file_name": "alpaca_en_demo.json"
  },
  ...
 }

4.微调

建议初学者采用web可视化页面微调,启动命令如下:

复制代码
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui

其中:CUDA_VISIBLE_DEVICES 指定使用哪块显卡

启动后,微调就更简单了。llamafactory集成了多种微调算法,比如

  • Lora

  • QLora

  • LoRA+

  • Mixture-of-Depths

  • GaLore

等等微调算法,在这里我不想深究它们的具体原理。我建议初学者首先使用Lora微调的方式,只需配置3个参数即可开始微调

5.推理

由于采用的是Lora微调,我们需要将原有大模型的权重与自己训练出来的权重合并。

llamafactory也内置了推理模块,只需调1个参数,即可推理,如下图所示:

下面这张图,是我基于llamafactory做的商品评论情感预测,其中1代表好评,0代表差评。可以看到大模型输出1,代表它认为这条评论是好评。

三、最后

现在大模型微调的门槛越来越低,市场上有大量开源微调框架。只要你会部署、有机器就能出个结果,赶紧动手玩起来吧!

相关推荐
Mintopia2 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮3 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬3 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia3 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区4 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两6 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪7 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232557 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
程序员打怪兽7 小时前
详解Visual Transformer (ViT)网络模型
深度学习