【学习笔记】LoRA: Low-Rank Adaptation of Large Language Models

本文提出了一种名为LoRA的方法,通过利用大模型的内在秩特性,仅对部分密集层进行低秩参数化更新,有效减少内存需求并提高适应下游任务的效率。实验在多个数据集和模型上展示了LoRA的优势,包括内存节省和快速任务切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<LoRA: Low-Rank Adaptation of Large Language Models>


💡 文章信息

Title

LoRA: Low-Rank Adaptation of Large Language Models

Journal

 ()

Authors

Hu Edward J.,Shen Yelong,Wallis Phillip,Allen-Zhu Zeyuan,Li Yuanzhi,Wang Shean,Wang Lu,Chen Weizhu

Pub.date

2021-10-16

📕 研究动机

1. 现有问题

将大模型应用于下游任务时,通常需要进行微调,即更新预训练模型的所有参数。微调的主要缺点是新模型包含的参数与原模型一样多。

存储和加载除预训练模型外的少量任务特定参数,现有技术通过扩展模型深度或减少模型可用序列长度会引入推理延迟。更重要的是,这些方法往往无法匹配微调基线,在效率和模型质量之间存在权衡。

2. 灵感来源

过度参数化模型实际上停留在较低的内在维度上,即使随机投影到较小的子空间,仍然可以有效地学习。论文假设模型适应过程中权重的变化也具有较低的"内在秩",从而提出了低秩适应( Low-Rank Adaptive,LoRA )方法。

过参数化模型是指模型参数数量远远超过训练数据的模型,通常认为它们容易过拟合。

📜 研究内容

提出了低秩适应( Low-Rank Adaptive,LoRA )方法。这个方法允许通过优化密集层在适应期间的秩分解矩阵间接训练一些密集层,同时保持预训练权重冻结。这意味着他们通过调整适应期间权重变化的秩分解矩阵来实现对神经网络中某些密集层的训练。

1. 低秩参数化更新矩阵

在这里插入图片描述
在训练过程中,W0被冻结,不接受梯度更新,而A和B包含可训练参数。

在这里插入图片描述

对A使用随机高斯初始化,对B使用零初始化,因此在训练开始时∆W = BA为零。然后用α/r对∆Wx进行标度,其中α为r中的常数。

  • 全面微调的泛化

    更一般的微调形式允许对预训练参数的子集进行训练。在对所有权重矩阵应用LoRA并训练所有偏差时,通过将LoRA秩r设置为预训练权重矩阵的秩,大致恢复了完全微调的表达能力。

  • 没有额外的推断延迟

    当我们需要切换到另一个下游任务时,我们可以通过减去BA,然后添加一个不同的B′A′来恢复W0,这种快速的操作只需要很少的内存开销,且不会引入额外的延迟。

2. 将Lora应用于Transformer

在Transformer架构中,自注意力模块( Wq , Wk , Wv , Wo)中有4个权重矩阵,MLP(多层感知机)模块中有2个权重矩阵。论文的研究仅限于调整下游任务的注意力权重,并冻结MLP模块。

📊 研究方法

1. 数据集

GLUE Benchmark、WikiSQL 、SAMSum、E2E NLG Challenge、DART、WebNLG

2. 基线

  • 微调(FT)
    在微调过程中,模型初始化为预训练的权重和偏置,所有模型参数进行梯度更新。一个简单的变体是只更新某些层,而冻结其他层。

  • Bias - only或BitFit
    只训练偏置向量,而冻结其他所有向量。

  • Prefix-embedding tuning(PreEmbed)
    在输入标记之间插入特殊标记,这些特殊标记具有可训练的词嵌入,并且通常不在模型的词汇表中。放置这些标记的位置可能会影响性能。

  • Prefix-layer tuning(PreLayer)
    Prefix-embedding tuning的扩展,不仅学习特殊标记的词嵌入,还学习每个Transformer层之后的激活。

  • Adapter tuning
    AdapterH、AdapterL、AdapterP、AdapterD

  • LoRA
    在现有权重矩阵的并行中添加可训练的秩分解矩阵对

3. 实验模型

  • ROBERTA BASE/LARGE(2019)

    • 优化了最初BERT提出的预训练配置,并在不引入更多可训练参数的情况下提高了后者的任务性能
    • RoBERTa base (125M);RoBERTa large (355M)
  • DEBERTa XXL(2021)

    • 是BERT的一个较新的变种,它是在一个更大的规模上进行训练的,并在GLUE和Su- perGLUE等基准测试中表现非常有竞争力
  • GPT-2 MEDIUM/LARGE

    • GPT-2 Medium(345M);GPT-2 LARGE(774M)
  • 扩展到GPT-3 175B

4. 关键问题

  • 应该将LoRA应用于转换器中的哪些权重矩阵?
    只考虑自注意力模块中的权重矩阵。

  • LORA的最优秩r是什么?

    • 增大r并不能覆盖更有意义的子空间,这表明低秩的适应矩阵是足够的
  • ∆W 与 W 之间的关系如何?

    • 低秩适应矩阵可能放大了特定下游任务的重要特征,这些任务在通用预训练模型中已经学习但没有强调

5. 实验结果

[image]
在这里插入图片描述
在这里插入图片描述

🚩 研究结论

1. 创新点

  • 一个预训练好的模型可以被共享,用于为不同的任务构建许多小的LoRA模块
  • 训练更加高效,在使用自适应优化器时,不需要对大多数参数进行梯度计算或保持优化器状态
  • 简单线性设计允许在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,没有引入推理延迟
  • 与许多先验方法正交,并且可以与其中的许多方法相结合,例如前缀调优

2. LoRA优缺点

  • 优点

    • 内存和存储大大减少,对于使用Adam训练的大型Transformer,如果r<<dmodel内存将减少至原先的2/3。
    • 仅交换LoRA权重而不是所有参数,以较低的成本在不同任务之间切换。
  • 缺点

    不同的任务,存在不同的参数 A 和 B。如果选择将 A 和 B 吸收到权重矩阵 W 中以消除额外的推理延迟,批处理操作比较复杂。如果对延迟不敏感,可以不合并权重,动态选择在批次中使用哪些 LoRA 模块。

<think>嗯,用户问的是在银行系统已经接入了DeepSeek模型的情况下,如何进一步用RAG和LoRA技术优化模型性能,并且要求接入部分的代码用Java写。首先,我需要确认自己对这两个技术的理解是否正确,然后再考虑如何在Java中实现。 首先,RAG是检索增强生成,结合了检索外部知识库和生成模型的能力。在银行场景中,可能需要实时查询金融产品信息、政策法规或者用户历史数据。所以,用户可能需要一个高效的检索系统,比如使用Elasticsearch或者向量数据库,然后结合生成模型来生成更准确的回答。 然后是LoRA,这是一种微调大模型的方法,通过低秩矩阵适应,可以在不改变原模型参数的情况下,用较小的参数量来调整模型行为。对于银行来说,可能需要在特定任务上微调模型,比如客服对话、风险评估等,同时保持模型原有的通用能力。 接下来,用户需要的是Java代码示例。不过,这里可能存在一些挑战,因为通常像LoRA这样的微调操作可能在Python中更常见,使用诸如Hugging Face的Transformers库。而Java在深度学习框架方面可能不如Python丰富,但仍有Deep Learning4J这样的库。不过,用户可能已经接入了DeepSeek模型,可能通过API或者某种服务的方式调用,所以实际代码可能需要结合REST API调用或者现有的Java库。 首先,关于RAG部分。在Java中,可能需要连接到一个检索系统,比如Elasticsearch,执行查询,获取相关文档,然后将这些文档作为上下文输入到DeepSeek模型中。这里需要处理检索、上下文拼接等步骤。代码示例可能包括使用Elasticsearch的Java客户端进行查询,然后构造包含上下文的请求体,发送到DeepSeek的API。 然后是LoRA部分。LoRA的实现通常涉及在模型训练时添加适配器层。如果在Java中进行微调,可能需要使用支持LoRA的库,但常见的实现可能更多在Python中。不过,用户可能已经有一个微调后的模型,通过API调用,所以在Java中可能只需要在调用模型时指定使用的LoRA适配器(比如传递一个适配器ID或名称参数)。或者,如果需要在客户端进行实时适配,这可能比较复杂,可能需要加载模型参数,这在Java中可能不太方便。所以可能的代码示例是调用已经部署好的带有LoRA适配器的模型服务,传递适配器参数。 不过,用户可能希望的是在现有系统中集成这两个技术,因此可能需要考虑如何在现有架构中添加检索步骤,以及如何调用带有LoRA适配器的模型。假设DeepSeek的API已经支持LoRA适配器,那么Java代码中可能需要添加相应的参数。 现在需要组织这些思路,给出结构化的回答,包括技术简介、优化场景、代码示例以及注意事项。需要注意代码示例可能需要简化,比如使用伪代码或假设的API调用方式,因为实际实现可能依赖具体的库或服务接口。 另外,用户可能是在银行的技术部门工作,需要确保代码的安全性和高效性,所以可能需要提到相关的最佳实践,比如缓存检索结果、微调时的数据隐私保护等。同时,可能要考虑性能问题,比如检索系统的响应时间,模型调用的延迟等。 总结一下,回答的结构应该是: 1. RAG和LoRA的简介及其在银行系统中的优化场景。 2. RAG的Java代码示例,包括检索部分和模型调用。 3. LoRA的Java代码示例,可能涉及调用带有适配器参数的模型API。 4. 注意事项,包括性能、安全、数据隐私等。 5. 结语,总结好处。 在编写代码示例时,可能需要假设使用某些库或框架,比如Elasticsearch的Java客户端,以及HTTP客户端发送请求到模型API。同时,需要确保代码示例简洁,符合Java的语法规范,并且适当添加注释。 最后,需要验证这些思路是否正确,是否有遗漏的关键点,比如RAG中上下文如何拼接,是否截断,如何处理检索失败的情况,或者LoRA适配器的具体调用方式等。可能需要进一步明确用户的具体需求,但根据问题描述,用户可能希望一个高层次的示例,所以保持代码示例的简洁和示范性是关键。</think>在银行系统中结合RAG与LoRA技术可显著提升AI模型的精准度和专业性。以下为技术简介及Java接入示例: --- ### **一、技术价值与场景** 1. **RAG(检索增强生成)** - **作用**:实时检索知识库补充上下文(如产品条款/风控规则) - **银行场景**:客户咨询应答、合规审查、风险预警 2. **LoRA(低秩适配微调)** - **作用**:低成本微调模型适配专业任务(参数更新量<1%) - **银行场景**:信贷报告生成、交易数据分析、个性化推荐 --- ### **二、Java代码实现示例** #### **1. RAG模块实现** ```java // 伪代码需替换实际SDK调用 public class RagService { // 检索知识库(示例:Elasticsearch) public List<Document> retrieveRelevantDocs(String query) { RestClient client = RestClient.builder( new HttpHost("es-host", 9200, "http")).build(); Request request = new Request("GET", "/knowledge_base/_search"); request.setJsonEntity("{ \"query\": { \"match\": { \"content\": \"" + query + "\" } } }"); Response response = client.performRequest(request); return parseDocuments(response.getEntity().getContent()); } // 拼接上下文调用DeepSeek public String generateWithRAG(String userQuery) { List<Document> docs = retrieveRelevantDocs(userQuery); String context = docs.stream().map(Document::getText).collect(Collectors.joining("\n")); String prompt = "基于以下信息回答问题:\n" + context + "\n\n问题:" + userQuery; return DeepSeekClient.generate(prompt); // 假设已有模型调用封装 } } ``` #### **2. LoRA适配调用** ```java // 假设模型服务支持LoRA适配器切换 public class LoraAdapterService { public String generateWithLora(String input, String adapterId) { JsonObject requestBody = new JsonObject(); requestBody.addProperty("input", input); requestBody.addProperty("adapter_id", adapterId); // 指定业务适配器(如loan_risk_v1) HttpResponse response = Unirest.post("https://api.deepseek.com/v1/generate")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值