垂域LLM训练经验之谈

垂域LLM训练经验之谈

垂域LLM训练经验之谈

原创 ToTensor  2024年06月01日 12:27 浙江

前言

本文将按以下几个部分进行叙述:

•全参 SFT

•Lora SFT

•Lora 继续预训练

•Llama pro 预训练 + SFT

数据说明:

•预训练数据:由SFT数据的Query 与 Answer 的拼接

•SFT数据:由GPT4根据垂域文档抽取问答对+人工挑选而来,大概20000条,其中包括公司的介绍•自我认知数据:大概200条,从公开的自我认知数据整理而来

•通用数据:匠数科技大模型sft数据集[1]

显卡 4 * A100 (40G)

训练框架 LLaMA-Factory[2]

基座模型 Qwen1.5-7B[3]

一、全参 SFT

基座模型Qwen1.5-7B[4]

总的来说,全参SFT是学知识最容易的一个,只需要一个epoch即可学会垂域知识,能够完全按照你的训练数据输出,是快速验证效果最简单的一条路了。

以下是lr = 5e-5 , epoch = 1, 混合了12w通用数据的训练Loss

www.zeeklog.com  - 垂域LLM训练经验之谈

请添加图片描述

可以看出,所有数据训练完都还没有完全收敛,应该还需要再加点通用数据,loss才会更好看些。

此时的模型已经能够完全复述SFT的训练数据了,关于公司的问答、自我认知的效果都很不错,通用能力也还可以,但受限于资源问题,并未对全参SFT的模型在MLU等通用数据集上进行完整的测试。

值得一提的是,当混合的通用数据较少时,模型比较容易出现复读现象。看来在混合比例的基础之上,还要确保你混合数据的量足够多才行,不能光有混合比例没有足够的混合数据量。

二、LORA SFT

基座模型Qwen1.5-7B[5]

lr = 2e-4 , epoch=5时,训练的模型基本学会了公司的介绍,

www.zeeklog.com  - 垂域LLM训练经验之谈

请添加图片描述

对于Lora来说,记住知识的能力差很多,需要训练很多个epoch才能学会垂域知识,且从训练曲线来看纯纯就是过拟合才学会的知识。该版本未进行MLU等数据集的测试。

要想曲线好看点,可以对垂域数据进行过采样,曲线会好看非常多,如下:

www.zeeklog.com  - 垂域LLM训练经验之谈

请添加图片描述

这里我对2000条垂域数据进行了高达20倍的采样,采样完后总共4w条数据,且通用数据有12w条 lr = 5e-5, epoch=3。

这一版训练出来的模型通用能力并未损失多少,且有提升:

www.zeeklog.com  - 垂域LLM训练经验之谈

在这里插入图片描述

大概时因为我未进行预训练,且混合了大量通用数据,所以才未损失通用能力吧。

这里要再提一嘴,当你的垂域数据较多时,对Chat模型进行SFT,会损失非常多的通用能力

三、LORA继续预训练

基座模型Qwen1.5-7B[6]

使用垂域QA数据拼接成的数据直接进行Lora预训练,未混合通用数据,垂域数据是网络安全数据[7]

(因为我手上没有大量的预训练数据,所以找的这个数据集代替)

www.zeeklog.com  - 垂域LLM训练经验之谈

请添加图片描述

lr = 1e - 4, epoch =1的曲线

使用训练好的lora模型合并后进行了标准的测试,结果如下

www.zeeklog.com  - 垂域LLM训练经验之谈

在这里插入图片描述

通用能力并未损失的样子。注意,这里并没有使用通用数据集

为了对比和base模型在垂域的效果,我在渗透测试考试单项选择题上进行了对比测试,结果如下:

www.zeeklog.com  - 垂域LLM训练经验之谈

在这里插入图片描述

实际上base模型在这个数据集上的表现就已经很好了,我在垂域数据上继续预训练后,也就 one shot有一点点提升。实在是尴尬。

不过这里并没有出现所谓的LORA预训练必须要混合足够多的通用数据,不然会损失通用能力,只能怀疑说,这份垂域数据,不够垂,qwen 系列的大模型的预训练数据包含了这部分数据集。

随后,我又进行了训练数据的复读测试,看看lora 预训练的模型,能否输出训练数据。结果表明,lora只训练一个epoch,没法对预训练数据进行复读,训练3个epoch后,基本能够复读出训练数据了。

四、Llama pro 预训练 + SFT

使用llama pro方法在Qwen1.5-7B[8]基座模型上进行拓展,我这里扩展了4个hidden_layers,还是在网络安全数据[9]上进行预训练

lr = 5e-5, epoch = 3

www.zeeklog.com  - 垂域LLM训练经验之谈

请添加图片描述

使用合并后的模型能够准确复述出预训练数据,说明确实学到了知识。

www.zeeklog.com  - 垂域LLM训练经验之谈

在这里插入图片描述

综合来看,比lora模型的通用能力要好一点。

但是,在渗透测试考试单项选择题上进行测试,结果却更差了

www.zeeklog.com  - 垂域LLM训练经验之谈

在这里插入图片描述

但是对于学习知识而言,确实是能够复述预训练数据了。

总结

1、全参微调学东西最快 2、lora要学习垂域知识,得多训几个epoch才行,或者对数据集进行过采样 3、llama pro学东西也快,缺点就是会增加参数量 4、如果不是特别垂直的场景,优先RAG吧 5、训垂域模型,要我选,我选llama pro

References

[1] 匠数科技大模型sft数据集: https://modelscope.cn/datasets/deepctrl/deepctrl-sft-data/summary
[2] LLaMA-Factory: https://github.com/hiyouga/LLaMA-Factory
[3] Qwen1.5-7B: https://modelscope.cn/models/qwen/Qwen1.5-7B/summary
[4] 网络安全数据: https://modelscope.cn/datasets/conheaven/security-dataset/summary

Read more

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk
超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk