关于fine-tune “微调”

news2024/11/25 8:18:44

大模型的 Fine-tune

我们对技术的理解,要比技术本身更加重要。

正如我在《大模型时代的应用创新范式》一文中所说,大模型会成为AI时代的一项基础设施。

作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术实力强、财力雄厚的公司去做。

绝大多数人,是水、电的应用者。对这部分人来说,掌握如何用好大模型的技术,更加重要。

用好大模型的第一个层次,是掌握提示词工程(Prompt Engineering),《人人都需要掌握的Prompt Engineering技巧》一文中有详细的介绍,这里不再赘述。

用好大模型的第二个层次,是大模型的微调(Fine Tuning),这也是今天这篇文章的主题。

今天这篇文章,我们抛开复杂的技术细节,用最通俗、直观的语言,为大家揭开大模型微调技术的神秘面纱。

什么是大模型

开始之前,为了方便大家理解,我们先对大模型做一个直观的抽象。

本质上,现在的大模型要解决的问题,就是一个序列数据转换的问题:

输入序列 X = [x1, x2, ..., xm], 输出序列Y = [y1, y2, …, yn],X和Y之间的关系是:Y = WX。

我们所说的“大模型”这个词:“大”是指用于训练模型的参数非常多,多达千亿、万亿;而“模型”指的就是上述公式中的矩阵W。

在这里,矩阵W就是通过机器学习,得出的用来将X序列,转换成Y序列的权重参数组成的矩阵。

需要特别说明:这里为了方便理解,做了大量的简化。在实际的模型中,会有多个用于不同目的的权重参数矩阵,也还有一些其它参数。

为什么要对大模型进行微调

通常,要对大模型进行微调,有以下一些原因:

第一个原因是,因为大模型的参数量非常大,训练成本非常高,每家公司都去从头训练一个自己的大模型,这个事情的性价比非常低;

第二个原因是,Prompt Engineering的方式是一种相对来说容易上手的使用大模型的方式,但是它的缺点也非常明显。因为通常大模型的实现原理,都会对输入序列的长度有限制,Prompt Engineering 的方式会把Prompt搞得很长。

越长的Prompt,大模型的推理成本越高,因为推理成本是跟Prompt长度的平方正向相关的。

另外,Prompt太长会因超过限制而被截断,进而导致大模型的输出质量打折口,这也是一个非常严重的问题。

对于个人使用者而言,如果是解决自己日常生活、工作中的一些问题,直接用Prompt Engineering的方式,通常问题不大。

但对于对外提供服务的企业来说,要想在自己的服务中接入大模型的能力,推理成本是不得不要考虑的一个因素,微调相对来说就是一个更优的方案。

第三个原因是,Prompt Engineering的效果达不到要求,企业又有比较好的自有数据,能够通过自有数据,更好的提升大模型在特定领域的能力。这时候微调就非常适用。

第四个原因是,要在个性化的服务中使用大模型的能力,这时候针对每个用户的数据,训练一个轻量级的微调模型,就是一个不错的方案。

第五个原因是,数据安全的问题。如果数据是不能传递给第三方大模型服务的,那么搭建自己的大模型就非常必要。通常这些开源的大模型都是需要用自有数据进行微调,才能够满足业务的需求,这时候也需要对大模型进行微调。

如何对大模型进行微调

从参数规模的角度,大模型的微调分成两条技术路线:

一条是对全量的参数,进行全量的训练,这条路径叫全量微调FFT(Full Fine Tuning)。

一条是只对部分的参数进行训练,这条路径叫PEFT(Parameter-Efficient Fine Tuning)。

FFT的原理,就是用特定的数据,对大模型进行训练,将W变成W`,W`相比W ,最大的优点就是上述特定数据领域的表现会好很多。

但FFT也会带来一些问题,影响比较大的问题,主要有以下两个:

一个是训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的;

一个是叫灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。

PEFT主要想解决的问题,就是FFT存在的上述两个问题,PEFT也是目前比较主流的微调方案。

从训练数据的来源、以及训练的方法的角度,大模型的微调有以下几条技术路线:

一个是监督式微调SFT(Supervised Fine Tuning),这个方案主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调;

一个是基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback),这个方案的主要特点是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望;

还有一个是基于AI反馈的强化学习微调RLAIF(Reinforcement Learning with AI Feedback),这个原理大致跟RLHF类似,但是反馈的来源是AI。这里是想解决反馈系统的效率问题,因为收集人类反馈,相对来说成本会比较高、效率比较低。

不同的分类角度,只是侧重点不一样,对同一个大模型的微调,也不局限于某一个方案,可以多个方案一起。

微调的最终目的,是能够在可控成本的前提下,尽可能地提升大模型在特定领域的能力。

一些比较流行的PEFT方案

从成本和效果的角度综合考虑,PEFT是目前业界比较流行的微调方案。接下来介绍几种比较流行的PEFT微调方案。

Prompt Tuning

Prompt Tuning的出发点,是基座模型(Foundation Model)的参数不变,为每个特定任务,训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。

Prompt Tuning的基本原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率。

具体来说,就是将X = [x1, x2, ..., xm]变成,X` = [x`1, x`2, ..., x`k; x1, x2, ..., xm], Y = WX`。

根据我们在《揭密Transformer:大模型背后的硬核技术》一文中介绍的大模型背后的Transformer模型,Prompt Tuning是发生在Embedding这个环节的。

如果将大模型比做一个函数:Y=f(X),那么Prompt Tuning就是在保证函数本身不变的前提下,在X前面加上了一些特定的内容,而这些内容可以影响X生成期望中Y的概率。

Prompt Tuning的具体细节,可以参见:The Power of Scale for Parameter-Efficient Prompt Tuning

[1]

Prefix Tuning

Prefix Tuning的灵感来源是,基于Prompt Engineering的实践表明,在不改变大模型的前提下,在Prompt上下文中添加适当的条件,可以引导大模型有更加出色的表现。

Prefix Tuning的出发点,跟Prompt Tuning的是类似的,只不过它们的具体实现上有一些差异。

Prompt Tuning是在Embedding环节,往输入序列X前面加特定的Token。

而Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀。

具体来说,就是将Y=WX中的W,变成W` = [Wp; W],Y=W`X。

Prefix Tuning也保证了基座模型本身是没有变的,只是在推理的过程中,按需要在W前面拼接一些参数。

Prefix Tuning的具体细节,可以参见:Prefix-Tuning: Optimizing Continuous Prompts for Generation

[2]

LoRA

LoRA是跟Prompt Tuning和Prefix Tuning完全不相同的另一条技术路线。

LoRA背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。

通俗讲人话:大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。

LoRA的基本思路,包括以下几步:

首先, 要适配特定的下游任务,要训练一个特定的模型,将Y=WX变成Y=(W+∆W)X,这里面∆W主是我们要微调得到的结果;

其次,将∆W进行低维分解∆W=AB (∆W为m * n维,A为m * r维,B为r * n维,r就是上述假设中的低维);

接下来,用特定的训练数据,训练出A和B即可得到∆W,在推理的过程中直接将∆W加到W上去,再没有额外的成本。

另外,如果要用LoRA适配不同的场景,切换也非常方便,做简单的矩阵加法即可:(W + ∆W) - ∆W + ∆W`。

关于LoRA的具体细节,可以参见LoRA: Low-Rank Adaptation of Large Language Models

[3]

QLoRA

LoRA 效果已经非常好了,可以媲美全量微调的效果了,那为什么还要有个QLoRA呢?

这里先简单介绍一下,量化(Quantization)。

量化,是一种在保证模型效果基本不降低的前提下,通过降低参数的精度,来减少模型对于计算资源的需求的方法。

量化的核心目标是降成本,降训练成本,特别是降后期的推理成本。

QLoRA就是量化版的LoRA,它是在LoRA的基础上,进行了进一步的量化,将原本用16bit表示的参数,降为用4bit来表示,可以在保证模型效果的同时,极大地降低成本。

论文中举的例子,65B的LLaMA 的微调要780GB的GPU内存;而用了QLoRA之后,只需要48GB。效果相当惊人!

关于QLoRA的具体细节,可以参见:QLoRA: Efficient Finetuning of Quantized LLMs

[4]

PEFT 的微调方法,还有很多种,限于篇幅原因,不再这里一一介绍。感兴趣的朋友,可以阅读这篇论文:Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning

[5]

Enjoy!

引用链接

[1]The Power of Scale for Parameter-Efficient Prompt Tuning:https://arxiv.org/pdf/2104.08691.pdf
[2]Prefix-Tuning: Optimizing Continuous Prompts for Generation:https://arxiv.org/pdf/2101.00190.pdf
[3]LoRA: Low-Rank Adaptation of Large Language Models:https://arxiv.org/pdf/2106.09685.pdf
[4]QLoRA: Efficient Finetuning of Quantized LLMs:https://arxiv.org/pdf/2305.14314.pdf
[5]Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning:https://arxiv.org/pdf/2303.1564

深度学习中的Fine-tune
        fine-tune中文译为“微调”,深度学习中需要在深层网络中不断进行训练更新模型的参数(权重)拟合能实现预期结果的模型。
然而在深层次的神经网络中进行训练,由于模型规模大,参数量多,因此会有以下问题:

         1. 计算较为耗时,会占用大量计算资源和时间成本;
         2. 对于较为复杂的任务,比如说对于目标识别任务,目标类别多起来的话,如果想提升模型的表现能力,需要大量的数据集。同样以目标识别任务为例子,我们需要大量标注的图像数据来对模型进行训练;

        然而还存在一个问题,仍然以目标识别任务为例,假设有一个已经训练好的模型A,其任务是识别(猫,狗,人,鸡,鸭,鹅)这6+1(背景)个类别的目标,当我们的需求发生变化,需要再增加一类目标“猪”时,如果采用重新训练一个新模型B的方式无疑会增加成本,而且造成了资源浪费——A和B的模型需求相似度高,我们为什么不可以利用到已经成熟的模型A呢?
        解决以上问题的方案就是fine-tune,微调!比如针对于以上举例,可以采用的一个微调策略是保留模型A的前若干层的结构以及它们训练后的权重,然后更改模型最后一层的softmax,调整其映射到(猫,狗,人,鸡,鸭,鹅,猪)+背景这八个类别,这样就大大减少了训练的时间和计算成本。
        其实还可以这么理解fine-tune:我们的目标是使预测损失最小化,在各个参数展开的空间内找到最优的点(或者是靠近最优点的点),如果从开始找,当然比较慢;但是从之前已经训练好的其他类似模型开始,就相当于在最优点附近的点开始,自然收敛的速度和效果会比从零训练好得多。
        当然针对不同的情况,fine-tune的方式也不尽相同,见下图:

高效微调方法一:LoRA
Github地址: https://github.com/microsoft/LoRA
论文地址: https://arxiv.org/abs/2106.09685
LoRA:LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS(2021) 基于低阶自适应的大语言模型微调方法

原理简述:基于大模型的内在低秩特性,增加旁路矩阵来模拟全参数微调; LoRA最早由微软研究院发布的一项微调技术; 简而言之,是通过修改模型结构进行微调,是一种四两拨千斤的微调方法, 是目前最通用、同时也是效果最好的微调方法之一;
概念辨析:大模型微调LoRA与通信技术LoRa,二者相差一个字母的大小 写,是完全两种不同的技术;
LoRA除了可以用于微调大语言模型(LLM)外,目前还有一个非常火爆的 应用场景:围绕diffusion models(扩散模型)进行微调,并在图片生成任务中表现惊艳;
 

通俗解读大模型微调(Fine Tuning) - 知乎

关于大模型微调,你想知道的都在这里了_大模型 微调_笑不止是表情的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美SEC与贝莱德,对比特币现货ETF申购方式产生分歧!

比特币现货ETF的通过时间是市场投资者密切关注的议题。虽然SEC最近推迟了Hashdex、富兰克林邓普顿(Franklin Templeton)和GlobalX申请的决议时间,但彭博ETF分析师James Seyffart对明年一月通过的机率持乐观态度,认为其通过的机会能…

Jmeter参数化之数据库读取数据

以读取mysql数据库为例 1.下载一个mysql驱动包,最好去mysql官网下载 下载网址:https://dev.mysql.com/downloads/connector/j/ elect Operating Systems:选择Platform independent 然后选择zip包,点击Download。 下载如下&…

【24届校招】c++选手还有机会吗?如何选择更好的出路?

一、今年为什么c选手就业形势如此艰难? 去年c岗位的火热,不少c选手拿到高薪offer,今年转c的人群变多,内卷加剧,高学历大佬多如牛毛,很多比较好的c岗位多人投递,僧多肉少。 从行情来说&#xf…

python循环语句和函数

1.使用for循环打印9*9乘法表 for i in range(1, 10):for j in range(1, i1):print(i, "*", j, "", i*j, end"\t")print()结果&#xff1a; 2.使用while循环打印9*9乘法表 i 1 while i < 10:j 1while j < i1:print(i, "*", j…

量子计算软件平台

目录 1.量子语言 2.量子软件开发工具 3.量子云计算平台 1.量子语言 量子语言是一种基于量子计算机的语言&#xff0c;用于描述和实现量子算法。与经典计算机语言不同&#xff0c;量子语言需要考虑量子力学的特殊规则和算法的量子化。其中&#xff0c;最常用的量子语言是量子程…

计算机组成原理-虚拟存储器

文章目录 虚拟存储系统页式虚拟存储器存储器的层次化结构段式虚拟存储器段页式虚拟存储器 虚拟存储系统 将辅存中程序部分调入内存&#xff0c;程序其他待分待需要再调入内存 页式虚拟存储器 将辅存中的程序分页&#xff0c;将当前用得到的程序的页调入到主存中。 外存块号…

ubuntu22.04 arrch64版在线安装node

脚本 #安装node#下载node、npm国内镜像&#xff08;推荐&#xff09;# 判断是否安装了nodeif type -p node; thenecho "node has been installed."elsemkdir -p /home/zenglg cd /home/zenglgwget https://registry.npmmirror.com/-/binary/node/v10.14.1/node-v10.…

Spatialite获取点线面集合的中心点

在这里插入代码片sql SELECT ST_AsText(ST_Centroid(ST_GeomFromText(GEOMETRYCOLLECTION(LINESTRING(105.400538 26.965642, 105.376419 26.938482, 105.350328 26.911685, 105.329089 26.879879, 105.313625 26.84789, 105.301742 26.813179, 105.292141 26.775107, 105.2858…

Python (十四) OS

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

串口数据包收发的思路和流程-stm32入门

本节主要内容&#xff1a; 如何去规定一个合理的数据包格式如何收发数据包 1. 数据包格式规定/定义 1.1 HEX 数据包定义 固定包长&#xff0c;含包头包尾 可变包长&#xff0c;含包头包尾 首先数据包的作用是把一个个单独的数据给打包起来&#xff0c;方便我们进行多字节…

Linux git

1.Git 初识 不知道你⼯作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防止文档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;⽐如&#xff1a; “报告-v1”? …

python爬虫指南之请求模块urllib的详细教程

文章目录 前言一、urllib的子模块二、HttpResponse常用方法与属性获取信息urlli.parse的使用(一般用于处理带中文的url) 三、爬取baidu官网HTML源代码添加请求头信息&#xff08;重构user\_agent&#xff09; 四、扩展知识with open和open两者的区别关于Python技术储备一、Pyth…

带你用uniapp从零开发一个仿小米商场_10. 首页开发

图标菜单栏开发 轮播图开发完成后,就是图标菜单栏了 可以看出这些图标都是一样的样式,所以可以勇哥flex布局让他们每个占百分之20 代码如下,既然都是一样的那就直接用个循环嵌套一下 data数据如下 同样,为了能让这段代码能在别的地方也用到,我直接把它封装成组件 <templ…

不常在港居住!香港高才通计划续签5大方式的利弊汇总!

不常在港居住&#xff01;香港高才通计划续签5大方式的利弊汇总&#xff01; 今年香港高才通计划申请真的蛮火的&#xff01;不过申请高才计划成功后续签问题也难倒了不少人&#xff0c;那么应该怎样准备高才续签呢&#xff1f;今天就仔细说说&#xff01; 高才通的逗留模式&am…

uniapp挽留提示2.0

项目需求&#xff1a;有时候挽留的ui是全屏的&#xff0c;用page-container也可以。后来产品提了个问题&#xff0c;手机侧滑的时候没那么顺畅&#xff08;就是一用侧滑&#xff0c;就显示出来&#xff0c;产品要的方案是如下图&#xff0c;emmm大概是这个意思&#xff09; 后面…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

数据分析实战案例:Python 分析员工为何离职(附完整代码)

大家好&#xff0c;今天给大家介绍一个Python数据分析项目实战&#xff0c;不仅包含代码&#xff0c;还提供分析数据集。 员工流失或是员工离开公司的比率是公司关注的一个重要问题。它不仅会导致宝贵人才的流失&#xff0c;还会产生成本并破坏生产力。了解员工辞职的原因对于…

中电金信鲸Bot RPA荣获最佳人工智能解决方案

近年来&#xff0c;数字经济已成为国家“十四五”规划和“新基建”战略的重要支撑。银行业作为我国经济体系的重要组成部分&#xff0c;其发展战略也出现了新的变化。数字化智能化转型成为银行业新的利润增长点&#xff0c;科学制定实施数字化转型战略成为下一步数字化转型的首…

【软件测试】盘一盘工作中遇到的 MQ 异常测试

上一篇小结了一下关于redis的异常测试&#xff0c;今天再来盘一盘 MQ 相关的。MQ 跟 redis 一样&#xff0c;也是现在系统服务中不可或缺的重要中间件&#xff0c;通常用来流量削峰、应用解耦、异步处理等。 日常经手的系统主要用的是 RocketMQ&#xff0c;是阿里系下开源的一…

cmdline

cmdline是一个kv结构,就是uboot参数传给kernel使用的 举例: Kernel command line: user_debug=31 storagemedia=mtd androidboot.storagemedia=mtd androidboot.mode=normal mac=00FA89112233 serial=LONBON12345 earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0…