AI第一天 自我理解筆記--微調大模型

目錄

1. 確定目標:明確任務和數據

2. 選擇預訓練模型

3. 數據預處理

(1) 數據清洗與格式化

(2) 劃分數據集

(3) 數據加載與批處理

4. 構建微調模型架構

(1) 加載預訓練模型

(2) 修改模型尾部(適配任務)

(3) 凍結部分層(可選)

5. 設置超參數

(1) 優化器與學習率

(2) 損失函數

(3) 其他超參數

6. 微調模型

(1) 定義訓練循環

(2) 監控訓練過程

7. 調整超參數(可選)

8. 評估與部署

(1) 模型評估

(2) 部署模型

9. 常見問題與解決方案

(1) 過擬合

(2) 欠擬合

(3) 計算資源不足

10. 總結:微調的流程圖

附錄:代碼示例(文本分類)

關鍵點回顧


1. 確定目標:明確任務和數據

  • 任務類型
    確定你要解決的問題類型,例如:
    • 文本分類(如情感分析)
    • 圖像分類(如識別貓狗)
    • 序列生成(如文本生成或機器翻譯)
  • 數據集
    收集或準備與任務相關的數據集,并進行初步分析:
    • 數據規模(樣本數量、類別分布)
    • 數據質量(是否有噪聲、缺失值、標簽錯誤)
    • 數據預處理需求(如文本清洗、圖像歸一化)

2. 選擇預訓練模型

  • 預訓練模型
    根據任務選擇合適的預訓練模型:
    • 文本任務:BERT、RoBERTa、GPT、T5
    • 圖像任務:ResNet、EfficientNet、ViT
    • 多模態任務:CLIP、Mixture of Experts(MoE)
  • 模型來源
    常用的模型庫包括:
    • Hugging Face(如transformers庫)
    • PyTorch/TensorFlow官方模型庫
    • Timm庫(針對計算機視覺)

3. 數據預處理

(1) 數據清洗與格式化
  • 文本數據
    • 去除特殊字符、停用詞
    • 統一大小寫(如全小寫)
    • 處理缺失值或異常標簽
  • 圖像數據
    • 調整尺寸(如統一為224x224)
    • 歸一化(如將像素值縮放到[0,1]或[-1,1])
    • 數據增強(如旋轉、翻轉、裁剪)
(2) 劃分數據集
  • 訓練集:用于模型訓練(通常占80%)。
  • 驗證集:用于調參和監控過擬合(通常占10%)。
  • 測試集:最終評估模型性能(通常占10%)。
(3) 數據加載與批處理
  • 使用DataLoader(PyTorch)或tf.data(TensorFlow)將數據分批次加載:
     python 

    深色版本

    from torch.utils.data import DataLoader, Datasetclass MyDataset(Dataset):def __init__(self, data, labels):self.data = dataself.labels = labelsdef __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx], self.labels[idx]train_dataset = MyDataset(train_data, train_labels)
    train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

4. 構建微調模型架構

(1) 加載預訓練模型
  • 文本模型示例(Hugging Face)
     python 

    深色版本

    from transformers import BertModel, BertConfigmodel = BertModel.from_pretrained("bert-base-uncased")
  • 圖像模型示例(PyTorch)
     python 

    深色版本

    import torchvision.models as modelsmodel = models.resnet18(pretrained=True)
(2) 修改模型尾部(適配任務)
  • 分類任務:替換最后一層全連接層(全連接層的輸出維度需匹配任務類別數):
     python 

    深色版本

    # 對于ResNet:
    num_features = model.fc.in_features
    model.fc = nn.Linear(num_features, num_classes)  # num_classes是目標類別數# 對于BERT:
    model.classifier = nn.Linear(model.config.hidden_size, num_classes)
(3) 凍結部分層(可選)
  • 凍結預訓練層:保留底層的通用特征提取能力,只訓練新增層:
     python 

    深色版本

    for param in model.parameters():param.requires_grad = False  # 凍結所有層# 解凍最后一層(如分類層)
    for param in model.fc.parameters():  # 對BERT可能是model.classifier.parameters()param.requires_grad = True

5. 設置訓練參數

(1) 優化器與學習率
  • 選擇優化器
    • 常用優化器:Adam、AdamW、SGD
    • 示例:
       python 

      深色版本

      optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)
  • 學習率(Learning Rate)
    • 預訓練模型微調時,學習率通常比從頭訓練低(如1e-5到1e-3)。
    • 可使用學習率調度器(如torch.optim.lr_scheduler.CosineAnnealingLR)。
(2) 損失函數
  • 根據任務選擇損失函數:
    • 分類任務:交叉熵損失(nn.CrossEntropyLoss
    • 回歸任務:均方誤差(nn.MSELoss
    • 生成任務:交叉熵或自定義損失(如BERT的MLM損失)
(3) 其他超參數
  • 批量大小(Batch Size):根據硬件限制選擇(如32、64、128)。
  • 訓練輪次(Epochs):通常5-20輪,根據驗證集表現調整。
  • 早停(Early Stopping):當驗證損失不再下降時停止訓練,防止過擬合。

6. 訓練模型

(1) 定義訓練循環
 

python

深色版本

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)for epoch in range(num_epochs):model.train()total_loss = 0for batch in train_loader:inputs, labels = batchinputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item()# 驗證階段model.eval()val_loss = 0with torch.no_grad():for batch in val_loader:inputs, labels = batchinputs, labels = inputs.to(device), labels.to(device)outputs = model(inputs)val_loss += criterion(outputs, labels).item()print(f"Epoch {epoch+1}, Train Loss: {total_loss/len(train_loader)}, Val Loss: {val_loss/len(val_loader)}")
(2) 監控訓練過程
  • 使用工具如TensorBoardWeights & Biases記錄損失、準確率等指標。
  • 定期保存模型檢查點(Checkpoint):
     python 

    深色版本

    torch.save(model.state_dict(), f"model_epoch{epoch}.pth")

7. 調整超參數(可選)

  • 網格搜索(Grid Search)或隨機搜索(Random Search)
    調整學習率、批量大小、層凍結策略等。
  • 自動化工具
    使用OptunaRay Tune進行超參數優化。

8. 評估與部署

(1) 模型評估
  • 在測試集上評估最終性能:
     python 

    深色版本

    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()print(f"Test Accuracy: {100. * correct / len(test_loader.dataset)}%")
(2) 部署模型
  • 導出模型為ONNX格式或使用框架工具(如TorchScript):
     python 

    深色版本

    torch.onnx.export(model, torch.randn(1, 3, 224, 224), "model.onnx")

9. 常見問題與解決方案

(1) 過擬合
  • 解決方法
    • 增加數據增強(如隨機裁剪、翻轉)。
    • 添加正則化(如Dropout、L2正則化)。
    • 減少模型復雜度或訓練輪次。
(2) 欠擬合
  • 解決方法
    • 增加訓練輪次或學習率。
    • 解凍更多層(釋放模型潛力)。
    • 嘗試更復雜的模型架構。
(3) 計算資源不足
  • 解決方法
    • 使用小批量(如batch_size=16)。
    • 使用模型量化或知識蒸餾(Knowledge Distillation)。
    • 選擇輕量級模型(如MobileNet、DistilBERT)。

10. 總結:微調的流程圖

 

深色版本

1. 確定任務和數據 →  
2. 選擇預訓練模型 →  
3. 數據預處理 →  
4. 修改模型尾部 →  
5. 設置超參數 →  
6. 訓練并監控 →  
7. 調參優化 →  
8. 評估與部署

附錄:代碼示例(文本分類)

以下是一個完整的微調BERT進行文本分類的代碼框架:

 

python

深色版本

import torch
from transformers import BertTokenizer, BertForSequenceClassification
from torch.utils.data import Dataset, DataLoader# 加載預訓練模型和分詞器
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_classes)# 數據預處理
class TextDataset(Dataset):def __init__(self, texts, labels):self.encodings = tokenizer(texts, truncation=True, padding=True, max_length=512)self.labels = labelsdef __len__(self):return len(self.labels)def __getitem__(self, idx):item = {k: torch.tensor(v[idx]) for k, v in self.encodings.items()}item["labels"] = torch.tensor(self.labels[idx])return item# 加載數據
train_dataset = TextDataset(train_texts, train_labels)
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)# 訓練配置
device = torch.device("cuda")
model.to(device)
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)
criterion = nn.CrossEntropyLoss()# 訓練循環(參考步驟6)

關鍵點回顧

  • 微調的核心:利用預訓練模型的通用特征,僅針對特定任務調整部分參數。
  • 數據質量:垃圾進,垃圾出(Garbage In, Garbage Out)。
  • 超參數調優:學習率、批量大小、層凍結策略是關鍵。

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

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

相關文章

計算機視覺——深入理解卷積神經網絡與使用卷積神經網絡創建圖像分類算法

引言 卷積神經網絡(Convolutional Neural Networks,簡稱 CNNs)是一種深度學習架構,專門用于處理具有網格結構的數據,如圖像、視頻等。它們在計算機視覺領域取得了巨大成功,成為圖像分類、目標檢測、圖像分…

[C++面試] 關于deque

一、入門 1、deque與vector的區別 deque的迭代器包含以下信息: 當前緩沖區指針(current_buffer)當前元素在緩沖區內的位置(current)中控器的位置(map) 每次移動迭代器時,需檢查是…

服務性能防腐體系:基于自動化壓測的熔斷機制

01# 背景 在系統架構的演進過程中,項目初始階段都會通過壓力測試構建安全護城河,此時的服務性能與資源水位保持著黃金比例關系。然而在業務高速發展時期,每個沖刺周期都被切割成以業務需求為單位的開發單元,壓力測試逐漸從必選項…

SpringBoot 和vue前后端配合開發網頁拼圖10關游戲源碼技術分享

今天分享一個 前后端結合 的網頁游戲 開發項目源碼技術。 這也是我第一次寫游戲類的程序,雖然不是特別復雜的游戲,但是是第一次寫,肯定要記錄一下了,哈哈。 游戲的內容 就是 我們顯示中玩的那個 拼圖碎片的 游戲,類似下…

【k8s002】k8s健康檢查與故障診斷

k8s健康檢查與故障診斷 ?一、集群狀態檢查? ?檢查節點健康狀態? kubectl get nodes -o wide # 查看節點狀態及基本信息 kubectl describe node <node-name> # 分析節點詳細事件&#xff08;如資源不足、網絡異常&#xff09; kubectl top nodes …

01-Canvas-使用fabric初始

fabric官網&#xff1a; https://fabric5.fabricjs.com/demos/ 創建畫布并繪制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

【機器學習-基礎知識】統計和貝葉斯推斷

1. 概率論基本概念回顧 1. 概率分布 定義: 概率分布(Probability Distribution)指的是隨機變量所有可能取值及其對應概率的集合。它描述了一個隨機變量可能取的所有值以及每個值被取到的概率。 對于離散型隨機變量,使用概率質量函數來描述。對于連續型隨機變量,使用概率…

常見限流算法及實現

1. 固定窗口計數器&#xff08;Fixed Window Counter&#xff09; 原理&#xff1a;在固定時間窗口&#xff08;如1分鐘&#xff09;內統計請求數&#xff0c;超過閾值則拒絕后續請求。優點&#xff1a;實現簡單&#xff0c;內存占用低。缺點&#xff1a;存在窗口切換時的流量…

《TCP/IP網絡編程》學習筆記 | Chapter 18:多線程服務器端的實現

《TCP/IP網絡編程》學習筆記 | Chapter 18&#xff1a;多線程服務器端的實現 《TCP/IP網絡編程》學習筆記 | Chapter 18&#xff1a;多線程服務器端的實現線程的概念引入線程的背景線程與進程的區別 線程創建與運行pthread_createpthread_join可在臨界區內調用的函數工作&#…

創新實踐分享:基于邊緣智能+扣子的智能取物機器人解決方案

在 2024 年全國大學生物聯網設計競賽中&#xff0c;火山引擎作為支持企業&#xff0c;不僅參與了賽道的命題設計&#xff0c;還為參賽隊伍提供了相關的硬件和軟件支持。以邊緣智能和扣子的聯合應用為核心&#xff0c;參賽者們在這場競賽中展現出了卓越的創新性和實用性&#xf…

QT:動態屬性和對象樹

動態對象 1.添加Q_PROPERTY對象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…

MobileNet家族:從v1到v4的架構演進與發展歷程

MobileNet 是一個專為移動設備和嵌入式系統設計的輕量化卷積神經網絡&#xff08;CNN&#xff09;家族&#xff0c;旨在在資源受限的環境中實現高效的圖像分類、對象檢測和語義分割等任務。自 2017 年首次推出以來&#xff0c;MobileNet 經歷了從 v1 到 v4 的多次迭代&#xff…

在 Windows 上使用 choco 安裝 mkcert 并配置 Vue 運行HTTPS

解決在Windows上使用Vue本地運行HTTPS的問題,vue-cli或vite都可以使用 步驟 1&#xff1a;確認 Chocolatey 是否已安裝 1. 檢查 choco 命令是否可用 打開 PowerShell&#xff08;管理員權限&#xff09;&#xff0c;輸入&#xff1a; choco -v如果顯示版本號&#xff08;如…

【PHP】新版本特性記錄(持續更新)

文章目錄 前言PHP 7.01&#xff09;NULL合并運算符&#xff1a;??2&#xff09;參數、返回值支持類型聲明3&#xff09;太空船操作符&#xff1a;<>4&#xff09;通過 define 定義常量數組5&#xff09;匿名類實例化6&#xff09;字符串里使用\u轉義unicode codepoint …

【記】如何理解kotlin中的委托屬性?

1. 什么是委托屬性&#xff1f; 委托屬性的核心思想是&#xff1a; 你可以將一個屬性的 getter 和 setter 的邏輯交給一個外部對象&#xff08;稱為委托對象&#xff09;來處理。這個外部對象負責存儲屬性的值&#xff0c;并提供自定義的 get 和 set 行為。 通過委托屬性&am…

使用自動導入后,eslint報錯 eslint9

前提&#xff1a;使用pnpm create vuelatest創建vue應用&#xff0c;并且在創建項目時就勾選eslint和prettier&#xff0c;不然有些配置還需要手動配&#xff0c;比如解決eslint和prettier的沖突問題 1. 解決使用自動導入后Eslint報錯問題 配置vite.config.ts // 自動導入api…

springboot EasyExcel 實現導入導出

1. 添加依賴 確保 Maven 依賴中包含 EasyExcel 3.0.5&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…

實現懸浮按鈕拖動,兼容h5和微信小程序

h5用js寫&#xff0c;微信小程序用 代碼里面沒有完全實現吸附邊緣的功能&#xff0c;需要吸附邊緣的話還得自己再完善下&#xff08;h5的吸附邊緣是可以的&#xff0c;小程序的還有點問題&#xff09; 主要功能是&#xff1a;圖片上寫文字的懸浮按鈕&#xff0c;文字使用的是…

2、操作系統之軟件基礎

一、硬件支持系統 &#xff0c;系統管理硬件 操作系統核心功能可以分為&#xff1a; 守護者&#xff1a;對硬件和軟件資源的管理協調者&#xff1a;通過機制&#xff0c;將各種各樣的硬件資源適配給軟件使用。 所以為了更好的管理硬件&#xff0c;操作系統引進了軟件。其中3大…

17 | 實現簡潔架構的 Biz 層

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…