LoRA:大模型的低阶自适用(使用BERT在IMDB数据集上运用LoRA微调)

news2024/11/25 9:40:43

文章目录

  • 简介
  • LoRA文章主要贡献
  • LoRA技术模型图
  • 技术细节
  • 论文实验结果
  • LoRA在bert的运用
    • LoRA核心代码
    • 实战分析

简介

论文链接https://arxiv.org/pdf/2106.09685v2.pdf

本文将先介绍论文中的LoRA技术,然后以BERT为例在IMDB数据集上代码实现运用这项微调技术。

代码+数据

LoRA文章主要贡献

文章的主要贡献是提出了一种名为LoRA(Low-Rank Adaptation)的方法,用于在不牺牲模型质量的前提下,高效地对大型预训练语言模型进行微调。LoRA的核心思想是在Transformer架构的每一层注入可训练的低秩分解矩阵,同时冻结预训练模型权重,从而大幅减少下游任务中的可训练参数数量。

具体来说,LoRA的主要贡献包括:

高效的参数更新:LoRA通过低秩矩阵更新模型权重,而不是对整个模型进行微调。这种方法大幅减少了所需的训练参数数量和GPU内存需求。例如,与GPT-3 175B模型的全参数微调相比,LoRA可以将可训练参数减少10,000倍,GPU内存需求减少3倍。

保持模型质量:尽管LoRA使用的可训练参数远少于全参数微调,但它在多个模型(如RoBERTa、DeBERTa、GPT-2和GPT-3)上的表现与全参数微调相当或更好。

提高训练效率:LoRA降低了硬件门槛,因为它不需要计算大多数参数的梯度或维护优化器状态。此外,LoRA的设计允许在部署时将训练的矩阵与冻结的权重合并,从而不会引入额外的推理延迟。

实证研究:文章提供了关于语言模型适应性中秩不足性的实证研究,这有助于解释LoRA的有效性。

总的来说,LoRA提出了一种创新的方法来解决大型语言模型在特定任务上的适应问题,同时保持了模型的性能,降低了资源消耗,并提高了操作效率。这对于需要在资源受限的环境中部署和使用大型模型的应用场景尤为重要。

LoRA技术模型图

Description
正所谓大智若愚,LoRA这项技术的模型图就是这么简洁明了,x表示数据输入,左边表示预训练大模型的参数(冻结),右边表示两个低秩矩阵(训练),当大模型微调的时候,不再是全参数微调,而是仅仅微调右边的低秩矩阵。

这样一来,就能大大减少我们微调时候的工作量和需要的资源,并且使用这种方法微调模型的性能和全参数微调差不多,从而实现四两拨千斤的效果。

技术细节

假设预训练模型要进行常规全参数微调
Description
其中Φ表示模型的参数,x表示输入,y表示输出
Description
表示进行微调任务的数据集

此时我们需要调整的参数就是全参数:
Description
如果是175B的模型,微调一个下游任务的模型,每次都要调整这么多参数,工作量巨大。

但是使用LoRA技术的话
Description
预训练模型的参数都冻结,不调整

只是额外加一组小小的参数

也能做到和下游任务适配
Description
而此时需要调整的参数远远小于预训练模型的参数
Description
也就是说此时需要调整的参数很小。

文章主要聚焦于将LoRA在transformer注意力机制上进行使用,因为这也是transformer的精髓
Description
Description
分别用于表示四个线性层的参数。

Description
用于表示预训练模型的参数

Description
是自适应过程中的累积梯度更新

r就是低秩矩阵的秩

例如我们在

W 0上加个LoRA
Description
假设 W 0为512*512
就单单只看这部分的话

全参数微调需要调整512*512 = 262144个参数

使用LoRA后,这262144个参数就冻结了

此时增加两个低秩矩阵 例如5122和2512

那么此时需要调整的参数大小就为5122+2512 = 2048个参数

2048 / 262144 = 0.0078125

此时要训练的参数就减少了许多

而且,当我们面对不同的下游任务时,因为原本的预训练模型是冻结的,所以预训练模型用一个就行,只需要保存的参数就是加入的低秩矩阵,这样的话,也能节省大量的存储空间。

可以看个伪代码:

class LowRankMatrix(nn.Module):

    def __init__(self, weight_matrix, rank, alpha=1.0):

        super(LowRankMatrix, self).__init__()

        self.weight_matrix = weight_matrix

        self.rank = rank

        self.alpha = alpha / rank  # 将缩放因子与秩相关联

        # 初始化低秩矩阵A和B

        self.A = nn.Parameter(torch.randn(weight_matrix.size(0), rank), requires_grad=True)

        self.B = nn.Parameter(torch.randn(rank, weight_matrix.size(1)), requires_grad=True)



    def forward(self, x):

        # 计算低秩矩阵的乘积并添加到原始权重上

        # 应用缩放因子

        updated_weight = self.weight_matrix + self.alpha * torch.mm(self.B.t(), self.A)

        return updated_weight

α和r用于缩放矩阵,帮助更好的训练

A矩阵使用随机高斯初始化

B矩阵初始化为0

论文实验结果

Description
LoRA相较于Adapter不会增加推理的时间。

Description
Description
Description
LoRA效果好

Description
LoRA一起用到Wq和Wv效果比较好

Description
低秩已足够

LoRA在bert的运用

这里主要以bert-base-uncased为例来实现LoRA微调技术的运用。
bert-base-uncased的参数量为110M也就是1.1亿个参数

LoRA核心代码

主要使用文章提出的开源loralib来对bert的注意力机制线性层进行LoRA层的增加

def get_lora_bert_model(model, r=8, lora_layer=["q", 'k', 'v', 'o']):
    encoder_layers = list(model.encoder.layer)
    for layer_index, encoder_layer in enumerate(encoder_layers):
        # 访问多头自注意力层
        attention = encoder_layer.attention
        # 获取Q、K、V线性层
        q_linear = attention.self.query
        k_linear = attention.self.key
        v_linear = attention.self.value
        # 获取O线性层(实际上,O是V经过加权求和后的结果,通常不单独存储)
        o_linear = attention.output.dense

        for l in lora_layer:
            if l == 'q':
                new_q_proj = lora.Linear(q_linear.in_features, q_linear.out_features, r=r)
                model.encoder.layer[layer_index].attention.self.query = new_q_proj
            elif l == 'k':
                new_k_proj = lora.Linear(k_linear.in_features, k_linear.out_features, r=r)
                model.encoder.layer[layer_index].attention.self.key = new_k_proj
            elif l == 'v':
                new_v_proj = lora.Linear(v_linear.in_features, v_linear.out_features, r=r)
                model.encoder.layer[layer_index].attention.self.value = new_v_proj
            elif l == 'o':
                new_o_proj = lora.Linear(o_linear.in_features, o_linear.out_features, r=r)
                model.encoder.layer[layer_index].attention.output.dense = new_o_proj
    return model

可以看到对每层注意注意力机制层的q k v o的线性层都添加了LoRA层

def mark_only_LLM_lora_as_trainable(model: nn.Module, bias: str = 'none', LLM_name: str = 'default_value') -> None:
    if LLM_name == 'default_value':
        for n, p in model.named_parameters():
            if 'lora_' not in n:
                p.requires_grad = False
        if bias == 'none':
            return
        elif bias == 'all':
            for n, p in model.named_parameters():
                if 'bias' in n:
                    p.requires_grad = True
        elif bias == 'lora_only':
            for m in model.modules():
                if isinstance(m, LoRALayer) and \
                    hasattr(m, 'bias') and \
                    m.bias is not None:
                        m.bias.requires_grad = True
        else:
            raise NotImplementedError
    else:
        for n, p in model.named_parameters():
            if 'lora_' not in n and LLM_name in n:
              # and "bert.pooler" not in 
                p.requires_grad = False
        if bias == 'none':
            return
        elif bias == 'all':
            for n, p in model.named_parameters():
                if 'bias' in n:
                    p.requires_grad = True
        elif bias == 'lora_only':
            for m in model.modules():
                if isinstance(m, LoRALayer) and \
                    hasattr(m, 'bias') and \
                    m.bias is not None:
                        m.bias.requires_grad = True
        else:
            raise NotImplementedError

添加LoRA层后,每次训练模型的时候,就只需要训练bert加入的LoRA层,此时我们就需要用到mark_only_LLM_lora_as_trainable()来帮助我们实现,考虑到可能我们基于bert的分类模型可能还会涉及到我们自己加入的某些结构,这些部分是需要进行训练的,所以对于这种情况就这么来使用:

mark_only_LLM_lora_as_trainable(model, LLM_name='bert')

实战分析

本文采用IMDB影评情感分析数据集测试训练集各25000条来进行实验。

因为bert才1.1B,可能在bert上使用这个东西有点小题大做了,但是一屋不扫何以扫天下,现在的大模型架构基本都是基于transformer架构的(bert可以说是第一个),其实本质上都是差不多的,只不过我感觉可能更大一些的模型LoRA的效果会更加显著,模型越大,这个方法的优越性就会越强。

之前对bert全参数微调的准确率是93%,而使用LoRA微调技术得出的结果大约是86%左右,确实有一定的差距,我个人感觉可能是因为模型不够大,只有1.1B,因为低秩势必导致信息的损失,只有当你的模型够大的时候,这些损失才能够忽略不计。

但是使用LoRA技术,对于训练速度、显存占用有了巨大的提升。

首先来看显存占用量(同样是batch_size=64):
Description
这是全参数微调的显存占用。

Description
这是使用LoRA后的显存占用(q k v o都使用,r=8)

可以看到,使用了LoRA后,显存占用少了16G左右,节约了约31.5%的显存使用。

再看看训练速度有什么区别:
Description
这是全参数微调的结果,可以看到准确率确实挺高的,但是训练一个epoch需要4分钟

Description
这是使用LoRA之后的,可以看到除了第一个epoch可能涉及数据加载、GPU预热等情况稍微慢点,其余epoch都是2.5分钟不到就完成了,节约了大概43%的训练时间。

不过准确率也下降了,从93%掉到了86%,准确率大约下降了7.5%。

如果对更大的模型使用LoRA技术,训练时间和显存占用的节省会更多,而性能的下降则会更少,确实是一项很不错的技术。

由此可见,LoRA这项技术确实十分有意义,能够大大降低模型微调的成本,同时不会增加推理的时间延迟,我们可以看到模型评估的时间都是一模一样的。

所以,这项技术其实一定程度上让大模型的门槛降低了一些,让大模型的使用成本大大降低,虽然性能上可能有些损失,但是,至少落地的可能性变大了。

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

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

相关文章

OpenCV基本图像处理操作(四)——傅立叶变换

傅里叶变换的作用 高频:变化剧烈的灰度分量,例如边界 低频:变化缓慢的灰度分量,例如一片大海 滤波 低通滤波器:只保留低频,会使得图像模糊 高通滤波器:只保留高频,会使得图像细节…

【React】Ant Design自定义主题风格及主题切换

Ant Design 的自定义主题,对于刚入手的时候感觉真是一脸蒙圈,那今天给它梳理倒腾下; 1、自定义主题要点 整体样式变化,主要两个部分: 1.1、Design Token https://ant.design/docs/react/customize-theme-cn#theme 官…

新经济助推高质量发展“大有云钞”聚焦未来趋势

近日,由大有云钞科技(北京)有限公司主办的一场关于“新经济助力高质量发展法治研讨会”在北京国家会议中心隆重举行。此次研讨会汇聚了来自政府、企业、学术界和法律界的众多专家学者,共同探讨新经济背景下的法治建设和高质量发展…

0基础如何入门编程?

0基础如何进入IT行业 ? 前言 简介:对于没有任何相关背景知识的人来说,如何才能成功进入IT行业?是否有一些特定的方法或技巧可以帮助他们实现这一目标? 主要方法有如下几点建议提供给宝子们 目录 免费视频网课学习…

static+单例模式+类的复合继承

汇编语言 汇编语言是最靠谱的验证“编程语言相关知识点”正确性的方式 汇编语言与机器语言一一对应,每一条机器语言都有与之对应的汇编指令 机器语言是计算机使用的语言,它是一串二进制数字 汇编语言可以通过汇编得到机器语言机器语言可以通过反汇编得到…

Shell循环以及条件语句使用

Shell脚本基础已经发过,可在主页查找,现在讲解case,for,while语句,以及语句的练习。 1.case语句 等同于C语⾔的switch-case 格式: case $变量 in # 判断变量的值 a) # 值是什么语句;; # 相当于break 但…

docker网路和主机通讯问题

#注 1,安装docker和启动容器服务的时候如果防火墙处于开启状态,那么重启docker里面的容器的时候必须开启防火墙,否则会出现iptable错误; 2,linux开启防火墙会导致主机和docker网络之间单向通讯,主机可以访…

文献速递:深度学习肝脏肿瘤诊断---基于深度学习的表型分类重新划分联合肝细胞胆管癌

Title 题目 Deep learning-based phenotyping reclassifies combined hepatocellular cholangiocarcinoma 基于深度学习的表型分类重新划分联合肝细胞胆管癌 01文献速递介绍 Primary liver cancer arises either from hepatocytic or biliary lineage cells, giving rise to…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目,提供多种类型和设施的会议室选择,满足不同会议需求。 预约日历,展示会议室预约情况,方便用户选择空闲时段。 预约记录&#xff0…

计算机网络(六)应用层

应用层 基本概念 服务器端(Server): 服务器是网络中提供服务的计算机或软件程序。服务器通常具有更高的性能、更大的存储空间和更高的带宽,用于提供各种服务,如文件存储、数据库管理、Web托管、电子邮件传递等。服务…

5-pytorch-torch.nn.Sequential()快速搭建神经网络

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言torch.nn.Sequential()快速搭建网络法1 生成数据2 快速搭建网络3 训练、输出结果 总结 前言 本文内容还是基于4-pytorch前馈网络简单(分类&#xf…

SQL刷题---2021年11月每天新用户的次日留存率

解题思路: 1.首先算出每个新用户注册的日期,将其命名为表a select uid,min(date(in_time)) dt from tb_user_log group by uid2.计算出每个用户登录的天数,将其命名为表b select uid,date(in_time) dt from tb_user_log union select uid,date(out_time) dt fro…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch(先看四!先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

PHP-extract变量覆盖

[题目信息]: 题目名称题目难度PHP-extract变量覆盖1 [题目考点]: 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有:$$&#x…

【Git】安装 Git

文章目录 1. CentOS 下安装2. Ubuntu 下安装 Git 是开放源代码的代码托管工具,最早是在 Linux 下开发的。开始也只能应用于 Linux 平台,后面慢慢的被移植到 Windows 下。现在,Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行了…

RabbitMQ的简单

前言 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。 目录 介绍 RabbitMQ系统结构 RabbitMQ成员…

Flutter 插件站新升级: 加入优秀 GitHub 开源项目

Flutter 插件站新升级: 加入优秀 GitHub 开源项目 视频 https://youtu.be/qa49W6FaDGs https://www.bilibili.com/video/BV1L1421o7fV/ 前言 原文 https://ducafecat.com/blog/flutter-awesome-github-repo-download 这几天晚上抽空把 Flutter 插件站升级,现在支…

超越GPT-4V,苹果多模态大模型上新,神经网络形态加速MLLM(一)

4月8日,苹果发布了其最新的多模态大语言模型(MLLM )——Ferret-UI,能够更有效地理解和与屏幕信息进行交互,在所有基本UI任务上都超过了GPT-4V! 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

智谱AI通用大模型:官方开放API开发基础

目录 一、模型介绍 1.1主要模型 1.2 计费单价 二、前置条件 2.1 申请API Key 三、基于SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 GLM-4是智谱AI发布的新一代基座大模型,整体性能相比GLM3提升60%,支持128K上下文&#x…

实用图像视频修复工具:完善细节、提高分辨率 | 开源日报 No.225

xinntao/Real-ESRGAN Stars: 25.6k License: BSD-3-Clause Real-ESRGAN 是一个旨在开发实用的图像/视频恢复算法的项目。 该项目主要功能、关键特性和核心优势包括: 提供动漫视频小模型和动漫插图模型支持在线 Colab 演示和便携式 Windows/Linux/MacOS 可执行文件…