|
| 1 | +# 如何微调:关注有效的数据集 |
| 2 | + |
| 3 | +本文关于适应开源大型语言模型(LLMs)系列博客的第三篇文章。在这篇文章中,我们将探讨一些用于策划高质量训练数据集的经验法则。 |
| 4 | + |
| 5 | +- [第一部分](http://www.javaedge.cn/md/AI/methods-adapting-large-language-models.html)探讨了将LLM适应于领域数据的普遍方法 |
| 6 | +- [第二部分](http://www.javaedge.cn/md/AI/to-fine-tune-or-not-to-fine-tune-llm.html)讨论了咋确定微调是否适用于你的实际情况 |
| 7 | + |
| 8 | +## 1 介绍 |
| 9 | + |
| 10 | +微调LLMs是一门艺术与科学的结合,该领域的最佳实践仍在不断发展中。在本篇博文中,我们将突出微调的设计变量,并给出我们迄今为止所见的最佳实践的方向性指导,以在资源受限的情况下微调模型。我们建议使用下面的信息作为制定微调实验策略的起点。 |
| 11 | + |
| 12 | +## 2 全量微调 V.S 参数高效微调(PEFT) |
| 13 | + |
| 14 | +都显示出在应用于新领域时改进了下游性能,无论在[学术](https://arxiv.org/pdf/2312.12148.pdf)环境中还是在[实际设置](https://www.sarvam.ai/blog/announcing-openhathi-series)。选择哪种取决于: |
| 15 | + |
| 16 | +- 可用的计算资源(以GPU小时数和GPU内存衡量) |
| 17 | +- 除目标下游任务之外的任务表现(学习-遗忘权衡) |
| 18 | +- 人工标注成本 |
| 19 | + |
| 20 | +### 2.1 全量微调 |
| 21 | + |
| 22 | +更可能遭受两个问题: |
| 23 | + |
| 24 | +- [模型坍缩](https://arxiv.org/html/2402.07712v1#bib.bib21):模型输出收敛到有限的一组输出,而原始内容分布的尾部消失了 |
| 25 | +- [灾难性遗忘](https://ar5iv.labs.arxiv.org/html/2308.08747) |
| 26 | + |
| 27 | +如该系列的[第一部分](http://www.javaedge.cn/md/AI/methods-adapting-large-language-models.html)所述,灾难性遗忘导致模型失去其能力。一些早期经验研究表明,[全量微调比PEFT更易出现上述问题](https://arxiv.org/abs/2405.09673),尽管还需要进一步研究。 |
| 28 | + |
| 29 | +### 2.2 PEFT技术 |
| 30 | + |
| 31 | +设计上作为微调的自然正则化器。PEFT通常需要相对较少的计算资源来训练下游模型,且对于数据集大小有限的资源受限场景更适用。 |
| 32 | + |
| 33 | +### 2.3 小结 |
| 34 | + |
| 35 | +某些情况下,全量微调在感兴趣的特定任务上表现更好,通常是牺牲了模型的一些原有能力。这种“学习-遗忘”的权衡在LoRA和全量微调之间的比较论文中进行了深入探讨[在此论文](https://arxiv.org/abs/2405.09673)中。 |
| 36 | + |
| 37 | +考虑到资源限制,PEFT技术可能比全量微调提供更好的性能提升/成本比率。如果在资源受限的情况下,下游性能至关重要,那么全量微调将是更有效的。无论在哪种情况下,关键在于创建高质量的数据集,同时牢记以下主要原则。 |
| 38 | + |
| 39 | +## 3 数据集策划 |
| 40 | + |
| 41 | +在文献中的微调实验中,数据集对于充分利用微调至关重要。这不仅仅是“质量更高和更多样例”的问题,你可以智能地投资于数据收集以提高资源受限微调实验的表现。 |
| 42 | + |
| 43 | +### 3.1 数据质量和数量 |
| 44 | + |
| 45 | +#### ① 质量至上 |
| 46 | + |
| 47 | +总体趋势是质量比数量更重要—即最好拥有一小套高质量数据,而非一大套低质量数据。质量的关键原则包括一致的标注、无错误、未标记的数据、噪声输入/输出以及与总体相比具有代表性分布。 |
| 48 | + |
| 49 | +微调时,[LIMA数据集](https://arxiv.org/abs/2305.11206)中的几千个精心挑选的例子比5万个机器生成的Alpaca数据集表现更好。[OpenAI微调文档](https://platform.openai.com/docs/guides/fine-tuning/common-use-cases)建议,即使是50到100个样例的数据集也可能有所作为。 |
| 50 | + |
| 51 | +#### ② 较难的语言任务需要更多数据 |
| 52 | + |
| 53 | +相对较难的任务,如文本生成和摘要,比简单的任务如分类和实体提取更难微调,且需要更多的数据。“较难”可指多种情况:输出中的更多标记、所需的人类能力等级更高、多个正确答案。 |
| 54 | + |
| 55 | +#### ③ 高效高质量数据收集 |
| 56 | + |
| 57 | +由于数据收集昂贵,建议以下策略以提高样本效率和降低成本: |
| 58 | + |
| 59 | +- 观察失败模式:观察先前ML能力失败的例子,并添加针对这些失败模式的例子 |
| 60 | +- 人机协作:这是一种更便宜的方式扩展数据标注。我们使用LLM自动化生成基础响应,人类标注者可以用来在更短时间内完成标注 |
| 61 | + |
| 62 | +### 3.2 数据多样性 |
| 63 | + |
| 64 | +简单来说,如果你过度训练模型以产生某种特定类型的响应,则即使这不是最合适的答案,模型也会偏向于给出那种响应。这里的经验法则是尽可能确保训练数据反映模型在现实世界中的行为方式。 |
| 65 | + |
| 66 | +- **重复:** 这已经被发现[是模型退化的根源](https://aclanthology.org/2022.acl-long.577.pdf),无论是微调还是预训练。通过去重实现的多样性往往能改善性能指标。 |
| 67 | +- **输入的多样性:** 通过改写输入来实现多样性。在[微调SQLCoder2](https://defog.ai/blog/sqlcoder2-technical-details/)时,团队重新表述了伴随SQL查询的纯文本,以引入语法和语义多样性。类似地,[指令回译](https://arxiv.org/abs/2308.06259)已被用于人类编写文本,通过问LLM“这可能是对什么问题的回答?”来生成问答数据集。 |
| 68 | +- **数据集的多样性:** 当微调更一般的下游任务——例如多语言适应——时,使用多样化的数据集已被证明可以改善模型遗忘原始能力与学习新能力之间的学习-遗忘权衡。为不同语言如[印地语](https://www.sarvam.ai/blog/announcing-openhathi-series)和[奥迪亚语](https://arxiv.org/pdf/2312.12624.pdf)微调的模型使用了丰富的语言特定数据集与其他指令微调数据集,如[FLAN](https://github.com/google-research/FLAN)、[Alpaca](https://github.com/tatsu-lab/stanford_alpaca)、Dolly等,以增加多样性。 |
| 69 | +- **标准化输出:** 从输出中移除空格和其他格式花招已被证明是有帮助的。[SQLCoder2](https://defog.ai/blog/sqlcoder2-technical-details/)从生成的SQL中移除空格,让模型专注于学习重要的SQL概念,而不是像空格和缩进这样的花招。如果你希望回答中有特定的语气,“帮助台聊天机器人是...”,那么在每个例子中都加入这些内容。 |
| 70 | + |
| 71 | +## 4 基于LLM的数据管道 |
| 72 | + |
| 73 | +为了策划高质量多样化的数据集,数据管道经常使用LLM来减少标注成本。实践中观察到的技术: |
| 74 | + |
| 75 | +- **评估:** 使用高质量数据集训练模型并利用它来标注你较大的数据集,以过滤出高质量的例子 |
| 76 | +- **生成:** 用高质量的例子种子LLM并提示其生成类似的高质量例子。[合成数据最佳实践](https://arxiv.org/html/2404.07503v1)正在形成中 |
| 77 | +- **人机协作:** 使用LLM生成一组初始输出,并用人来通过编辑或选择偏好来提高质量 |
| 78 | + |
| 79 | +## 5 调试你的数据集 |
| 80 | + |
| 81 | +- **评估你的数据集中的不良输出:** 如果模型在某些方面仍然表现不佳,添加直接展示给模型如何正确处理这些方面的训练例子。如果你的模型有语法、逻辑或风格问题,检查你的数据是否有同样的问题。例如,如果模型现在说“我会为你安排这次会议”(当它不应该这样做时),看看现有例子是否教会了模型说它可以做它不能做的事情。 |
| 82 | +- **审视正负类平衡:** 如果数据中有60%的助手回应说“我无法回答这个问题”,但在推理阶段只有5%的回应应该这么说,那么你可能会得到过多的拒绝回应。 |
| 83 | +- **详尽性和一致性:** 确保你的训练例子包含所有需要的回应信息。如果我们希望模型根据用户的个人特质赞美用户,并且训练例子中包含了对前面对话中没有提到的特质的助手赞美的例子,模型可能会学会虚构信息。确保所有的训练例子都是以预期的格式呈现,以便推理。查看训练例子中的一致性。如果多人创建了训练数据,那么模型的表现很可能受到人们之间一致性的限制。例如,在文本抽取任务中,如果人们只在70%的抽取片段上达成一致,模型很可能也无法做得更好。 |
| 84 | + |
| 85 | +## 6 结论 |
| 86 | + |
| 87 | +微调是LLMs开发的重要组成部分,需要在资源限制下取得微妙的权衡! |
0 commit comments