微信扫码
与创始人交个朋友
我要投稿
本文约5000字,阅读时间20分钟
本文是保姆式的教程,想自己微调HR大模型可耐心看完。
先看效果
微调前:
微调后:
微调大模型可以让大模型适应特定的任务和场景,在此场景下表现能力更强。
比如GPT 3.5的相当于大学生,微调后相当于读了个HR的硕士,他在HR场景下能力更强,懂得更多,回答得更专业。
不建议。?
除非你是技术大牛,未来想加入OpenAI这种公司。真正需要会模型训练(含微调)的人,全球仅需要几百位(最顶尖的科学家)。
个人观点,未来的大模型一定是AGI即通用类大模型,在方方面面都很强。我们微调出什么HR大模型,财务大模型,花个上千万RMB去进行模型训练不说,整体效果还不如花个几分钱直接调用OpenAI的GPT4。(数据合规问题另说,都有解决办法)
在没有足够财力和时间情况下,个人/小公司微调模型意义不大。
以上为心声,下方为对外说辞:
微调好啊!?
作为工程师,学会微调让我掌握大模型环境搭建、模型训练、效果评估技术,可以帮助公司本地部署垂直领域的大模型,升职加薪不是梦!
作为产品经理,学会微调的数据处理步骤,包括数据采集、数据标注、数据清洗,还有模型效果评估,公司的大模型一定会大卖!要知道好的模型70%都要归功于好数据,升职加薪不是梦!
作为公司负责人,公司前进方向的掌舵人,我看到因合规问题,很多企业只能用本地大模型;或者开源大模型如文心、千问满足不了我客户的需求。我们公司自己微调个垂直大模型,不就起飞?商机来了,我要飞黄腾达了!
好吧,既然你要学模型微调,那开始吧!
(做好心理准备吧,每一步都要搞你1天)
抽象地说,你可以理解模型微调相当于调节灯光的亮度,根据你想要的亮度,在开关旋钮那里滑动(0~100%亮度),直到你想要的结果。
实现方法其实很简单,就是调整模型的参数(开关旋钮)。模型训练的本质就是求解最优化参数的过程。
有几个词需要澄清下,容易混淆
模型训练:模型预训练、微调、轻量化微调的统称,是个泛化的表述。
模型预训练:拿成千上万亿的超大训练数据,训练成通识类大模型。比如GPT4, Claude3,文心4。
模型微调:拿几百万条的中等量训练数据,训练成垂直领域的大模型。比如用友的的YonGPT, 金蝶的苍穹云GPT财务大模型。
轻量化微调(大家说的/本文说的微调指这个):拿成百上千条数据,训练成特殊场景增强的大模型。比如拥有对话能力、简历解析能力等。
根据训练方式,分为无监督学习、监督学习和强化学习(基于人类的反馈学习RLHF,俗称点赞和差评)给模型进行训练。
根据训练样本量,分为零样本ZST、单样本OST、小样本FST、多样本MTL学习。
02
这是我做这个模型微调尝试的初心,我希望能有一个HR场景:
数据集比较好做(要让GPT帮我生成,手写1000条数据会让我自闭的)。
场景易于理解也实用,观众看了秒懂,会喜欢。
现有的开源模型没有特别好的效果,但是调教一下效果就很明显。
使用的模型不能太大,不然训练一次好几天,钱包和时间都吃不消。
经过2天的思考和研究,得出场景:
智谱公司的ChatGLM3 - 6b中文大模型,已经很不错了,但是我希望他在评估压力面试问题时,能更专业,所以希望微调出更强的能力。
产品目标:能正确评价压力面试答案的好坏,并结构化给出评价理由。
在模型微调前,需要准备好系统环境,主要包括:
以上内容具体怎么操作,可参考我的另一篇文章,里面有保姆式教程:
准备数据
(HR产品经理发光发热的步骤)
我如何准备训练数据呢?需要先思考以下几个问题:
数据格式怎么样?
毕竟要喂给模型的,格式错了就训练不了。
数据内容有什么要求?
如果数据内容质量差,训练出来的也是垃圾,就不能增强模型评估压力面试问题的能力。最好和真实的面试记录一样。
数据该怎么生成?
手写?用GPT帮我生成?上网下载资料?找公司帮我做数据?
ChatGLM3训练的数据格式是这样的(JSON格式):
{"conversations": [
{"role": "user", "content": "请评价以下压力面试的回答\n问题:你为何在上一个工作中仅待了六个月?\n回答: 在我上一个职位中,我确实只工作了六个月,但在此期间,我迅速适应了新环境并对团队做出了显著贡献。我提升了部门的工作效率通过引入新的项目管理工具,并帮助团队按时完成重要项目。我离职是因为我寻找更大的成长和学习机会。"},
{"role": "assistant", "content": "这个回答很好,主要有三个方面的原因:\n1.回答展示了应聘者积极面对挑战,快速适应变化的能力。\n2.通过举例说明在前职位中的成就,明确展示了自己的贡献和能力。\n3.说明离职原因时,强调寻求更大成长机会,体现了应聘者的职业发展导向和积极态度。"}
]}
要保证训练效果,最好对同一个面试问题,有一个好的回答和一个不好的回答。
{好的答案}
User: 压力面试的问题A、候选人好答案,约100字。
Assistant:好答案的面试评价,约100字,分3点来写。
{不好的答案}
User: 压力面试的问题A、候选人不好的答案,约100字。
Assistant:不好的答案的面试评价,约100字,分3点来写。
最后,我希望这些压力面试的问题和答案不能随便造,都是按照实际情况产生,比如:
打断。目的:以测试候选人的耐压性和反应能力;例子:打断一下,你说了这么多,我没听到重点。
质疑/表现批判性/冷漠(抬杠)。目的:以观察候选人在缺乏积极反馈或面对挑战时的表现;例子:你每段工作经历都很短;你工作了5年,为什么这么基础的问题都不会?
注意力集中在问题本身,不要受到情绪影响
表现自信和适应性
用实例来应答
对于模糊的问题,请求澄清
保持逻辑性和条理性
情绪失控,如使用不当的语言,例如诅咒、挑衅、攻击性言论
防御性太强,不愿意接受任何形式的批评或建议,避免讨论自己的弱点和失败
缺乏逻辑和条理
缺乏准备,回答过于简单或者笼统
逃避问题,避重就轻
一般数据准备要分4步:
基于上述数据准备的策略,我们要怎么搞出这样的数据呢:
帮我生成一系列压力面试问答及评价。每组包括一个问题,一个好回答及其评价,一个不好的回答及其评价。请依照以下简化要求:问题简短,约20字,可涵盖打断、质疑或提出难题。好回答约80字,展示候选人的应对策略、逻辑性、自信、创造力等。好回答评价约100字,聚焦于问题解决策略、适应性、条理性、举例子、自信、创造性等。不好的回答约80字,可能表现为情绪失控、逃避问题、防御性太强、缺乏逻辑和条理、缺乏准备,回答过于简单或者笼统等。不好的回答评价约100字,指出回答中的情绪失控、逃避问题、防御性太强、缺乏逻辑和条理、缺乏准备,回答过于简单或者笼统等。格式要求:{"QA":"请评价以下压力面试的回答\n问题:...\n回答: ...","Eval":"这个回答很好,主要有三个方面的原因:\n1....\n2....\n3...."}{"QA":"请评价以下压力面试的回答\n问题:...\n回答: ...","Eval":"这个回答不好,主要有三个方面的原因:\n1....\n2....\n3...."}
原因:因为GPT生成文本有数量限制和响应时间限制。但是我要造1000条数据怎么样?
解决方法:我让GPT帮我写了一段脚本,向GPT请求100次,把造的数据写到我本地的txt文档里。相当酷炫,我去健身回来,就搞好了!全自动!
原因:GPT受temperture的原因,结果有随机性。但我不能设置temperature=0, 因为我希望他生成多种多样的面试记录。
解决方法:我让GPT写了一段代码清洗不符合格式的数据。大概占10%。
微调准备
命令行指令:pip install -r requirements.txt
*注意要在ChatGLM3/finetune_demo这个目录下进行下载依赖工具包,不然就下错啦~ 不然可能下到其他工具的依赖包了。
我请GPT生成了1000条数据,根据经验法则,进行以下切分,训练效果最好:
训练集(train):80%,800条。用于训练模型。
验证集(eval):10%,100条。用于在训练过程中,验证loss(损失率),调整参数。
测试集(test):10%,100条。用于训练后,最终预测模型训练效果。
记得改名和改路径!
就是一些超级开关,对模型训练影响很大的参数,要根据你硬件和数据集的情况调整这些开关,可以提高模型训练的效率和效果。
具体我设置的超参情况(我用Lora去微调):
(详细设置请阅读原文)
常用的模型微调方式有2种:
P-tuning, 清华团队出品,往Embedding层加参数。适合ChatGLM这种中文模型。
LoRa,微软提出的,往6层神经网络加(Nx=6)加参数。应用最广泛、效果最好的微调方法。
我们采用Lora的方式进行微调。一行代码即可启动微调:
!python finetune_hf.py data/ /root/autodl-tmp/ZhipuAI/chatglm3-6b configs/lora.yaml
大约等待20分钟,就训练好了!
输出了10个模型节点,以及日志:
我们采用TensorBorad去观察模型训练效果。(详细步骤请看原文)
结论:在1000这个点,损失率最低,效果最好,把这个点的模型,作为我们训练好的模型!
我们采用Streamlit工具展示模型效果,具体怎么搞出来的可以参考我的另一篇文章的《5. 漂亮测试:Streamlit工具》章节。
微调前
踩坑心得
作为一名编程小白,整个环境搭建、微调花了大概5天时间。其中在环境搭建时,遇到的BUG不计其数,很抓狂。现在再让我从0开始搭建环境到微调完,可能也就2个小时。
import torchimport gctorch.cuda.empty_cache()# 在加载新模型前,尝试删除旧的模型实例if 'model' in locals():del modeltorch.cuda.empty_cache()gc.collect()
rm -rf ~/.cache #删除缓存文件
在安装ChatGLM3、下载安装大模型、微调前,都要先按要求安装依赖包,不然很容易搞到一半就报错。
Python环境很复杂,有很多包,每个包又有很多版本。有时你明明已经按要求安装很多包,结果不行,老是报错,然后就疯狂换数据源,升级降级包,换环境,搞得整个系统混乱不堪。
我就遇到这个问题,有个报错搞了1天都解决不了,后来我就索性从头开始搭建环境,一个个包按要求、按顺序安装,结果微调模型就一切都很顺利,2个小时就搞定了。
作为HR产品经理,微调的整个过程让我很煎熬,让我有很多思想斗争。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-16
深入理解预训练与微调,为什么需要预训练,什么是微调?
2024-11-16
GenAI部署:成功率与ROI为何双下滑?
2024-11-13
无需网络,轻松在手机上离线布署本地大模型
2024-11-13
DataOps for LLM 的数据工程技术架构实践
2024-11-13
LLM性能优化中的一些概念扫盲
2024-11-13
蚂蚁集团 | 提出多任务大模型微调方法:CoBa,LLM最高性能提升13%!
2024-11-12
Scaling Law提出者Ilya发声:大模型预训练效果趋于平缓,扩展正确的东西变得更重要
2024-11-08
Ollama 更新!手把手教你用Ollama轻松搭建Llama 3.2 Vision + 视觉RAG系统(本地安装)
2024-07-11
2024-07-11
2024-07-09
2024-09-18
2024-06-11
2024-07-23
2024-07-20
2024-07-12
2024-07-26
2024-07-23