Fine-tuning(微调):通过特定领域数据对预训练模型进行针对性优化,以提升其在特定任务上的性能。
一、Fine-tuning 介绍
(1)微调的定义
大模型微调是利用特定领域的数据集对已预训练的大模型进行进一步训练的过程。它旨在优化模型在特定任务上的性能,使模型能够更好地适应和完成特定领域的任务。
(2)微调的核心原因
微调的核心原因是赋予大模型更加定制化的功能。通用大模型虽然强大,但在特定的领域表现不佳。通过微调可以使模型更好地适应特定领域的需求和特征。
(3)微调与超参数优化
微调过程中,超参数的调整至关重要。超参数如学习率、批次大小和训练轮次等需要根据特定任务和数据集进行调整,以确保模型在训练过程中的有效性和性能。
二、Fine-tuning 的原理
大模型微调的步骤:在选定相关数据集和预训练模型的基础上,通过设置合适的超参数并对模型进行必要的调整,使用特定任务的数据对模型进行训练以优化其性能。
具体来说,大模型微调包含以下四个核心步骤:
(1)数据准备:
· 选择与任务相关的数据集。
· 对数据进行预处理,包括清洗、分词、编码等。
(2)选择基础模型:
· 选择一个预训练好的大语言模型,如BERT、GPT-3等。
(3)设置微调参数:
· 设定学习率、训练轮次(epochs)、批处理大小(batch size)等超参数。
· 根据需要设定其他超参数,如权重衰减、梯度剪切等。
(4)微调流程:
· 加载预训练的模型和权重。
· 根据任务需求对模型进行必要的修改,如更改输出层。
· 选择合适的损失函数和优化器。
· 使用选定的数据集进行微调训练,包括前向传播、损失计算、反向传播和权重更新。
三、Fine-tuning 的应用
大模型微调的方式:可通过全量调整所有参数以充分适应新任务,或采用参数高效微调技术仅优化部分参数以实现快速且低成本的迁移学习。
(1)全量微调(Full Fine-Tuning)
全量微调利用特定任务数据调整预训练模型的所有参数,以充分适应新任务。它依赖大规模计算资源,但能有效利用预训练模型的通用特征。
(2)参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)
PEFT旨在通过最小化微调参数数量和计算复杂度,实现高效的迁移学习。它仅更新模型中的部分参数,显著降低训练时间和成本,适用于计算资源有限的情况。PEFT技术包括Prefix Tuning、Prompt Tuning、Adapter Tuning等多种方法,可根据任务和模型需求灵活选择。
-- Prefix Tuning
· 方法:在输入前添加可学习的virtual tokens作为Prefix。
· 特点:仅更新Prefix参数,Transformer其他部分固定。
· 优点:减少需要更新的参数数量,提高训练效率。
-- Prompt Tuning
· 方法:在输入层加入prompt tokens。
· 特点:简化版的Prefix Tuning,无需MLP调整。
· 优点:随着模型规模增大,效果接近full fine-tuning。
-- P-Tuning
· 方法:将Prompt转化为可学习的Embedding层,并用MLP(多层感知器)+LSTM处理。
· 特点:解决Prompt构造对下游任务效果的影响。
· 优点:提供更大的灵活性和更强的表示能力。
-- P-Tuning v2
· 方法:在多层加入Prompt tokens。
· 特点:增加可学习参数数量,对模型预测产生更直接影响。
· 优点:在不同任务和模型规模上实现更好的性能。
-- Adapter Tuning
· 方法:设计Adapter结构并嵌入Transformer中。
· 特点:仅对新增的Adapter结构进行微调,原模型参数固定。
· 优点:保持高效性的同时映入少量额外参数。
-- LoRA:
· 方法:在矩阵相乘模块中引入低秩矩阵来模拟full fine-tuning。
· 特点:更新语言模型中的关键低秩维度。
· 优点:实现高效的参数调整,降低计算复杂度。
四、什么情况下使用微调
1)使用的数据集和预训练模型的数据集相似。如果不相似,比如用的预训练的参数是关于自然景物,而目标是做人脸识别,效果可能就不太好,因人脸特征和自然景物特征的提取是不同的,所以相应的参数训练也是不同的。
2)需要从零开始搭建或者已使用的模型正确率太低。
3)数据集相似,但数据集数量太少。
4)计算资源太少。
五、不同数据集下使用微调
1)数据量少,但数据相似度非常高。在这种情况下,可以只是修改最后几层或最终的softmax图层的输出类别。
2)数据量少,数据相似度低。在这种情况下,可以冻结预训练模型的初始层(比如k层),并再次训练剩余的(n-k)层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。
3)数据量大,数据相似度低。在这种情况下,由于有一个大数据集,神经网络训练将会很有效。但是由于数据与用于训练预训练模型的数据有较大的不同,使用预训练模型进行预测的效果可能不是很好。因此,最好根据新数据从头开始训练神经网络。
4)数据量大,数据相似度高。在这种理想情况下,预训练模型应该是最有效的。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后可以使用在预训练模型中的权重来重新训练该模型。
六、微调指导事项
1)通常的做法是截断预训练好的网络的最后一层(softmax)层,再用与我们问题相关新的softmax层去替换它。例如,ImageNet上预先训练好的网络带有1000个类别的softmax图层。若我们的任务是对10个类别分类,则网络的新softmax层将由10个类别组成,而不是1000个类别。然后在网络上运行预先训练的权重,但要确保执行交叉验证,以便网络能够很好地推广。
2)使用较小的学习率来训练网络。由于我们预计预训练的权重相对于随机初始化的权重已经相当不错,不想过快地扭曲它们太多。通常的做法是使初始学习率比用于从头开始训练的初始学习率小10倍。
3)如果数据集数量过少,可以只训练最后一层;如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法。这是因为前几个图层捕捉了与我们新问题相关的通用特征,如曲线和边,我们希望保持这些权重不变。相反,我们会让网络的专注于学习后续深层中特定于数据集的特征。
七、涉及到的其他的知识
(1)学习率
将输出误差反向传播给网络参数,以此来拟合样本的输出。本质上是最优化的一个过程,逐步趋向于最优解。但是每一次更新参数利用多少误差就需要通过一个参数来控制,这个参数就是学习率,也称为步长。
学习率越大,输出误差对参数的影响就越大,参数更新的就越快,但同时受到异常数据的影响也就越大,梯度可能会在最小值附近来回震荡,甚至可能无法收敛。当学习率设置的过小时,收敛过程就会变得十分缓慢。
最理想的学习率不是固定值,而是一个随着训练次数衰减的变化值,也就是在训练初期,学习率比较大,随着训练的进行,学习率不断减小,直到模型收敛。
(2)迁移学习
迁移学习(Transfer learning)就是把已训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务都是存在相关性的,因此通过迁移学习可将已学到的模型参数(也可理解为模型学到的知识)通过某种方式分享给新模型从而加快并优化新模型的学习效率,不用像大多数网络那样从零学习。
(1)Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。
(2)Extract Feature Vector:先计算出预训练模型卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
(3)Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。
# 注:Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”,这可以有很多方法和手段,例如SVM,贝叶斯,CNN等,而fine-tune只是其中的一种手段,更常用于形容迁移学习的后期微调中。
为什么要迁移学习?
1)站在巨人的肩膀上。前人花很大精力训练出来的模型在大概率上会比自己从零开始搭的模型要好。
2)训练成本可以很低。若采用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用CPU都完全无压力,没有深度学习机器也可以做。
3)适用于小数据集。对于数据集本身很小的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因越大的模型对数据量的要求越大,过拟合无法避免。这时如果还想实现大型神经网络的超强特征提取能力,只能靠迁移学习。
原文章作者的理解:
1)迁移学习,学习的是整个结构,包括函数权重参数等;而fine-tuning学习的是前n层的参数。
2)fine-tuning 是迁移学习的方法之一。
(3)Hugging face
Hugging Face:一个提供丰富预训练模型和工具的领先平台,助力自然语言处理(NLP)任务的快速开发与部属。
该平台的特性:
· 跨平台兼容性:与TensorFlow、Pytorch和Keras等主流深度学习框架兼容。
· 微调便捷性:提供微调工具,节省从头开始训练模型的时间和精力。
· 社区支持:拥有庞大且活跃的用户社区,提供互助和支持。
· 文档丰富:提供大量文档,便于用户学习和有效使用平台。
该平台的功能:
· 提供多种NLP任务的模型库,如语言翻译、文本生成和问答。
· 提供了在特定数据集上微调预训练模型的工具。
· 提供了访问和利用应用程序中预训练模型的API。
· 提供了构建定制模型并将其部署到云端的工具。
参考文章: