LoRA 淺析

1. 核心思想

LoRA 是一種參數高效的微調方法,旨在減少微調大型語言模型 (LLMs) 所需的計算資源和存儲空間。其核心思想是:

  • 凍結預訓練模型權重: 在微調過程中,保持預訓練 LLM 的原始權重不變。
  • 引入低秩矩陣: 對于 LLM 中的某些層(通常是 Transformer 層的 Query/Key/Value 投影矩陣),引入一對小型的低秩矩陣 A 和 B。
  • 僅訓練新增參數: 只訓練這些新增的低秩矩陣 A 和 B,而原始預訓練權重保持不變。

即只訓練新增低秩矩陣的參數,該低秩矩陣帶來的參數量遠小于整體的參數量,為何采用秩這個概念:
矩陣的秩(rank)本質上是反映了矩陣的“信息量”或“獨立性”的概念,在 LoRA 中,秩控制了分解矩陣的“復雜度”或“容量”。如果秩太低,分解后的矩陣可能無法捕捉到足夠的特征,從而影響模型的性能;如果秩太高,參數量可能無法大幅度減少。因此選擇一個合適的秩同樣重要

來源LoRA 論文
來源于 LoRA論文

2. 原理詳解

  • 線性層的秩分解: LLM 中的線性層可以表示為矩陣乘法:y = Wx,其中 W 是預訓練的權重矩陣。

  • LoRA 的修改:

    LoRA 在此基礎上增加了一個并行路徑:

    y = Wx + BAx
    
    • A 是一個形狀為 (r, in_features) 的矩陣,其中 r 是秩。
    • B 是一個形狀為 (out_features, r) 的矩陣。
    • r 通常遠小于 in_featuresout_features,因此 BA 是一個低秩矩陣。
  • 訓練過程: 在微調過程中,W 被凍結,只有 A 和 B 被訓練。

  • 推理過程: 可以選擇將 BA 和 W 合并,也可以分開計算。

注意:與全參數微調相比,LoRA 的性能可能略有下降,尤其是在需要模型進行較大改變的任務上

import torch
import torch.nn as nnclass LoRALinear(nn.Module):def __init__(self, linear_layer, r: int):super().__init__()self.linear = linear_layerself.r = rself.lora_A = nn.Parameter(torch.randn(r, linear_layer.in_features))self.lora_B = nn.Parameter(torch.zeros(linear_layer.out_features, r))self.scaling = linear_layer.out_features / rnn.init.kaiming_uniform_(self.lora_A, a=5**0.5)self.weight = None # For merged weightsdef forward(self, x: torch.Tensor):if self.weight is not None:return F.linear(x, self.weight, self.linear.bias)else:return self.linear(x) + (x @ self.lora_A.T @ self.lora_B.T) * self.scalingdef merge(self):if self.weight is None:self.weight = self.linear.weight + self.lora_B @ self.lora_A

在具體實現中存在一個縮放系數scaling,縮放系數用于調節低秩分解后的參數在微調過程中的影響力。在 LoRA 中,模型的權重 W 被低秩分解為兩個矩陣 AB,并在模型的訓練過程中對這些矩陣進行微調。縮放系數用于控制這些低秩矩陣對最終模型輸出的影響力。

在使用的經驗中,縮放系數通常設置為秩的 2 倍表現性能最優

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

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

相關文章

軟件范式正在經歷第三次革命

核心主題:軟件范式正在經歷第三次根本性革命(軟件3.0),其核心是“智能體”(Agent),未來十年將是“智能體的十年”。 邏輯模塊解析: 軟件的三次重生革命 軟件1.0: 傳統編…

JavaScript 變量與運算符全面解析:從基礎到高級應用

昨天學長說可以放緩一下學習進度,剛好最近期末復習也不是很緊張,所以來重新復習一下js的一些知識點。 一:變量 (1)變量聲明 來簡單看一下變量的一些知識點。首先是變量聲明:變量聲明盡量使用數組字母下劃線 來舉幾個例子&#x…

移動語義對性能優化的具體示例

前言 本文章對比了&#xff1a;小中大字符串在普通傳值、傳值移動、傳左值引用、傳右值引用、模板完美轉發、內聯版本等多種測試&#xff0c;對比各個方式的性能優異&#xff1a; 測試代碼1 #include <iostream> #include <string> #include <chrono> #incl…

C/C++ 和 OpenCV 來制作一個能與人對弈的實體棋盤機器人

項目核心架構 整個系統可以分為四個主要模塊&#xff1a; 視覺感知模塊 (Vision Perception Module): 任務: 使用攝像頭“看懂”棋盤。工具: C, OpenCV。功能: 校準攝像頭、檢測棋盤邊界、進行透視變換、分割 64 個棋盤格、識別每個格子上的棋子、檢測人類玩家的走法。 決策模…

SpringBoot擴展——日志管理!

Spring Boot擴展 在Spring Boot中可以集成第三方的框架如MyBatis、MyBatis-Plus和RabbitMQ等統稱為擴展。每一個擴展會封裝成一個集成&#xff0c;即Spring Boot的starter&#xff08;依賴組件&#xff09;。starter是一種非常重要的機制&#xff0c;不需要煩瑣的配置&#xf…

【JSON-To-Video】AI智能體開發:為視頻圖片元素添加動效(滑入、旋轉、滑出),附代碼

各位朋友們&#xff0c;大家好&#xff01; 今天要教大家如何在 JSON - To - Video 中為視頻內圖片元素添加滑入、旋轉、滑出的動效。 如果您還不會封裝制作自己的【視頻工具插件】&#xff0c;歡迎查看之前的教程&#xff01; AI智能體平臺&#xff0c;如何封裝自定義短視頻…

Spring Boot(九十二):Spring Boot實現連接不上數據庫就重啟服務

場景: 在線上部署時,若服務器因斷電等原因意外重啟,項目及其依賴的數據庫服務通常需要配置為自動啟動。此時,如果數據庫服務啟動較慢或失敗,Spring Boot 項目會因無法建立數據庫連接而啟動失敗。 需求: 為確保項目啟動成功,需要讓 Spring Boot 項目等待數據庫服務完全就…

Debian配置Redis主從、哨兵

前言 Redis的下載安裝可參考Centos安裝配置Redis6.x&#xff0c;Centos和Debian的步驟基本類似&#xff0c;或自行在網上搜索相關資料 注意&#xff1a;遠程連接需放開相應端口 主從 搭建一個一主二從的主從模式 處理conf文件 #進入redis所在目錄 cd /tools/redis/redis6 …

虛實交融:數字孿生如何重塑交通與公路勘察設計的未來

當每一條道路、每一座橋梁、每一盞信號燈都在數字世界獲得“永生副本”&#xff0c;交通系統從被動響應邁入主動預演的紀元 一、數字孿生的核心定義&#xff1a;超越鏡像的動態認知引擎 數字孿生&#xff08;Digital Twin&#xff09;并非簡單的三維可視化模型&#xff0c;而是…

vector模擬實現中的迭代器失效問題

首先來看一組代碼&#xff1a; iterator insert(iterator pos, const T& x) {// 擴容if (_finish _end_of_storage){size_t len pos - _stare;reserve(capacity() 0 ? 4 : capacity() * 2);pos _stare len;}iterator end _finish - 1;while (end > pos){*(end…

java 設計模式_行為型_22模板模式

22.模板模式 模板方法&#xff08;Template Method&#xff09;作為Java的設計模式之一&#xff0c;一個詞概括其優勢特點那就是&#xff1a;抽象步驟 首先我們應該抽出共通的東西做一個父類&#xff08;Base類&#xff09;&#xff0c;其次具體的蛋糕制作由子類進一步實現&…

隨記:在springboot中websocket的使用

我現在有兩種方法 第一種&#xff1a;使用java封裝的這個包下的javax.websocket.* 先配置這個配置類 import com.alibaba.nacos.common.utils.CollectionUtils; import org.springframework.stereotype.Component;import javax.websocket.HandshakeResponse; import javax.w…

技術文章大綱:SpringBoot自動化部署實戰

技術文章大綱&#xff1a;SpringBoot自動化部署實戰 概述 自動化部署的背景與意義SpringBoot在現代化部署中的優勢常見自動化部署工具與方案概覽&#xff08;Jenkins、Docker、K8s等&#xff09; 環境準備 基礎工具要求&#xff1a;JDK、Maven/Gradle、Git服務器環境配置&a…

FastAdmin按鈕類功能全解析 class 屬性定義不同的交互行為

在 FastAdmin 中&#xff0c;超鏈接的 class 屬性用于定義不同的交互行為和樣式。以下是常見 class 配置的用途和區別&#xff1a; btn-dialog 用于觸發彈出對話框行為。點擊帶有此 class 的鏈接或按鈕時&#xff0c;FastAdmin 會自動加載指定的 URL 內容并在模態框中顯示。通…

python3字典對象實現解析

文章目錄 前言Raymond的方案字典結構字典創建字典插入插入空字典PyDictKeysObject的創建設置索引存儲entry 插入非空字典調整大小字典查找聯合字典插入 字典查詢字典刪除 前言 本來以為python字典的實現就是一個哈希表的普通實現&#xff0c;所以在學習基本類型時沒去仔細研究…

Word2Vec介紹

前言 當今的大語言模型非常智能&#xff0c;但是你有沒有想過這些事情&#xff1a; 機器是怎么理解“國王”和“王后”之間的關系&#xff1f; “貓”和“狗”是怎么在 AI 中“相似以及區分”的&#xff1f; 文本又是怎么變成模型能讀懂的數字&#xff1f; 這一切&#xf…

Rsync+sersync實現數據實時同步(小白的“升級打怪”成長之路)

目錄 一、rsync部署 push推數據 1、編寫rsync配置文件 2、備份測試 3、檢驗結果 二、rsyncsersync 實現數據實時同步 1、安裝sersync服務 2、檢驗結果 pull拉取數據 1、編寫rsync配置文件 2、檢驗結果 三、腳本編寫 1、客戶端腳本編寫 2、服務器腳本編寫 一、rsy…

用 python 開發一個可調用工具的 AI Agent,實現電腦配置專業評價

在人工智能時代&#xff0c;AI Agent憑借其強大的任務處理能力&#xff0c;逐漸成為開發人員手中的得力工具。今天&#xff0c;我們就來一起動手&#xff0c;用Python打造一個能夠調用工具的AI Agent&#xff0c;實現根據電腦信息對電腦配置進行專業評價的功能。 一、項目創建…

WSL 安裝使用和常用命令

參考官方使用說明&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/ 安裝wsl: wsl --install --no-distribution --no-distribution&#xff1a;安裝 WSL 時不要安裝分發版 更新 wsl: wsl --update 設置wsl 默認版本&#xff1a; wsl --set-default-version <…

720全景VR拍攝制作實戰教程

720全景VR拍攝制作實戰教程 720全景VR拍攝制作是近年來興起的一種沉浸式影像制作技術。它通過多角度拍攝&#xff0c;并將畫面拼接成一個全景視角&#xff0c;使觀眾獲得身臨其境的觀看體驗。本教程將帶你從準備階段到拍攝階段&#xff0c;再到后期處理階段&#xff0c;一步步…