什么是LoRA微調

LoRA是大模型微調方法的一種,它的特點是只在模型的 部分權重(如 QKV 矩陣) 上 添加可訓練參數
通過 低秩矩陣(A×B) 來優化參數更新
優點:
極大降低顯存消耗(deepseek 7B 只需 10GB)
適用于多任務 LoRA 適配器切換
訓練速度快

例如在 Transformer 里,自注意力(Self-Attention)計算:
Y=XW,
其中 X 是input, W是原始模型的權重矩陣(全連接層).
傳統的Fine-tuning就是直接對 W 進行梯度更新,導致需要存儲整個 W 的更新版本,顯存占用極大。

LoRA 關鍵思想:
不直接更新 W,而是 用兩個小矩陣 A A A B B B 近似建模 W 的變化:
W ′ = W + Δ W W' = W + \Delta W W=W+ΔW
Δ W = A B \Delta W = AB ΔW=AB

其中:
A ∈ R d × r A \in \mathbb{R}^{d \times r} ARd×r
B ∈ R r × d B \in \mathbb{R}^{r \times d} BRr×d
r ? d r \ll d r?d(低秩),一般 r=4, 8, 16,遠小于 d。

所以只需要訓練A 和 B,大幅減少訓練參數量,用 A B AB AB近似 Δ W \Delta W ΔW, 使得最終 W ′ W' W仍然能適應新任務。
訓練時,只更新A和B, W保持凍結。
推理時,計算 W + A B W+AB W+AB得到微調后的完整模型, 但A,B遠小于W,開銷極小。

代碼簡單演示一下如何在transformer的q_proj里加入LoRA
在 Transformer 里,q_proj 是 nn.Linear 層

import torch
import torch.nn as nn
import mathclass LoRAQProj(nn.Module):def __init__(self, hidden_size, r=16, lora_alpha=16):super().__init__()self.hidden_size = hidden_sizeself.r = rself.lora_alpha = lora_alphaself.scaling = lora_alpha / r  # LoRA 影響力# 原始 Q 投影層(凍結)self.q_proj = nn.Linear(hidden_size, hidden_size, bias=False)# LoRA 適配器:A 和 Bself.lora_A = nn.Linear(hidden_size, r, bias=False)  # 低秩 Aself.lora_B = nn.Linear(r, hidden_size, bias=False)  # 低秩 B# 初始化 LoRA 參數nn.init.kaiming_uniform_(self.lora_A.weight, a=math.sqrt(5))nn.init.zeros_(self.lora_B.weight)  # B 矩陣初始化為 0def forward(self, x):"""計算 Self-Attention 里的 Query 矩陣:Q = X * (W_q + AB)"""base_output = self.q_proj(x)  # 原始投影lora_output = self.lora_B(self.lora_A(x)) * self.scaling  # LoRA 適配器return base_output + lora_output  # 總輸出# 測試模型
hidden_size = 512
batch_size = 4
seq_len = 10x = torch.randn(batch_size, seq_len, hidden_size)  # 輸入數據
model = LoRAQProj(hidden_size)
output = model(x)print("LoRA Q-Projection Output Shape:", output.shape)  # (4, 10, 512)

訓練LoRA適配器

訓練時,凍結self.q_proj, 只訓練lora_A 和 lora_B

# 訓練 LoRA
optimizer = torch.optim.AdamW([p for n, p in model.named_parameters() if "lora" in n], lr=1e-4
)for epoch in range(10):for batch in dataloader:  # 假設 dataloader 提供訓練數據optimizer.zero_grad()output = model(batch["input_ids"])loss = loss_function(output, batch["labels"])  # 計算損失loss.backward()optimizer.step()

推理時合并LoRA

LoRA 訓練完成后,我們需要合并 A, B 到 q_proj
計算 W q ′ = W q + A B W_{q}' = W_{q} + AB Wq?=Wq?+AB,
這樣,可以移除A,B,只保留 W q ′ W_{q}' Wq?, 加速推理

def merge_lora(model):"""合并 LoRA 適配器到原始權重:W_q' = W_q + AB"""with torch.no_grad():model.q_proj.weight += (model.lora_B.weight @ model.lora_A.weight) * model.scaling# 移除 LoRA 適配器del model.lora_Adel model.lora_Breturn model# 進行推理時合并 LoRA
merged_model = merge_lora(model)

不過實際中,不需要我們自己去寫這些代碼,可以用unsloth, LLaMA-Factory 等框架來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EasyRTC低延遲通信與智能處理:論嵌入式WebRTC與AI大模型的技術融合

在當今數字化時代,實時通信的需求日益增長,視頻通話作為一種高效、直觀的溝通方式,廣泛應用于各個領域。WebRTC技術的出現,為實現瀏覽器之間的實時音視頻通信提供了便捷的解決方案。而基于WebRTC技術的EasyRTC視頻通話SDK&#xf…

10、k8s對外服務之ingress

service和ingress的作用 service的作用 NodePort:會在每個節點開放一個端口,端口號30000-32767。 也是只能用于內網訪問,四層轉發。實現負載均衡。不能基于域名進行訪問。 clusterip:service的默認類型,只能在集群…

Java數據結構---棧

目錄 一、棧的概念 二、棧的基本方法 三、棧的模擬實現 四、棧的練習 1、括號匹配 2、出棧入棧次序匹配 一、棧的概念 棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底…

從CNN到Transformer:遙感影像目標檢測的未來趨勢

文章目錄 前言專題一、深度卷積網絡知識專題二、PyTorch應用與實踐(遙感圖像場景分類)專題三、卷積神經網絡實踐與遙感影像目標檢測專題四、卷積神經網絡的遙感影像目標檢測任務案例【FasterRCNN】專題五、Transformer與遙感影像目標檢測專題六、Transfo…

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI進程,提升PHP應用的性能和穩定性 php-fpm是一個高性能的php FastCGI管理器,提供了更好的php進程管理方式,可以有效的控制內存和進程,支…

Python strip() 方法詳解:用途、應用場景及示例解析(中英雙語)

Python strip() 方法詳解:用途、應用場景及示例解析 在 Python 處理字符串時,經常會遇到字符串前后存在多余的空格或特殊字符的問題。strip() 方法就是 Python 提供的一個強大工具,專門用于去除字符串兩端的指定字符。本文將詳細介紹 strip(…

open webui 部署 以及解決,首屏加載緩慢,nginx反向代理訪問404,WebSocket后端服務器鏈接失敗等問題

項目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 選擇了docker部署 如果 Ollama 在您的計算機上,請使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…

docker安裝ros2 并在windows中顯示docker內ubuntu系統窗口并且vscode編程

這里包括docker desktop安裝ros2 humble hawkshill , 安裝xserver(用來在windows中顯示ubuntu中窗口), vscode安裝插件連接docker并配置python的一系列方法 1.安裝xserver 為了能方便的在windows中顯示ubuntu內的窗口,比如rqt窗口 參考文章:https://www.cnblogs.com/larva-zhh…

VMware安裝Centos 9虛擬機+設置共享文件夾+遠程登錄

一、安裝背景 工作需要安裝一臺CentOS-Stream-9的機器環境,所以一開始的安裝準備工作有: vmware版本:VMware Workstation 16 鏡像版本:CentOS-Stream-9-latest-x86_64-dvd1.iso (kernel-5.14.0) …

C/C++ 中 volatile 關鍵字詳解

volatile 關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:操作系統、硬件或者其它線程等。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊…

處理器架構、單片機、芯片、光刻機之間的關系

這些術語都涉及到半導體和電子設備的設計與制造,但它們的含義和作用有所不同。下面我會逐個解釋,并描述它們之間的關系: 1. 處理器架構 (Processor Architecture) 處理器架構指的是處理器(CPU)的設計原理和結構。它定…

python之socket編程

Socket編程是計算機網絡編程的基礎,它允許兩臺計算機(或同一個計算機的不同進程)之間進行通信。Python 提供了 socket 模塊,可以很方便地進行 Socket 編程。下面是一些基本的 Socket 編程示例,包括 TCP 和 UDP。 TCP …

Docker 的安全配置與優化(二)

Docker 安全優化策略 (一)多階段構建優化鏡像大小 多階段構建是 Docker 17.05 版本引入的強大功能,它允許在一個 Dockerfile 中定義多個構建階段,每個階段都可以使用不同的基礎鏡像和依賴項,最終只將必要的文件和依賴…

歐洲跨境組網專線:企業出海的高效網絡解決方案

在全球化的背景下,越來越多的企業將業務拓展至海外市場,并在歐洲等地設立分支機構。然而,跨境辦公中常常面臨公網網絡延遲高、打開速度慢、丟包嚴重等問題,這不僅影響辦公效率,還增加了IT維護的難度和成本。針對這一痛…

面陣工業相機提高餐飲業生產效率

餐飲行業是一個快節奏、高要求的領域,該領域對生產過程中每一個階段的效率和準確性都有很高的要求。在食品加工、包裝、質量控制和庫存管理等不同生產階段實現生產效率的優化是取得成功的關鍵步驟。面陣工業相機能夠一次性捕捉對象的二維區域圖像,并支持…

Renesas RH850 IAR編譯時變量分配特定內存

文章目錄 1. 核心作用2. 典型使用場景3. 示例代碼4. 編譯器與鏈接腳本協作5. 注意事項6. 調試驗證在RH850系列微控制器的開發中,#pragma location = "FIRST_RAM" 是一條編譯器指令,其核心含義是 將變量或函數分配到名為 FIRST_RAM 的特定內存段。以下是詳細解釋: …

C++面試題,進程和線程方面(1)

文章目錄 前言進程和線程有什么不同進程,線程的通訊方式什么是鎖為什么說鎖可以使線程安全加鎖有什么副作用總結 前言 這是個人總結進程和線程方面的面試題。如果有錯,歡迎佬們前來指導!!! 進程和線程有什么不同 進程…

視頻mp4垂直拼接 水平拼接

視頻mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 獲取目錄下的所有視頻文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…

Unity攝像機與燈光相關知識

一、Inspector窗口 Inspector窗口可以查看和編輯對象的屬性以及設置 其中包含各種組件,例如用Cube對象來舉例 1.Sphere(Mesh)組件: 用來決定對象的網格屬性,例如球體網格為Sphere、立方體網格為Cube 2.Mesh Renderer組件: 用來設置…

C++(17):為optional類型構造對象

C++(17):optional,多了一個合理的選擇_c++17 max-CSDN博客 介紹了optional做為函數返回值的一種方式 其實optional也可以作為對象來使用 #include &