首頁  >  文章  >  科技週邊  >  如何從頭開始編寫LoRA程式碼,這有一個教學課程

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

王林
王林轉載
2024-03-20 15:06:45488瀏覽

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中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除