大模型(LLMs)微调篇
一、如果想要在某个模型基础上做全参数微调,究竟需要多少显存?
一般 n B的模型,最低需要 16-20 n G的显存。(cpu offload基本不开的情况下)
二、为什么SFT之后感觉LLM傻了?
SFT的重点在于激发大模型的能力,如果抱着灌注领域知识而不是激发能力的想法,去做SFT的话,可能确实容易把LLM弄傻。
三、SFT 指令微调数据 如何构建?
- 选择多个有代表性的任务;
- 每个任务实例数量不应太多,防止过拟合;
- 平衡不同任务的比例,防止较大的数据集压倒整个分布。
四、领域模型Continue PreTrain 数据选取?
技术标准文档或领域相关数据是领域模型Continue PreTrain的关键。
五、领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?
在领域训练的过程中加入通用数据集,领域数据与通用数据的比例在1:5到1:10之间是比较合适的。
六、领域模型Continue PreTrain ,如何 让模型在预训练过程中就学习到更多的知识?
领域模型Continue PreTrain时可以同步加入SFT数据,即MIP,Multi-Task Instruction PreTraining。
七、进行SFT操作的时候,基座模型选用Chat还是Base?
资源有限就用在Chat模型基础上训练,资源充足就在Base模型上训练。
八、领域模型微调 指令&数据输入格式 要求?
在Chat模型上进行SFT时,请一定遵循Chat模型原有的系统指令&数据输入格式。
九、领域模型微调 领域评测集 构建?
领域评测集时必要内容,建议有两份,一份选择题形式自动评测、一份开放形式人工评测。
十、领域模型词表扩增是不是有必要的?
领域词表扩增真实解决的问题是解码效率的问题,给模型效果带来的提升可能不会有很大。
十一、如何训练自己的大模型?
一般分为两个阶段训练:
- 扩充领域词表,在海量领域文档数据上二次预训练LLaMA模型;
- 构造指令微调数据集,在第一阶段的预训练模型基础上做指令精调。
十二、训练中文大模型有啥经验?
链家技术报告《Towards Better Instruction Following Language Models for Chinese: Investigating the Impact of Training Data and Evaluation》中,介绍了开源模型的训练和评估方法:
还对比了各因素的消融实验:
消融实验结论:
•扩充中文词表后,可以增量模型对中文的理解能力,效果更好
•数据质量越高越好,而且数据集质量提升可以改善模型效果
•数据语言分布,加了中文的效果比不加的好
•数据规模越大且质量越高,效果越好,大量高质量的微调数据集对模型效果提升最明显。解释 下:数据量在训练数据量方面,数据量的增加已被证明可以显著提高性能。值得注意的是,如
此巨大的改进可能部分来自belle-3.5和我们的评估数据之间的相似分布。评估数据的类别、主 题和复杂性将对评估结果产生很大影响
•扩充词表后的LLaMA-7B-EXT的评估表现达到了0.762/0.824=92%的水平
他们的技术报告证明中文大模型的训练是可行的,虽然与ChatGPT还有差距。这里需要指出后续
RLHF也很重要,我罗列在这里,抛砖引玉。
扩充中文词表后,可以增量模型对中文的理解能力,效果更好。数据质量越高越好,而且数据集质量提升可以改善模型效果。
十三、指令微调的好处?
有以下好处:
1.对齐人类意图,能够理解自然语言对话(更有人情味)
2.经过微调(fine-tuned),定制版的GPT-3在不同应用中的提升非常明显。OpenAI表示,它可 以让不同应用的准确度能直接从83%提升到95%、错误率可降低50%。解小学数学题目的正确 率也能提高2-4倍。(更准)
踩在巨人的肩膀上、直接在1750亿参数的大模型上微调,不少研发人员都可以不用再重头训练自 己的AI模型了。(更高效)
十四、预训练和微调哪个阶段注入知识的?
预训练阶段注入知识的,微调是在特定任务训练,以使预训练模型的通用知识跟特定任务的要求结合,使模型在特定任务上表现更好。
十五、想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?
可以使用预训练和微调相结合的方式,先用篇章数据进行预训练以获取广泛的知识,再用问答对数据进行微调,使模型更好的学习到特定领域的知识。
当然,GPT大模型的预训练和微调,从实现方式来讲是没有什么差别的,都是decoder only的语言模型训练并更新参数,如果样本集小,没有大量的篇章文档数据,我认为只进行微调也能注入知识 的,不必太纠结预训练。而且特定领域跟预训练模型的分布差别不大,也不用二次预训练。
十六、多轮对话任务如何微调模型?
这里列举了 ChatGLM-6B 的生成对话的例子
>>> from transformers import AutoTokenizer, AutoModel
>>> tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
>>> model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
>>> model = model.eval()
>>> response, history = model.chat(tokenizer, "你好", history=[])
>>> print(f"response:{response}")
>>> print(f"history:{history}")
response:你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
history:["你好", "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]
•response 为 ChatGLM-6B 模型的 当前反馈
<