以及大模型微调的原理是什么 你知道什么是微调吗 大模型为什么要微调

“预训练(pre+train)+微调(fine+tuning),是目前干流的范式”

在学习大模型的环节中,怎样设计神经网络和怎样训练模型是一个关键又基础的操作。

但与之对应的微调也是一个十分关键的手腕,这里就着重讲一下为什么要微调,其好处是什么以及微调的实质。

01、什么是微调?

学习一门技术岂但要知其然,也要知其所以然。

想了解为什么要微调,首先要知道什么是微调?

咱们常说的大模型,指的是具备少量参数的神经网络模型,详细的可以看之前的文章​ ​大模型的参数是什么​ ​。而后经过少量的训练数据训练进去的模型叫做大模型,也叫做预训练模型。

微调指的是微调大模型,是在预训练模型(曾经训练好的大模型)基础之上,经常使用大批数据对大模型的所有或局部参数启动调整,以到达在某个畛域更好的成果。

举例来说,刚设计好的一个神经网络,就相似于一个素来没上过学的在校生,他什么玩意都疑问,只会依据自己的天性去处置疑问;

而训练大模型就相当于让这个在校生实现了九年制义务教育或许上了大学,也就是说它接受过系统的教育,天文天文,物理化学等等均有涉猎,这样的模型就叫做预训练模型。

而微调就是在这个基础上实现某个方向的强化,比如想让这个在校生去加入奥数较量,就要让他对数学启动强化学习。

这个就是微调。

02、为什么要微调?

前面说了什么是微调,这里讲一下为什么要微调?

之所以要求启动微调,关键有以下两方面要素:

之所以要启动微调,其实最关键的要素就是老本疑问。openAI公司训练GPT模型,一次性的老本大略在几百万到上千万美元;换算成人民币就是上千万到上亿的老本。

只管很多公司经常使用的大模型不要求有GPT模型那么弱小,也不要求上亿的训练老本,但从零开局训练一个大模型,少说也要几百万人民币,这对团体和绝大局部公司来说都是无法接受的。

还一个要素就是,训练数据的搜集雷同要求渺小的老本,而抛开成原本说,很多公司基本无法搜集到足够的训练数据,而没有足够的训练数据,那么就很难训练出一个很好的模型。

这时,微调的作用就表现进去了。微调只要要在他人曾经训练好的模型之上,经常使用大批的数据对模型局部或所有参数启动调整即可。

之所以说对预训练模型的所有或局部参数启动调整是由于,微调分为 全量(参数)微调(Full Fine Tuning) 局部(参数)微调——高效微调 PEFT(Parameter-Efficient Fine Tuning) ,只不过很少有人会启动全量微调。

全量微调就相当于,你原本只是在一个个别的本科院校学习;而后突然有一天有个时机让你到一所985/211的学校去学习,学习的内容还是一样,不过人家教的会更好。

局部参数微调就是相当于,你进了你们学校的试验班或突击班,去强化学习局部课程。

所以什么状况下适宜微调?

这几种状况比拟适宜微调,假设不缺钱,又不缺数据,技术又过关;那么自己设计模型,自己训练是最好的模式。

当然,微调也不是万能的,只要在相似的条件下才可以启动微调;比如,一个识别猫狗的预训练模型,你要用人脸数据启动人脸识别微调,这就行不通了。毕竟,猫狗的数据特色和人脸还是有很大差异的。

02、怎样微调,微调的详细步骤?

前面说了,微调的目标是调整模型的参数,所以实质上和步骤上微和谐训练没太大区别,都要求经过数据搜集处置,数据加载,正向流传,反向流传提升的环节,而后给模型参数找到一个最优解。

只不过微调大局部状况下都是调整局部参数,而这种微调模式叫做——高效微调。也就是说用大批的数据,提升局部参数,以到达更好的成果。

既然是对模型参数的调整,那么详细是怎样操作的呢?

在神经网络的训练环节中,有数据处置,正向流传,反向流传和提升器,假设不了解神经网络训练环节的可以看​ ​神经网络的通用训练流程​ ​。

而微调就出当初 提升器 上,训练的环节是提升器依据损失差经过反向流传的模式调整参数;而微调也是经过提升器去调整模型的参数。

基于pytorch框架的神经网络,其微调局部参数的原理就是经过 解冻参数 ,把不要求调整的参数解冻,这样大模型在微调的环节中就只会提升可以被调整的参数。

而全量微调就是不解冻参数,一切参数都会被调整。

代码如下所示:

"""基于pytorch框架的神经网络"""# 加载模型model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto", device_map="auto")# 失掉模型参数for name, param in model.parameters():# 判别哪些参数要求解冻 参数名中蕴含bias的参数被解冻 不会被修正if "bias" not in name:param.requires_grad = False# 提升器optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

这样,经过微调模型,就可以让预训练模型到达自己想要的成果。

原文链接:​​​ ​​ ​

您可能还会对下面的文章感兴趣: