目錄
从头开始编写 LoRA
與傳統微調方法的比較
優化LoRA 設定
首頁 科技週邊 人工智慧 如何從頭開始編寫LoRA程式碼,這有一個教學課程

如何從頭開始編寫LoRA程式碼,這有一個教學課程

Mar 20, 2024 pm 03:06 PM
ai 訓練

LoRA(Low-Rank Adaptation)是一项流行的技术,旨在微调大语言模型(LLM)。这项技术最初由微软的研究人员提出,并收录在《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》的论文中。LoRA与其他技术不同之处在于,并非调整神经网络的所有参数,而是专注于更新少量低秩矩阵,从而显著减少了训练模型所需的计算量。

由于 LoRA 的微调质量与全模型微调相当,很多人将这种方法称为微调神器。自发布以来,很多人对这项技术感到好奇,希望通过编写代码来更好地理解这一研究。以往,缺乏适当的文档说明一直是一个困扰,但现在,我们有了教程的帮助。

这篇教程的作者是知名机器学习与 AI 研究者 Sebastian Raschka,他表示在各种有效的 LLM 微调方法中,LoRA 仍然是自己的首选。为此,Sebastian 专门写了一篇博客《Code LoRA From Scratch》,从头开始构建 LoRA,在他看来,这是一种很好的学习方法。

如何從頭開始編寫LoRA程式碼,這有一個教學課程

本文通过从头编写代码的方式介绍低秩自适应(LoRA),Sebastian在实验中对DistilBERT模型进行微调,并将其应用于分类任务。

LoRA方法与传统微调方法的比较结果表明,LoRA方法在测试准确率方面达到了92.39%,这比仅对模型最后几层进行微调(86.22%的测试准确率)表现出更优异的性能。这表明LoRA方法在优化模型性能方面具有明显优势,能够更好地提升模型的泛化能力和预测准确性。这个结果强调了在模型训练和调优过程中采用先进的技术和方法的重要性,以获得更好的性能表现和结果。通过比

Sebastian 是如何实现的,我们接着往下看。

从头开始编写 LoRA

用代码的方式表述一个 LoRA 层是这样的:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

其中,in_dim 是想要使用 LoRA 修改的层的输入维度,与此对应的 out_dim 是层的输出维度。代码中还添加了一个超参数即缩放因子 alpha,alpha 值越高意味着对模型行为的调整越大,值越低则相反。此外,本文使用随机分布中的较小值来初始化矩阵 A,并用零初始化矩阵 B。

值得一提的是,LoRA 发挥作用的地方通常是神经网络的线性(前馈)层。举例来说,对于一个简单的 PyTorch 模型或具有两个线性层的模块(例如,这可能是 Transformer 块的前馈模块),其前馈(forward)方法可以表述为:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

在使用LoRA 時,通常會將LoRA 更新加入到這些線性層的輸出中,再得到程式碼如下:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

# #如果你想透過修改現有PyTorch 模型來實現LoRA ,一個簡單方法是將每個線性層替換為LinearWithLoRA 層:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

如何從頭開始編寫LoRA程式碼,這有一個教學課程

#以上這些概念總結如下圖:如何從頭開始編寫LoRA程式碼,這有一個教學課程

為了應用LoRA,本文將神經網路中現有的線性層替換為結合了原始線性層和LoRALayer 的LinearWithLoRA 層。 如何從頭開始編寫LoRA程式碼,這有一個教學課程

如何上手使用 LoRA 進行微調

如何從頭開始編寫LoRA程式碼,這有一個教學課程#LoRA 可用於 GPT 或影像生成等模型。為了簡單說明,本文採用一個用於文字分類的小型 BERT(DistilBERT) 模型來說明。

由於本文只訓練新的LoRA 權重,因而需要將所有可訓練參數的requires_grad 設定為False 來凍結所有模型參數:如何從頭開始編寫LoRA程式碼,這有一個教學課程

接下來,使用print (model) 檢查模型的結構:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

由輸出可知,模型由6 個transformer 層組成,其中包含線性層:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

如何從頭開始編寫LoRA程式碼,這有一個教學課程此外,該模型有兩個線性輸出層:

##################透過定義以下賦值函數和循環,可以選擇性地為這些線性層啟用LoRA: #####################使用print (model) 再次檢查模型,以檢查其更新的結構:############ ##

如同上面所看到的,線性層已成功地被 LinearWithLoRA 層取代。

如果使用上面顯示的預設超參數來訓練模型,則會在IMDb 電影評論分類資料集上產生以下效能:

  • 訓練準確率:92.15%
  • 驗證準確率:89.98%
  • 測試準確率:89.44%

在下一節中,本文將這些LoRA 微調結果與傳統微調結果進行了比較。

與傳統微調方法的比較

在上一節中,LoRA 在預設設定下獲得了89.44% 的測試準確率,這與傳統的微調方法相比如何?

為了進行比較,本文又進行了一項實驗,以訓練 DistilBERT 模型為例,但在訓練期間只更新最後 2 層。研究者透過凍結所有模型權重,然後解凍兩個線性輸出層來實現這一點:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

#只訓練最後兩層得到的分類性能如下:

  • 訓練準確率:86.68%
  • 驗證準確率:87.26%
  • #測試準確率:86.22%

結果顯示,LoRA 的表現優於傳統微調最後兩層的方法,但它使用的參數卻少了4 倍。微調所有層需要更新的參數比 LoRA 設定多 450 倍,但測試準確率只提高了 2%。

優化LoRA 設定

前面講到的結果都是LoRA 在預設設定下進行的,超參數如下:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

假如使用者想要嘗試不同的超參數配置,可以使用以下指令:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

不過,最佳超參數配置如下:

如何從頭開始編寫LoRA程式碼,這有一個教學課程

在這種配置下,得到結果:

  • 驗證準確率:92.96%
  • 測試準確率:92.39%

值得注意的是,即使LoRA 設定中只有一小部分可訓練參數(500k VS 66M),但準確率還是略高於透過完全微調獲得的準確率。

原文連結:https://lightning.ai/lightning-ai/studios/code-lora-from-scratch?cnotallow=f5fc72b1f6eeeaf74b648b2aa8aaf8b6

#

以上是如何從頭開始編寫LoRA程式碼,這有一個教學課程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SQL 如何添加新列 SQL 如何添加新列 Apr 09, 2025 pm 02:09 PM

SQL 中通過使用 ALTER TABLE 語句為現有表添加新列。具體步驟包括:確定表名稱和列信息、編寫 ALTER TABLE 語句、執行語句。例如,為 Customers 表添加 email 列(VARCHAR(50)):ALTER TABLE Customers ADD email VARCHAR(50);

SQL 添加列的語法是什麼 SQL 添加列的語法是什麼 Apr 09, 2025 pm 02:51 PM

SQL 中添加列的語法為 ALTER TABLE table_name ADD column_name data_type [NOT NULL] [DEFAULT default_value]; 其中,table_name 是表名,column_name 是新列名,data_type 是數據類型,NOT NULL 指定是否允許空值,DEFAULT default_value 指定默認值。

SQL 清空表:性能優化技巧 SQL 清空表:性能優化技巧 Apr 09, 2025 pm 02:54 PM

提高 SQL 清空表性能的技巧:使用 TRUNCATE TABLE 代替 DELETE,釋放空間並重置標識列。禁用外鍵約束,防止級聯刪除。使用事務封裝操作,保證數據一致性。批量刪除大數據,通過 LIMIT 限制行數。清空後重建索引,提高查詢效率。

SQL 添加列時如何設置默認值 SQL 添加列時如何設置默認值 Apr 09, 2025 pm 02:45 PM

為新添加的列設置默認值,使用 ALTER TABLE 語句:指定添加列並設置默認值:ALTER TABLE table_name ADD column_name data_type DEFAULT default_value;使用 CONSTRAINT 子句指定默認值:ALTER TABLE table_name ADD COLUMN column_name data_type CONSTRAINT default_constraint DEFAULT default_value;

使用 DELETE 語句清空 SQL 表 使用 DELETE 語句清空 SQL 表 Apr 09, 2025 pm 03:00 PM

是的,DELETE 語句可用於清空 SQL 表,步驟如下:使用 DELETE 語句:DELETE FROM table_name;替換 table_name 為要清空的表的名稱。

Redis內存碎片如何處理? Redis內存碎片如何處理? Apr 10, 2025 pm 02:24 PM

Redis內存碎片是指分配的內存中存在無法再分配的小塊空閒區域。應對策略包括:重啟Redis:徹底清空內存,但會中斷服務。優化數據結構:使用更適合Redis的結構,減少內存分配和釋放次數。調整配置參數:使用策略淘汰最近最少使用的鍵值對。使用持久化機制:定期備份數據,重啟Redis清理碎片。監控內存使用情況:及時發現問題並採取措施。

phpmyadmin建立數據表 phpmyadmin建立數據表 Apr 10, 2025 pm 11:00 PM

要使用 phpMyAdmin 創建數據表,以下步驟必不可少:連接到數據庫並單擊“新建”標籤。為表命名並選擇存儲引擎(推薦 InnoDB)。通過單擊“添加列”按鈕添加列詳細信息,包括列名、數據類型、是否允許空值以及其他屬性。選擇一個或多個列作為主鍵。單擊“保存”按鈕創建表和列。

怎麼創建oracle數據庫 oracle怎麼創建數據庫 怎麼創建oracle數據庫 oracle怎麼創建數據庫 Apr 11, 2025 pm 02:33 PM

創建Oracle數據庫並非易事,需理解底層機制。 1. 需了解數據庫和Oracle DBMS的概念;2. 掌握SID、CDB(容器數據庫)、PDB(可插拔數據庫)等核心概念;3. 使用SQL*Plus創建CDB,再創建PDB,需指定大小、數據文件數、路徑等參數;4. 高級應用需調整字符集、內存等參數,並進行性能調優;5. 需注意磁盤空間、權限和參數設置,並持續監控和優化數據庫性能。 熟練掌握需不斷實踐,才能真正理解Oracle數據庫的創建和管理。

See all articles