-
Notifications
You must be signed in to change notification settings - Fork 83
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
大语言模型(LLM)微调技术笔记 #92
Comments
我们采用了添加了 ValueHead 的 ChatGLM-6B 模型,取 EOS token 的输出作为 score 和 RLHF 中的 reward,没有涉及到余弦相似度。在 SFT 阶段,采用的是交叉熵损失函数,而非余弦相似度。RLHF 则使用 reward 和 per-token KL divergence 作为优化目标。训练奖励模型时,使用了 GPT-4 和 GPT-3.5 产生的对比数据作为监督,没有使用人工标注的对比数据。 |
感谢指正,这部分没有仔细看。已经修正。 |
高质量中文数据集似乎变得更为重要了,对支持中文的大语言模型来说 |
感谢感谢 |
感谢分享 |
mark |
感謝感謝,獲益良多 |
写的真好 |
感谢分享 |
1 similar comment
感谢分享 |
先实验一下看看 |
感谢分享 |
感谢分享~ |
写的真的很不错,感谢 |
谢谢分享,豁然开朗~ |
Great job |
您好,请问如果我想使用Lora+ChatGLM微调SQL生成任务,需要怎么构建数据集呢?微调训练过程是有监督的吗?(模型生成的SQL如何和目标输出计算损失?) |
mark |
如果是SQL的话就用正常的交叉墒损失函数就行,和别的微调一样。 |
good job! |
感谢分享 |
历史记录格式和示例格式能写成一样格式吗,不是很明白示例格式 |
图1:大模型进化树2
0x00 大模型微调
在预训练后,大模型可以获得解决各种任务的通用能力。然而,越来越多的研究表明,大语言模型的能力可以根据特定目标进一步调整。
这就是微调技术,目前主要有两种微调大模型的方法1:
在 OpenAI 发布的 ChatGPT 中,就主要应用了微调技术3,从而获得了惊艳全世界的效果。
图2:InstuctGPT 原理
0x10 指令微调 ( Instruction Tuning)
本质上,指令微调是在自然语言格式的实例集合上微调预训练后的大语言模型的方法。这种方法与有监督微调和多任务提示训练密切相关。为了进行指令微调,我们首先需要收集或构造指令格式的实例。然后,我们使用这些格式化的实例以有监督的方式微调大语言模型(例如,使用序列到序列的损失进行训练)。指令微调后,大语言模型展现出泛化到未见过任务的卓越能力 ,即使在多语言场景下也能有不错表现。
0x11 格式化实例构造(微调数据集)
通常情况下,一个指令格式化的实例包括一个任务描述(被称为指令 instruction)、一个输入输出对以及少量示例(可选)。
数据集一般用两种方法产出:
图3:实例格式化和两种构造指令格式实例的示意图。1
数据集也分为通用任务的数据集以及专用数据集,前者目前有大量开源数据集可供使用,后者则针对某个具体领域,可以自行构建。此外引入多样化的数据集(包括引入 CoT思维链等)可以有效的提升模型性能。
目前通用的中文微调数据集:
其余中文数据集可以参见:
0x12 数据集格式示例
典型的数据集格式:
{"instruction": "", "input": "", "output": ""}
, 如果要微调已经经过指令微调的模型,那么微调数据集的格式应该保持不变以获得最佳效果,格式包括分隔符、代码标签等。以 ChatGLM-6B 为例,其微调格式:
以 Claude 模型为例,其格式为:
以 Guannaco 模型为例,其格式为
0x13 指令微调效果
指令微调可以让大模型有质的提升,主要体现在两个方面:
0x14 对话微调 (Conversation Tuning)
对话微调是一种特殊的指令微调。其目的是让大语言模型在「补全」能力的基础上,解锁「对话」能力。
典型的数据集格式:
{"instruction": "", "input": "", "output": "", "history": [{"", ""}, {"", ""}]}
具体的对话格式应该和模型在预训练以及微调时保持一致,以ChatGLM-6B 微调数据格式为例:
Claude 模型格式:
OpenAI 则推出了 ChatML 格式,其原始数据格式为:
0x15 参数高效微调 (Parameter-Efficient Fine-Tuning)
虽然指令微调相比于预训练更加高效(只需要处理微调数据集),但是全参数的指令微调依然需要消耗较多的算力。目前有多种高效参数微调方案,可以在实现和全参数微调相同性能的情况下,大幅降低微调成本。
参数高效微调,也称为 PEFT,可以仅微调少量或者额外的模型参数,并固定住大部分预训练参数,从而大大降低训练成本。目前研究表明,PEFT 相比于全参数微调,在没有微调过的大语言模型上性能略差,但是在已经微调过的模型上,性能接近。
PEFT 方法可以分为三类,不同的方法对模型的不同部分进行下游任务的适配:
目前针对大语言模型,评测效果最好的是 LoRa。其基本原理是在原始预训练权重旁边增加一个旁路,做一个降维再升维的操作k。训练的时候固定预训练权重,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将B/A与预训练权重的参数叠加。实际微调过程中,A/B 基本在MB级别,与之相比,大语言模型的权重通常在GB级别。
图4:Lora 微调原理
0x20 对齐微调
大语言模型在多个自然语言处理任务上展示出了惊人 的能力。但是, 这些模型有时可能表现出意外的行为,例如制造虚假信息、追求不准确的目标,以及产生有害的、误导性的和偏见性的表达。对于 LLM, 语言建模目标通过单词预测对模型参数进行预训练,但缺乏对人类价值观或偏好的考虑。为了避免这些意外行为,研究提出了人类对齐,使大语言模型行为能够符合人类的期望。但是, 与初始的预训练和适应微调(例如指令微调)不同, 语言模型的对齐需要考虑不同的标准(例如有用性, 诚实性和无害性)。 已有研究表明对齐微调可能会在某种程度上损害大语言模型的通用能力,这在相关研究中被称为对齐税。
0x21 对齐标准
0x22 基于人类反馈的强化学习(RLHF)
通过 RLHF,大模型可以根据人类反馈进行强化学习,从而和人类对齐。典型步骤如下图。
图5:基于人类反馈的强化学习1
分为三个步骤:
0x23 RLHF 实践
目前开源模型中,主要使用指令微调,应用 RLHF 的较少。已知的例子:
{"chosen": "xxxx", "rejected": "yyyy"}
,分别代表正向和负向反馈。可以看到 RLHF 极其依赖标注良好的数据集。
0x30 微调实战
接下来,我们以 ChatGLM-6B 中文模型为例,通过 Lora 微调修改其自我认知,预期目标:
我们使用 ChatGLM-Efficient-Tuning 库对 ChatGLM-6B 进行 Lora 微调:
git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git conda create -n chatglm_etuning python=3.10 conda activate chatglm_etuning cd ChatGLM-Efficient-Tuning pip install -r requirements.txt
sed -i 's/[NAME]/呱唧/g' data/self_cognition.json
。该数据集包含了 18 条关于模型自我认知的数据,我们的目标是修改模型自身的知识,使模型给出我们希望的答复。使用18条是通过各种方式让大模型学习,如果条数过少则训练效果很差。示例如下:cognition
文件夹内保存的微调模型权重,并合并进原版 ChatGLM 模型的参数权重中,同时启动流式交互窗口0x40 参考资料
0x41 相关项目
0x42 参考文献
Footnotes
Zhao, Wayne Xin, Kun Zhou, Junyi Li, Tianyi Tang, Xiaolei Wang, Yupeng Hou, Yingqian Min, et al. “A Survey of Large Language Models.” arXiv, May 7, 2023. http://arxiv.org/abs/2303.18223. 本文主要参考,同时该论文提供中文版本。 ↩ ↩2 ↩3 ↩4
Yang, Jingfeng, Hongye Jin, Ruixiang Tang, Xiaotian Han, Qizhang Feng, Haoming Jiang, Bing Yin, and Xia Hu. “Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond.” arXiv, April 27, 2023. http://arxiv.org/abs/2304.13712. ↩
Ouyang, Long, Jeff Wu, Xu Jiang, Diogo Almeida, Carroll L. Wainwright, Pamela Mishkin, Chong Zhang, et al. “Training Language Models to Follow Instructions with Human Feedback.” arXiv, March 4, 2022. http://arxiv.org/abs/2203.02155. ↩
Hu, Edward J., Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, and Weizhu Chen. “LoRA: Low-Rank Adaptation of Large Language Models.” arXiv, October 16, 2021. http://arxiv.org/abs/2106.09685. ↩
The text was updated successfully, but these errors were encountered: