OpenAI官方教程:如何针对大模型微调以及微调后模型出现的常见问题分析和解决思路~以GPT-3.5微调为例

标签:#OpenAI##大模型微调##微调数据制作# 时间:2023/08/23 11:46:59 作者:小木

OpenAI在2023年8月份发布了GPT-3.5的微调接口,并表示会在2023年秋天开放16K的gpt-3.5-turbo-16k模型和GPT-4的微调(参考:重磅!GPT-3.5可以微调了!OpenAI发布GPT-3.5 Turbo微调接口)。然而,微调并不是一个简单的问题,如何对大模型微调以及如果微调出现问题该如何解决都是需要考虑的问题。本文以OpenAI官方发布的微调指南为基础,总结一下OpenAI官方的微调经验。


[TOC]

大模型微调简介

大模型微调是指对大模型预训练结果进行额外的训练,以适应特定的任务或数据集。这允许模型继承其原始训练中的知识,并为特定应用进行优化。

与大模型微调通常一起出现的还包括prompt工程。

大模型微调和prompt工程是两种不同的方法,来定制和改进大型语言模型的表现。

大模型微调涉及到利用额外的数据集,针对特定的下游任务进行模型的fine-tuning。它通常包括冻结模型中大部分的参数,只训练最后几层以适应下游任务。这可以提高模型在特定任务上的表现,但可能会损害模型的泛化能力。

Prompt工程则是通过改变模型输入的prompt,来引导其生成所需的输出,而不需要修改模型本身。例如,可以输入“Translate this to Chinese: Hello”,来让模型进行英文到中文的翻译,而不需要训练一个翻译模型。Prompt工程的优点是可以利用预训练好的通用语言模型,生成各种定制输出,而不需要针对每个任务进行fine-tuning。

总体来说,微调适合有大量目标任务数据的情况,可以获得针对特定任务优化的模型。而Prompt工程更灵活,可以通过改变prompt来操控大模型,避免对模型本身进行修改。两者都可用于改进预训练语言模型的表现。

OpenAI建议的大模型微调的使用场景

进一步来说,大模型微调由于需要改变模型的参数,需要更高的成本,因此也需要仔细甄别什么情况下该使用大模型的微调。

OpenAI官方也强调,建议先考虑使用Prompt工程来调优大模型,如果Prompt工程调优依然无法解决,再考虑微调。

总结一下,当大模型在解决问题的时候遇到如下情况,那就需要考虑大模型微调了:

  • 特定应用优化:微调 GPT 模型可以使其更适合特定应用。这些应用并不是主流模型泛化能力可以解决的。例如特定行业的特定问题,如医疗、私有数据等方面的知识。

  • 超出提示的能力:当模型通过更好的提示仍然无法获得满意的结果时,可以考虑微调。但是,需要注意的是,很多任务可能开始的时候大模型不能很好解决,但是如果通过提示工程可以解决,那么暂时是不需要微调的。

  • 快速反馈循环不足:当使用提示和其他策略的反馈循环不足以获得所需的结果时,微调可能是一个更好的选择。

OpenAI官方认为,下面一些常见用例是可以使用微调方法的:

  • 设置风格、语调、格式或其他定性方面。
  • 提高产生所需输出的可靠性。
  • 纠正不遵循复杂提示的失败。
  • 以特定方式处理许多边缘情况。
  • 执行难以在提示中明确表述的新技能或任务。
  • 成本和延迟优化:微调在降低成本和/或延迟方面也是有效的,可以通过使用较短的提示来替换原来需要复杂提示才能完成的任务,这在GPT-4这种高成本模型应用上可以降低资源消耗,而不牺牲质量。

也就是说,大模型微调做的好可能会有如下效果:

  1. 比提示有更高质量的输出
  2. 可以比prompt接受更多的数据
  3. 微调之后可以用更短的prompt获得回复
  4. 请求的延迟会降低

OpenAI的大模型微调实践指南与经验总结

大模型微调的工程化经验十分重要,并不是准备一些数据做微调就能让大模型获得更好的结果。在数据集质量、数量以及微调方式上都有很多需要考虑的内容。

大模型微调数据集需要考虑的问题

当你准备微调大模型的数据集时,需要注意以下问题:

  • 数据集需要有多样性:你应该创建一组多样化的示范对话,这些对话应与你在生产环境中要求模型响应的对话相似。多样性的数据有助于模型的泛化能力。

  • 需要有针对目标问题的明确回复:前面说过,在微调之前你应该做过很多提示工程,当各种prompt工程都无法解决某些问题的时候,你应该把这个问题和正确的答案放到微调数据集中来直接提升大模型微调的效果。

  • 注意过多拒绝问题:如果数据中60%的助理响应都是“我不能回答这个”,你可能会得到过多的拒绝。简单来说,这是因为模型会根据其在训练数据中看到的内容来学习和做出决策。如果模型在训练数据中经常看到某种响应,它就会认为在实际情境中也应该经常给出这种响应。所以,如果训练数据中有大量的“我不能回答这个”响应,模型在实际使用时也可能过于频繁地给出这种响应,即使实际情况并不需要这么多这样的回答。这就是所谓的“过多的拒绝”。

  • 训练示例的完整性:确保你的所有训练示例都包含生成响应所需的所有信息。包括问题和回答都要能比较全面。如果你的指令(问题)很短,如果在希望模型可以学会很短的指令就能回复很好,因此构造了较短的指令,那么在推理时可能很难让模型忽略那些“内置”的指令。

  • 训练示例的一致性:如果多人创建了训练数据,模型的性能可能会受到人与人之间的一致性/水平的限制。

  • 数据格式:确保你所有的训练示例都采用与推理期望的相同格式。

  • 数据数量的迭代:你可以考虑增加训练示例的数量,这有助于模型更好地学习任务,特别是围绕可能的“边缘情况”。

  • 需要注意tokens的限制:例如,OpenAI目前GPT-3.5 Turbo每个训练示例限制为4096个tokens。超过此数目的示例将在训练时被截断为前4096个。

这些注意事项有助于确保微调过程的成功,并使模型更好地适应特定的任务或需求。

除了上面的数据相关的问题外,还有一些经验和问题是与具体的微调方法有关,比如微调的参数比例选择等。由于OpenAI官方没有给出自己模型的细节,这些问题也就没有答案。

微调数据集数量多少才有比较好的效果?

这是很多人都关心的问题。但是OpenAI官方给出的数据十分惊讶!OpenAI建议微调gpt-3.5-turbo模型最少只需要10条数据即可微调,建议50-100条精选的数据就比较好。有50条数据之后,模型就可以从微调中获得一个比较明显的提升效果!

因此,官方建议是从50个精心制作的示例数据开始微淘,并查看微调后模型是否有所改进

在某些情况下,这可能已经足够了,但即使模型还没有达到生产质量,明显的改进也是一个好兆头,表明提供更多的数据将继续提高模型的性能。如果没有改进,这表明您可能需要重新考虑如何为模型设置任务或在扩展有限的示例集之前重新结构数据。

不过根据前面的叙述,有很多情况都需要增加数据集,例如指令数据很短、边缘案例比较多、答案和指令的多样性不够等。那么提升数据量也会有效果。

不过,需要注意的是,这是OpenAI的GPT-3.5 Turbo的微调数据,但是实际根据不同的选择会有差别。但是这里核心的观点是选择少数精心制作的、模型之前不能很好回答的问题用于微调可以从少量数据看到模型提升的效果

大模型微调结果分析

微调的效果分析也很重要。这里OpenAI也提供了一些简单的方式。

查看统计指标

首先就是看微调过程中的评估统计指标,如训练loss、训练token准确率、测试loss和测试token准确率。这些统计数据旨在提供一个训练过程顺利的初步检查(损失应该减少,token准确率应该增加)。

直接检查回答结果

其次就是直接检查回答结果,OpenAI认为从微调模型生成的样本提供了模型质量的最相关感知。建议从基础模型和微调模型在测试集上生成样本,并将样本进行逐一比较。测试集应该理想地包括您可能发送给模型进行推理的所有输入的完整分布。

数据集质量提升

最后就是数据集质量的提升。如果微调工作的结果不如预期,可以考虑以下方法来调整训练数据集:

  • 针对剩余问题收集示例:如果模型在某些方面仍然不好,添加直接向模型展示如何正确执行这些方面的训练示例。
  • 检查微调模型中是否存在与微调数据相同的语法、逻辑或风格问题,如果是,说明数据集质量可能要提高。
  • 考虑数据的平衡和多样性。
  • 确保您的训练示例包含了生成响应所需的所有信息。
  • 查看训练示例中的一致性。如果是多个人一起制作的微调数据,需要看看不同人的数据是否有一致性!
超参数调节

根据可以设置的超参数,如epoch数量等进行条件来测试是否更理想。例如,如果模型的多样性比预期的要低,请将epoch数量减少1或2。

大模型微调总结

微调可以为用户提供比prompting更高质量的结果,能够在更多的示例上进行训练,节省token并减少延迟。

但是微调过程有很多问题也不容易解决,建议大家多积累经验~

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
相关博客