通俗易懂理解 模型微调finetune

课程推荐:

  1. 快读概览:通俗易懂理解大模型预训练和微调
  2. 结合代码:PyTorch10天入门-09-模型微调
  3. 系统讲解:微调大模型Finetuning LLMs,斯坦福吴恩达 | Sharon Zhou教授联合出品

概述

起源:

随着深度学习的发展,模型的参数越来越大,许多开源模型都是在较大数据集上进行训练的,但是将模型直接使用到自己的应用场景,效果可能并不理想。
(补一个前提:为什么要使用的大模型呢? 因为现实训练中大模型能取得好的效果......)

如果从零训练大模型,会面临

  1. 数据集不够:几千张数据训练几千万参数的大模型,过拟合无法避免。
  2. 成本巨大:即使有足够的数据量(收集数据也需要大量成本),大部分人无法承受模型训练的时间和资金成本。

解决方案:

  1. 应用迁移学习(transfer learning),将从源数据集学到的知识迁移到目标数据集上。
    比如:ImageNet数据集的图像大多跟椅子无关,但在该数据集上训练的模型可以抽取较通用的图像特征,从而能够帮助识别 边缘、纹理、形状和物体组成。

补: 迁移学习Transfer learning 与 元学习Meta-learning,二者的联系和差异?

  1. 模型微调(finetune):就是先找到一个同类的别人训练好的模型,称为预训练模型(Pre-trained Model),基于Pre-trained Model换成自己的数据,通过训练调整一下部分参数。

这里提醒一下, 一般来说 模型微调后和pre-trained model结构几乎一致(如果增加了新的层,从pre-trained model复制来的层 结构几乎一致),更多的是参数的区别。

流程理解

模型微调(finetune)都需要做什么?

  1. 换数据源
  2. 对预训练模型(Pre-trained Model)的k层进行重新训练,调整k层的权重&shape

这里的k层是指一个随机数,不是指attention的QKV层中的K层
另外附个文章:【思考】为什么大模型lora微调经常用在attention的Q和V层而不用在K层呢

finetune伪流程

  1. 冻结预训练模型Pre-trained Model的初始层(比如k层),使其在训练过程中参数不改变;
  2. 在目标数据集上训练目标模型。结果就是冻结的k层参数和Pre-trained Model一致,而剩余的n-k层的参数都是基于源模型的参数微调得到的。

使用指南

不同数据集下使用微调:

  1. 数据集1 - 数据量少,但数据相似度非常高 - 在这种情况下,我们所做的只是修改最后几层或最终的softmax图层的输出类别。

  2. 数据集2 - 数据量少,数据相似度低 - 在这种情况下,我们可以冻结预训练模型的初始层(比如k层),并再次训练剩余的(n-k)层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。

  3. 数据集3 - 数据量大,数据相似度低 - 在这种情况下,由于我们有一个大的数据集,我们的神经网络训练将会很有效。但是,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同。使用预训练模型进行的预测不会有效。因此,最好根据你的数据从头开始训练神经网络(Training from scatch)

  4. 数据集4 - 数据量大,数据相似度高 - 这是理想情况。在这种情况下,预训练模型应该是最有效的。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后,我们可以使用在预先训练的模型中的权重来重新训练该模型。

代码上 finetune 一般流程:

前提: 在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型

  1. 创建一个新的神经网络模型,即目标模型,它复制了源模型上除了输出层外的所有模型设计及其参数;
  2. 冻结k层使其在训练过程中参数不改变;
  3. 为目标模型添加一个输出⼤小为⽬标数据集类别个数的输出层,并随机初始化该层的模型参数;
  4. 在目标数据集上训练目标模型。我们将从头训练输出层,冻结的k层不变,而剩余的n-k层的参数都是基于源模型的参数微调得到的。

实际的代码可以参考:pytorch06——模型微调

微调指导事项

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42250789/article/details/108832004
————————————————

  1. 通常的做法是截断预先训练好的网络的最后一层(softmax层),并用与我们自己的问题相关的新的softmax层替换它。例如,ImageNet上预先训练好的网络带有1000个类别的softmax图层。如果我们的任务是对10个类别的分类,则网络的新softmax层将由10个类别组成,而不是1000个类别。然后,我们在网络上运行预先训练的权重。确保执行交叉验证,以便网络能够很好地推广。

  2. 使用较小的学习率来训练网络。由于我们预计预先训练的权重相对于随机初始化的权重已经相当不错,我们不想过快地扭曲它们太多。通常的做法是使初始学习率比用于从头开始训练(Training from scratch)的初始学习率小10倍。

  3. 如果数据集数量过少,我们进来只训练最后一层,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法。这是因为前几个图层捕捉了与我们的新问题相关的通用特征,如曲线和边。我们希望保持这些权重不变。相反,我们会让网络专注于学习后续深层中特定于数据集的特征。

posted @ 2024-07-22 00:01  kingwzun  阅读(17)  评论(0编辑  收藏  举报