大语言模型微调技术

news2024/12/24 9:37:08

Adapter

参考资料:《Parameter-efficient transfer learning for nlp》

adpater首先将原始的d维特征映射到较小的维度m,应用非线性函数,然后再重新映射回d维。总的参数量(包含biases)为 2md+d+m, 当m远小于d时,就能限制每个任务被增加的参数量。

adapter内部也有残差连接,也就是当adapter内的参数初始化为接近0时,相当于是一个增加adpater层前相同的模型。

在微调过程中更新以下参数:

1. adapter内部参数

2. layer norm层参数(实验表明单独训练layer norm层无法达到好结果)

3. 根据任务在最上层添加的层(例如分类任务的分类层)的参数

实验结果:

在GLUE参数集上,总体效果和所有参数重新训练的效果差不多,但训练的参数量减少很多。

Diff Pruning

参考资料:《Parameter-efficient transfer learning with diff pruning》

主要思路是学习一个diff vector \delta _{\tau },加到预训练的模型参数\theta _{pretrained}上,微调后使用的模型参数为\theta _{\tau }

微调训练时需要最小化的函数为

其中,

当 \delta _{\tau }稀疏时,就有,从而使微调时需要训练更新的参数是比较少的。就是\delta _{\tau }的L0-norm,使\delta _{\tau }尽量稀疏。

实验结果:

Prefix-tuning

参考资料:《Prefix-Tuning:Optimizing Continuous Prompts for Generation》

初衷是一个合适的上下文能在不改变参数的情况下使得语言模型的表现更好。但是,不同于让专家优化单个词,单个词容易受具体的词的影响,不同的词有不同的向量表示。而是将引导的上下文作为连续的词向量来优化,这样能通过前向传播影响整个网络中的所有层。

Prefix-tuning给了自回归的语言模型一个prefix,,或者同时给编码和解码结构一个prefix,,其中上图中的P_{idx}表示序列中prefix的序号。

P_{\theta }是初始化的一个可训练的prefix对应的参数矩阵,参数维度是\left | P_{idx} \right |\times dim(h_{i})

微调过程中的损失函数不变,仍然是自回归语言模型的损失函数,为

微调训练过程中更新的参数仅P_{\theta },初始语言模型的参数\phi不变。

微调过程中更新的参数:

直接更新P_{\theta }会导致优化不稳当以及最终效果的略微下降,P_{\theta }用一个MLP压缩到一个较小的矩阵{P_{\theta}}'{P_{\theta}}'P_{\theta }矩阵行数相同,列维度不同。当训练完成后,{P_{\theta}}'被丢弃,保留P_{\theta }

实验结果:

P-Tuning v2

参考资料:《P-Tuning v2:Prompt Tuning can be comparable to fine-tuning universally across scales and tasks》

【Prefix-tuning在后面都简称为P-tuning】

P-tuning的缺点:1. 并不能做到在所有规模参数的模型上表现都好,超过10 billion参数的模型表现好,100 million到1 billion规模参数的模型上相比全参数微调差很多。 2.不同任务上的表现不统一,例如在序列标注任务上表现差。

图左(a)是P-tuning的示意图,可以看出可训练的参数量(橘黄色部分)较少,而且并不直接作用于输出层。图右(b)在不同层都添加prompts当作prefix tokens,使得可训练参数量增加,且对预测输出的作用更直接。

实验结果:

相同参数量的prompt添加到不同层的结果如下图,可以看出在从深层添加会比从开头的浅层添加最终效果好。

LoRA

参考资料:《LoRA: Low-Rank adaption of large language models》

之前方法的不足:Adapter因为顺序计算会导致推断速度慢(如下图),P-tuning会占用一部分序列长度。

对于一个预训练的权重矩阵W_{0}\in R^{d\times k},将参数更新表示为W_{0}+\Delta W=W_{0} +BA,其中B\in R^{d\times r}A\in R^{r\times k}, r\ll min(d,k),也就是将后面更新部分用一个低秩分解表示。将前向计算表示为:。A使用高斯分布随机初始化,B初始化为0,\Delta W在训练开始时时0。然后将\Delta Wx乘以\frac{\alpha }{r}, 其中\alpha是一个常量, 改变其大小可以认为相当于学习率的作用。

如何理解r\alpha

以下代码摘自 Code LoRA from Scratch - a Lightning Studio by sebastiacode

【Code LoRA from Scratch这个对理解LoRA非常用帮助】

class LoRALayer(torch.nn.Module):
    def __init__(self, in_dim, out_dim, rank, alpha):
        super().__init__()
        std_dev = 1/torch.sqrt(torch.tensor(rank)).float()
        # rank是低秩矩阵的秩,较小的r会有一个较简单的低秩矩阵,使得微调过程中的参数较少,但所能捕捉到的信息也较少
        # A的维度 (in_dim, rank), B的维度 (rank, out_dim)
        self.A = torch.nn.Parameter(torch.randn(in_dim, rank)*std_dev)
        self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))
        self.alpha = alpha

    def forward(self,x):
        # alpha决定了LoRA层的变化有多少作用给原始参数,值越大,对原参数的调整越大
        x = self.alpha* (x @ self.A @ self.B)
        return x

# 可以将原来的线性层用LinearWithLoRA来替换
class LinearWithLoRA(torch.nn.Module):
    def __init__(self, linear, rank, alpha):
        super().__init__()
        self.linear = linear
        self.lora = LoRALayer(linear.in_features, linear.out_features, rank, alpha)

    def forward(self,x):
        return self.linear(x) + self.lora(x)

论文认为这种形式。当r等于预训练参数矩阵的秩时,类似于一个通用的全部参数的fine-tune,。而且这种形式没有推断延迟。

将LoRA应用到Transformer中时,论文只调整attention参数,冻结MLP模块的参数,自注意力模块含四个参数矩阵(W_{q}, W_{k}, W_{v}, W_{o})

实验结果

论文作者还研究了以下问题:

1.应该对Transformer的哪个部分使用LoRA?

调整W_{q},W_{v}的效果不错,而且从表中可以看出调整多个矩阵会比调整单个矩阵的效果好。

2. LoRA最好的秩r是什么?

上表可以看出很小的r就能有不错的效果。

3. \Delta WW之间的关系,是否高度相关?【这部分暂时还没看】

如何在python中使用LoRA?

GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Modelscan

参考quickstart部分,或者也可以使用 PEFT, 已经集成仅PEFT里面了GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

 LoRA的变种:

1. DoRA--Weight-Decomposed Low-Rank Adaptation

以下内容参考 Improving LoRA: Implementing Weight-Decomposed Low-Rank Adaptation (DoRA) from Scratch

DoRA可以用两步来概括,第一步是将一个预训练的参数矩阵分解成一个长度向量m和一个方向矩阵V。因为任何向量可以表示为长度和方向的乘积(如下图左)。在DoRA中,是对参数矩阵分解,而不是向量,矩阵的每一列参数连接了输入到输出,也就是将每一列看作向量做分解(如下图右)。

第二步是分别训练m 和 将LoRA作用于V。

预训练参数W_{0}=m\frac{V}{\left \| V \right \|_{c}}, 其中\left \| V \right \|_{c}是向量维度的norm。

DoRA后的参数{W}'=m\frac{V+\Delta V}{\left \| V+\Delta V \right \|}_{c}=m\frac{V+BA}{\left \| V+BA \right \|}_{c}

class LoRALayer(torch.nn.Module):
    def __init__(self, in_dim, out_dim, rank, alpha):
        super().__init__()
        std_dev = 1/torch.sqrt(torch.tensor(rank)).float()
        # rank是低秩矩阵的秩,较小的r会有一个较简单的低秩矩阵,使得微调过程中的参数较少,但所能捕捉到的信息也较少
        # A的维度 (in_dim, rank), B的维度 (rank, out_dim)
        self.A = torch.nn.Parameter(torch.randn(in_dim, rank)*std_dev)
        self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))
        self.alpha = alpha

    def forward(self,x):
        # alpha决定了LoRA层的变化有多少作用给原始参数,值越大,对原参数的调整越大
        x = self.alpha* (x @ self.A @ self.B)
        return x

class LinearWithDoRAMerged(torch.nn.Module):
    def __init__(self, linear, rank, alpha):
        super().__init__()
        self.linear = linear
        self.lora = LoRALayer(linear.in_feature,linear.out_features, rank, alpha)
        # self.linear.weight.norm(p=2) 计算公式 sum(abs(x)**2)**(1./2), 即平方求和开根号
        self.m = torch.nn.Parameter(self.linear.weight.norm(p=2, dim=0, keepdim=True))

    def forward(self,x):
        lora = self.lora.A @ self.lora.B
        numerator =self.linear.weight + self.lora.alpha*lora.T
        denomator =numerator.norm(p=2, dim=0, keepdim=True)
        # norm之后可以使训练过程更稳定
        directional_component = numerator/denomator
        # self.m能动态调整在训练过程中结合参数向量到参数矩阵过程中每个参数向量的大小,类似参数向量的重要性
        new_weight = self.m * directional_component
        return F.linear(x, new_weight, self.linear.bias)

DoRA相比于LoRA的结果

当参数量仅为LoRA的一半时,DoRA的效果也比LoRA的效果好。

当超参rank变化时,DoRA的鲁棒性比LoRA更好。

DoRA方法也已经被集成到PEFT, GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

2. LISA

参考资料:《LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning》

为什么会想到LISA这个方法?

对模型每一层的参数计算mean_weight_norm, ,上图x轴表示的是层id,即哪一层,从embedding层到最后输出层,y轴表示的是norm值。可以看出,在LoRA中embedding层和head层的norm值明显大于中间层,而在全参数训练中这种现象不明显。LoRA对每层的重要性判断和全参数微调不同。

LISA认为norm值较小的层应该有较小的概率来对参数微调,但具体方法不是给每一层不同的学习率,而是对层采样。

其中, \left \{ p_{l} \right \}_{l=1}^{N_{L}}=\left \{ 1.0, \gamma /N_{L},\gamma /N_{L},\cdots ,\gamma /N_{L},1.0 \right \}\gamma控制更新多少层。表示0到1之间的均匀分布。

因为embedding层和head层的概率值为1,的条件不会被满足,这两层的参数一定会更新。

部分实验结果:

平均得分来看比LoRA高较多。

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

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

相关文章

业务数字原生驶入2.0时代:谁在成为新抓手?

对奥哲云枢All in One低代码平台的一个更为全面的认知恰是,其在成为AI时代企业内部的一个超级操作系统。 作者|皮爷 出品|产业家 过去的几年时间里,赵仕杰一直有个困扰他的问题。 作为首创热力的CIO,也是过去几年这家热力企业数字化转…

JavaSE进阶篇-面向对象程序设计

一、面向对象和面向过程的关系 1)面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做; 2)面向对象:强调了具备功能的对象,以类/对象为最小单位,考虑谁来做。 总结…

武汉星起航:挂牌资本市场,助力创业者与投资者共绘辉煌蓝图

2023年10月30日,对于武汉星起航电子商务有限公司而言,是一个值得铭记的日子。这一天,公司成功在上海股权托管交易中心挂牌展示,正式登录资本市场,开启了新的发展阶段。这一里程碑式的成就,不仅彰显了武汉星…

Mybatis中SqlSession接口中的selectList方法

1、SqlSession SqlSession是Mybatis持久层框架提供的接口,该接口中包含了大量的CRUD操作方法(既增删改查方法)。 2、selectList方法 selectList方法是用于查询的方法,该方法具有多态性,如图所示(打开myb…

掼蛋-用好逢人配

逢人配是掼蛋的特殊规则之一,是主牌中当前打的两张红桃牌,这两张可以充当百搭牌,与手中任意牌型(除大小王外)组成新的牌型。 那么逢人配应该怎么用呢? 一、配炸弹 首配4头炸和同花顺,可配6头&am…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称:InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点,1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…

lettcode179.最大数

问题描述: 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例一: 输入nums [10…

数字时代安全风险防范与保密科技创新

文章目录 前言一、新技术应用带来的保密挑战1.1 通过技术手段获取国家秘密和重要情报日益普遍1.2 新型信息技术存在的风险不容忽视 二、加强保密科技创新的必要性2.1 提高定密准确性2.2 及时变更密级或解密2.3 对失泄密事故案件进行自动高效的预警和初步处理 三、保密科技创新中…

文档加密软件最强推荐 8款最好的文件加密软件

文档加密软件最强推荐 8款最好的文件加密软件 加密软件的选择通常取决于具体的应用场景、加密需求以及对安全性的要求。以下是比较市场上一些知名加密软件的特点与优势,帮助您判断哪家更适合您的需求: 1.安企神 点击免费试用安企神 优势: …

书生·浦语大模型第二期实战营(4)笔记

Finetune 为什么要微调 适应下游任务 两种微调范式 上面的是增量训练 下面的是指令微调 数据格式 微调方案 lora: 在基座模型的基础上再套用一个小模型 XTuner 简介 快速上手 LnternLM2 1.8B 多模态LLM

五款3dmax常用插件推荐(含云渲染工具)

在三维建模和动画设计领域,3ds Max软件因其强大功能和灵活性而广受欢迎。为了进一步提升工作效率和创作质量,有许多插件可供选择。本文推荐五款常用3ds Max插件,帮助你更好实现复杂的模型和动效创作。 五款3dmax常用插件推荐 1、Kitchen Cab…

2024妈妈杯数学建模思路A题思路汇总分析 MathorCup建模思路分享

C题:移动通信网络中PCI规划问题 (完整版内容放在文末了) 2024MathorCup A题完整思路完整数据可执行代码后续高质量成品论文 l 难度评分: 3.5/5 l 开放度评分: 3/5 l 适合专业: 通信工程、计算机科学、电子工程 l 主要算法: 图论算法、…

JavaEE初阶Day 13:多线程(11)

目录 Day 13:多线程(11)常见的锁策略1. 悲观锁 vs 乐观锁2. 重量级锁 vs 轻量级锁3. 自旋锁 vs 挂起等待锁4. 可重入锁 vs 不可重入锁5. 公平锁 vs 非公平锁6. 互斥锁 vs 读写锁 synchronized实现原理1. 锁升级2. 锁消除3. 锁粗化 CAS Day 13…

CANfestival 主机进入预操作态(preOperational)自动发送复位节点指令。

核心是iam_a_slave ,这个是字典生产的时候自动生成的。

xftp、xshell连不上虚拟机解决方法

一、检查连接虚拟机ip看是否正确 查看虚拟机系统 IP ifconfig 二、检查虚拟机防火墙是否关闭 查看防火墙状态(ubuntu) sudo ufw status 关闭防火墙 sudo ufw disable 查看防火墙状态(centos) systemctl status firewalld.service 关闭防火墙 systemctl stop firewalld.se…

vscode按ctrl+鼠标左键没反应

vscode按ctrl鼠标左键没反应 问题问题解决 问题 新买的阿里云服务器,在连接vscode后,按ctrl鼠标左键没反应,怎么办? 问题解决 你没有在vscode上安装c的相关插件,安装之后才可以实现按ctrl鼠标左键跳转到函数的定义

FTP客户端Transmit 5 for Mac中文激活版

Transmit 5是一款功能强大的Mac FTP客户端软件,它由Panic公司开发,为用户提供简单、高效的文件传输体验。 Transmit 5 for Mac中文激活版下载 Transmit 5支持多种传输协议,如FTP、SFTP、WebDAV和Amazon S3等,满足用户不同的文件传…

学习笔记-数据结构-线性表(2024-04-17)

设计一个算法实现在单链表中删除值相同的多余节点的算法。 设计思想:双指针 变量说明: head - 参数变量,代表链表的头节点。在调用DelSameNum函数时,需要传递链表的头节点的地址给这个参数,从而允许函数对链表进行操作…

工业控制(ICS)---modbus

Modbus Modbus,市场占有率高、出题频率高,算是最常见的题目,因为这个协议也是工控领域最常见的协议之一,主要有三类 Modbus/RTU 从机地址1B功能码1B数据字段xBCRC值2B 最大长度256B,所以数据字段最大长度252B Modbus/ASCII …

精度优于3cm!用它做边坡应急地形测量,准!快!

为贯彻落实《广东省地质灾害防治“十四五”规划》,广州市开展地质灾害风险点及新增隐患点专业监测设备建设项目。广州市现存166处地质灾害隐患点全部纳入“一张图”管理,除部分正在开展工程治理的隐患点,全市有138处隐患点已部署专业监测设备…