但这在今天仍然有用——许多人发现微调变形金刚是出了名的棘手,也许这里的一些观察结果会有所帮助。
我们将为目前正在进行的Kaggle-LLM科学考试比赛微调Deberta V3模型。
搭建舞台
业务的第一顺序——我们使用Deberta骨干构建一个MultipleChoice
模型。
事实证明,这需要创建一个自定义头部,这些新的砝码是未经训练的。
如果我们现在开始训练整个模型,所有穿过我们未经训练的头部的梯度都会开始击中模型的其余部分,并可能将其向可能没有太大帮助的方向移动。
我们不希望这种情况发生。我们希望尽可能地保护这些预先训练的重量。
解决方案很简单——首先,训练头部,保持模型的其余部分冻结!
现在,当我们训练模型时,流经我们骨干的梯度将具有更多的意义。
我们现在更有可能以一种真正改进模型的方式更新权重,而不是作为未经训练的头部可能做的任何事情的副作用。
回到起源
那么,我们如何训练完整模型呢?
我们可以试着想出一套超参数,然后做几次火车运行,但为什么要从空白页开始呢?
相反,让我们通过了解模型最初是如何训练的,让我们的生活更轻松。
这都是粗略的近似值,但看看论文作者非常友好地分享的存储库,我们发现训练了一个可比模型,learning rate
为1e-4
,批次大小为256
。
此外,他们充分利用了warmup
(这似乎是变压器模型的主题)。
我计划进行9batch size
的培训。然而,由于这是一个选择题,我的模型将每批看到9x5
个示例。
如果我们将学习率线性扩展到我们的batch size
,我们就会发现我们应该以1.75e-5
的学习率进行培训(因为1e-4 / 256 * 45 = 1.75e-5
)。
在这一点上,我进行了几次简短的测试,模型似乎确实在这种学习率下训练得很好!
最重要的是-不要伤害
我没有任何东西可以支持这种直觉(除了它过去多次为我工作得很好),但每当我微调模型时,我觉得我必须非常小心如何对待预训练的重物。
分析跑步的结果,在我看来,随着训练(特别是如果我对模型看到的数据质量不谨慎),模型会随着训练步骤的数量而恶化,超出了可能归因于过拟合!
通常,在进行下游任务培训时,我们不会拥有像预培训中使用的数据那样高质量的数据!
但让我们把这些主观概念放在一边。
谢天谢地,我可以进行一些测试,看看假设这些假设它们是真的,遵循上述直觉的解决方案是否会导致。
他们确实做到了!
那么,我最终使用的一套技术是什么?
它们都来自进化的ULMFiT论文(就像我上面提到的选择性模型冻结一样)。
我可能不想改变单词嵌入——我的例子可以教给模型任何东西,而不是它已经学到的关于单词含义的东西(即语言模型部分),这是不现实的。
好的,所以我冻结了嵌入和与之相关的任何内容(LayerNorm
权重)。
但我在那里还没有完成。
假设只有嵌入才应该被冻结是不合理的。事实上,假设模型的所有部分都应该在同等程度上进行培训也是不合理的。
再做几个测试和几行代码,我得出了以下食谱。
似乎有效的食谱
我开始只用第5层训练模型(模型由24个不同的层组成)。
但我也使用差异化学习率。
由于我不希望我的代码超级混乱,我把我想训练的模型部分分解为参数,并根据给定参数在堆栈中的位置,为每个参数分配一个由余弦函数缩放的学习率。
因此,我最终有100
不可训练的和294
可训练的参数。对于可训练的参数,我分配了按余弦函数缩放的1e-5
的learning rate
(在我的实验中比线性缩放效果更好,这在直觉上似乎也是有意义的)。
在训练期间,我使用超过40%的火车步数的线性热身,并以恒定的学习率进行训练。
发现一个新的维度
在这次比赛中,我想出了一个使用gpt-3.5-turbo
生成额外火车示例的好方法。
你知道这是什么感觉吗?
你还记得我上面说过在各种数据上训练你的模型是关键吗?
这些是非常高方差的模型,它们将轻松地接收您训练数据中的任何规律性。
但随着我不断添加火车示例……结果不断提高!
生成6k高质量示例要花多少钱?
这太疯狂了。
提示很重要,但创建高质量的数据集远不止于此!
- 改进您在提示中向LLM展示的示例怎么样?
- 改进您希望模型以示例为基础的信息怎么样?
- 改进您用于验证示例是否具有所需质量的逻辑怎么样?你也可以用法学硕士吗?
这增加了一个全新的维度,我对此感到非常兴奋。
每1000个例子1美元,我可以无休止地迭代。
我还可以生成尽可能多的数据,以至于我的模型在训练期间一次看到一个例子,但仍然停止改进,增加训练步骤(通过对数据子集的训练变得一种真正的可能性)
这真是太强大了。一旦我们获得一个LLM,其几代人在商业环境中是可行的,并将像现在gpt-3.5-turbo
一样可靠地产生新的例子,世界将永远改变。
能够以这种方式生成数据以优化定制下游任务模型的人和企业将有一个全盛时期。
PS。我为什么不包括来自培训运行的信息来支持我的索赔呢?
我为社区和我的朋友提供这篇博客文章,作为一项服务——推理本身是有价值的,恕我直言。在周日下午,我有2个小时的时间来写这篇博客文章(早些时候,我在一个创纪录的时间内组装了一个Kaggle内核并共享了一个数据集)。
没有人为这项工作付钱给我,就个人而言,我的主要重点是学习如何很好地训练人工智能模型。
我测试假设的方法并不完美,我理解它的局限性(例如,只是在这次调查的中途,我到达了一个我满意的验证集),但在这个项目的背景下,我100%相信我现在可以很好地训练这些模型™。