大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調(Fine-tuning)

微調的核心在于調整預訓練模型的參數,使其更好地適應目標任務的數據分布和特定需求。但大模型通常擁有數十億甚至數萬億的參數,直接進行全參數微調會帶來巨大的計算資源和存儲挑戰。本章將深入探討大模型微調的策略,以及如何采用高效訓練技術來應對這些挑戰。

4.1 大模型微調:從通用到專精

4.1.1 為什么需要微調?

盡管預訓練大模型具有強大的泛化能力,但它們在預訓練階段看到的數據通常是通用的、領域無關的。當我們需要它們完成特定領域的任務時,例如醫療文本分類、法律問答、特定風格的圖像生成等,通用知識可能不足以滿足需求。微調的目的是:

  • 適應任務特異性: 調整模型,使其更好地理解和處理特定任務的輸入輸出格式及語義。
  • 適應數據分布: 將模型知識遷移到目標任務的特定數據分布上,提高模型在目標數據上的性能。
  • 提升性能: 通常,經過微調的模型在特定下游任務上的表現會顯著優于直接使用預訓練模型。
  • 提高效率: 相較于從頭開始訓練一個新模型,微調一個預訓練大模型通常更快、更有效。
4.1.2 全參數微調 (Full Fine-tuning)

核心思想: 全參數微調是最直接的微調方法,它解凍(unfreeze)預訓練模型的所有參數,并使用目標任務的標注數據對其進行端到端(end-to-end)的訓練。

原理詳解: 在全參數微調中,我們加載一個預訓練模型的權重,然后像訓練一個普通神經網絡一樣,使用新的數據集和損失函數來訓練它。由于模型的所有層都參與梯度計算和參數更新,理論上模型可以最大程度地適應新任務。

優點:

  • 性能潛力大: 如果資源允許且數據集足夠大,全參數微調通常能達到最佳性能。
  • 概念簡單: 實現起來相對直接。

缺點:

  • 計算資源需求巨大: 對于擁有數十億參數的大模型,全參數微調需要大量的GPU顯存和計算時間。
  • 存儲成本高昂: 每個下游任務都需要存儲一套完整的模型參數,不便于多任務部署。
  • 災難性遺忘(Catastrophic Forgetting): 在小規模數據集上進行微調時,模型可能會“遺忘”在預訓練階段學到的通用知識,導致在其他任務上的性能下降。

Python示例:簡單文本分類的全參數微調

我們將使用一個預訓練的BERT模型進行情感分類任務的全參數微調。

Python

import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset, Dataset
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support# 1. 加載預訓練模型和分詞器
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) # 2個類別:正面/負面情感# 2. 準備數據集 (使用Hugging Face datasets庫加載一個情感分析數據集)
# 這里使用 'imdb' 數據集作為示例
# 如果是第一次運行,會自動下載
print("Loading IMDb dataset...")
dataset = load_dataset("imdb")# 預處理數據
def preprocess_function(examples):return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)tokenized_imdb = dataset.map(preprocess_function, batched=True)# 重命名標簽列為 'labels' 以符合Trainer的要求
tokenized_imdb = tokenized_imdb.rename_columns({"label": "labels"})
# 移除原始文本列
tokenized_imdb = tokenized_imdb.remove_columns(["text"])
# 設置格式為PyTorch tensors
tokenized_imdb.set_format("torch")# 劃分訓練集和測試集
small_train_dataset = tokenized_imdb["train"].shuffle(seed=42).select(range(2000)) # 使用小部分數據進行演示
small_eval_dataset = tokenized_imdb["test"].shuffle(seed=42).select(range(500))# 3. 定義評估指標
def compute_metrics(p):predictions, labels = ppredictions = np.argmax(predictions, axis=1)precision, recall, f1, _ = precision_recall_fscore_support(labels, predictions, average='binary')acc = accuracy_score(labels, predictions)return {'accuracy': acc,'f1': f1,'precision': precision,'recall': recall}# 4. 配置訓練參數
training_args = TrainingArguments(output_dir="./results_full_finetune",num_train_epochs=3,              # 訓練輪次per_device_train_batch_size=16,  # 訓練批次大小per_device_eval_batch_size=16,   # 評估批次大小warmup_steps=500,                # 學習率預熱步數weight_decay=0.01,               # 權重衰減logging_dir='./logs_full_finetune', # 日志目錄logging_steps=100,evaluation_strategy="epoch",     # 每個epoch結束后評估save_strategy="epoch",           # 每個epoch結束后保存模型load_best_model_at_end=True,     # 訓練結束后加載最佳模型metric_for_best_model="f1",      # 衡量最佳模型的指標report_to="none"                 # 不上傳到任何在線平臺
)# 5. 初始化Trainer并開始訓練
trainer = Trainer(model=model,args=training_args,train_dataset=small_train_dataset,eval_dataset=small_eval_dataset,compute_metrics=compute_metrics,
)print("\n--- BERT 全參數微調示例 ---")
# 檢查是否有GPU可用
if torch.cuda.is_available():print(f"Using GPU: {torch.cuda.get_device_name(0)}")
else:print("No GPU available, training on CPU (will be slow).")trainer.train()print("\nFull fine-tuning completed. Evaluation results:")
eval_results = trainer.evaluate()
print(eval_results)

代碼說明:

  • 我們使用了Hugging Face transformers庫的Trainer API,它極大地簡化了訓練過程。
  • AutoTokenizerAutoModelForSequenceClassification 自動加載BERT模型和對應的分詞器。
  • load_dataset("imdb") 用于獲取情感分類的示例數據。
  • preprocess_function 將文本轉換為模型可以理解的token ID序列。
  • TrainingArguments 用于配置各種訓練參數,如學習率、批次大小、保存策略等。
  • compute_metrics 定義了用于評估模型性能的指標。
  • trainer.train() 啟動訓練過程。
4.1.3 參數高效微調 (Parameter-Efficient Fine-tuning, PEFT)

核心思想: PEFT旨在解決全參數微調的缺點,它通過只微調預訓練模型中少量新增或現有參數,同時凍結大部分預訓練參數,從而大大降低計算和存儲成本,并有效避免災難性遺忘。

PEFT方法可以分為幾大類:

  1. 新增適配器模塊: 在預訓練模型的中間層或輸出層插入小型的可訓練模塊(Adapter)。
  2. 軟提示: 優化輸入中少量連續的、可學習的“軟提示”或“前綴”,而不是修改模型參數。
  3. 低秩適應: 通過低秩分解來近似全參數更新,減少可訓練參數。

我們將重點介紹其中最流行且高效的幾種方法。

4.1.3.1 LoRA (Low-Rank Adaptation)

  • 顯著減少可訓練參數: 大幅降低顯存消耗和訓練時間。
  • 避免災難性遺忘: 預訓練權重凍結,保護了通用知識。
  • 部署高效: 可以在推理時合并權重,不增加額外延遲。
  • 多任務部署: 針對不同任務,只需存儲和加載很小的 (BA) 矩陣。

Python示例:使用peft庫進行LoRA微調

我們將使用Hugging Face的peft庫對預訓練的GPT-2模型進行LoRA微調,用于文本生成任務。

首先,確保安裝peft庫:

Bash

<

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

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

相關文章

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;字符串函數09&#xff0c;strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組&#xff0c;且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組&#xff0c;但我們想要的是最大子數組&#xff0c;所以f[i]表示&#xff1a;以i位置為結尾&#xff0c;所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…

全鏈路解析:影刀RPA+Coze API自動化工作流實戰指南

在數字化轉型加速的今天&#xff0c;如何通過RPA與API的深度融合實現業務自動化提效&#xff0c;已成為企業降本增效的核心命題。本文以「影刀RPA」與「Coze API」的深度協作為例&#xff0c;系統性拆解從授權配置、數據交互到批量執行的完整技術鏈路&#xff0c;助你快速掌握跨…

php本地 curl 請求證書問題解決

錯誤: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解決方案 在php目錄下創建證書文件夾, 執行下面生成命令, 然后在php.ini 文件中配置證書路徑; 重啟環境 curl --eta…

【圖數據庫】--Neo4j 安裝

目錄 1.Neo4j --概述 2.JDK安裝 3.Neo4j--下載 3.1.下載資源包 3.2.創建環境變量 3.3.運行 Neo4j 是目前最流行的圖形數據庫(Graph Database)&#xff0c;它以節點(Node)、關系(Relationship)和屬性(Property)的形式存儲數據&#xff0c;專門為處理高度連接的數據而設計。…

MIT 6.S081 2020Lab5 lazy page allocation 個人全流程

文章目錄 零、寫在前面一、Eliminate allocation from sbrk()1.1 說明1.2 實現 二、Lazy allocation2.1 說明2.2 實現 三、Lazytests and Usertests3.1 說明3.2 實現3.2.1 lazytests3.2.2 usertests 零、寫在前面 可以閱讀下4.6頁面錯誤異常 像應用程序申請內存&#xff0c;內…

(Git) 稀疏檢出(Sparse Checkout) 拉取指定文件

文章目錄 &#x1f3ed;作用&#x1f3ed;指令總覽&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;實例演示?END&#x1f31f;交流方式 &#x1f3ed;作用 類似于 .gitignore 進行文件的規則匹配。 一般在需要拉取大型項目指定的某些文件…

docker初學

加載鏡像&#xff1a;docker load -i ubuntu.tar 導出鏡像&#xff1a;docker save -o ubuntu1.tar ubuntu 運行&#xff1a; docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 進入容器&#xff1a;docke…

Docker系列(二):開機自啟動與基礎配置、鏡像加速器優化與疑難排查指南

引言 docker 的快速部署與高效運行依賴于兩大核心環節&#xff1a;基礎環境搭建與鏡像生態優化。本期博文從零開始&#xff0c;系統講解 docker 服務的管理配置與鏡像加速實踐。第一部分聚焦 docker 服務的安裝、權限控制與自啟動設置&#xff0c;確保環境穩定可用&#xff1b…

計算機視覺(圖像算法工程師)學習路線

計算機視覺學習路線 Python基礎 常量與變量 列表、元組、字典、集合 運算符 循環 條件控制語句 函數 面向對象與類 包與模塊Numpy Pandas Matplotlib numpy機器學習 回歸問題 線性回歸 Lasso回歸 Ridge回歸 多項式回歸 決策樹回歸 AdaBoost GBDT 隨機森林回歸 分類問題 邏輯…

工業軟件國產化:構建自主創新生態,賦能制造強國建設

隨著全球產業環境的變化和技術的發展&#xff0c;建立自主可控的工業體系成為我國工業轉型升級、走新型工業化道路、推動國家制造業競爭水平提升的重要抓手。 市場倒逼與政策護航&#xff0c;國產化進程雙輪驅動 據中商產業研究院預測&#xff0c;2025年中國工業軟件市場規模…

OpenCV CUDA 模塊圖像過濾------創建一個高斯濾波器函數createGaussianFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模塊中的一個工廠函數&#xff0c;用于創建一個高斯濾波器。這個濾波器可以用來平滑圖像&#…

【RocketMQ 生產者和消費者】- 生產者發送故障延時策略

文章目錄 1. 前言2. FaultItem3. LatencyFaultToleranceImpl 容錯集合處理類3.1 updateFaultItem 更新容錯集合3.2 isAvailable 判斷 broker 是否可用3.3 pickOneAtLeast 至少選出一個故障 broker 4. MQFaultStrategy 故障策略類4.1 屬性4.2 updateFaultItem 更新延遲故障容錯信…

【HarmonyOS 5】Map Kit 地圖服務之應用內地圖加載

#HarmonyOS SDK應用服務&#xff0c;#Map Kit&#xff0c;#應用內地圖 目錄 前期準備 AGC 平臺創建項目并創建APP ID 生成調試證書 生成應用證書 p12 與簽名文件 csr 獲取 cer 數字證書文件 獲取 p7b 證書文件 配置項目簽名 項目開發 配置Client ID 開通地圖服務 配…

(1-6-1)Java 集合

目錄 0.知識概述&#xff1a; 1.集合 1.1 集合繼承關系類圖 1.2 集合遍歷的三種方式 1.3 集合排序 1.3.1 Collections實現 1.3.2 自定義排序類 2 List 集合概述 2.1 ArrayList &#xff08;1&#xff09;特點 &#xff08;2&#xff09;常用方法 2.2 LinkedList 3…

Vue.extend

Vue.extend 是 Vue 2 中的一個重要 API&#xff0c;用于基于一個組件配置對象創建一個“可復用的組件構造函數”。它是 Vue 內部構建組件的底層機制之一&#xff0c;適用于某些高級用法&#xff0c;比如手動掛載組件、彈窗動態渲染等。 ?? 在 Vue 3 中已被移除&#xff0c;V…

【MySQL系列】SQL 分組統計與排序

博客目錄 引言一、基礎語法解析二、GROUP BY 的底層原理三、ORDER BY 的排序機制四、NULL 值的處理策略五、性能優化建議六、高級變體查詢 引言 在現代數據分析和數據庫管理中&#xff0c;分組統計是最基礎也是最核心的操作之一。無論是業務報表生成、用戶行為分析還是系統性能…

spring中的InstantiationAwareBeanPostProcessor接口詳解

一、接口定位與核心功能 InstantiationAwareBeanPostProcessor是Spring框架中擴展Bean生命周期的關鍵接口&#xff0c;繼承自BeanPostProcessor。它專注于Bean的實例化階段&#xff08;對象創建和屬性注入&#xff09;的干預&#xff0c;而非父接口的初始化階段&#xff08;如…

uniapp使用sse連接后端,接收后端推過來的消息(app不支持!!)

小白終成大白 文章目錄 小白終成大白前言一、什么是SSE呢&#xff1f;和websocket的異同點有什么&#xff1f;相同點不同點 二、直接上實現代碼總結 前言 一般的請求就是前端發 后端回復 你一下我一下 如果需要有什么實時性的 后端可以主動告訴前端的技術 我首先會想到 webso…