Bert_two / README.md
smartTranscend's picture
Update README.md
fbacfd8 verified

A newer version of the Gradio SDK is available: 6.1.0

Upgrade
metadata
title: BERT 二次微調平台
emoji: 🥼
colorFrom: blue
colorTo: green
sdk: gradio
sdk_version: 4.44.0
app_file: app.py
pinned: false

🥼 BERT 乳癌存活預測 - 二次微調完整平台

完整的 BERT 二次微調系統,支援從第一次微調到二次微調的完整流程,並可在新數據上比較多個模型的表現。

🌟 核心功能

1️⃣ 第一次微調

  • 從純 BERT 開始訓練
  • 支援三種微調方法:
    • Full Fine-tuning: 訓練所有參數
    • LoRA: 低秩適配,參數高效
    • AdaLoRA: 自適應 LoRA,動態調整秩
  • 自動比較純 BERT vs 第一次微調的表現

2️⃣ 二次微調

  • 基於第一次微調模型繼續訓練
  • 使用新的訓練數據
  • 自動繼承第一次的微調方法
  • 適合增量學習和領域適應

3️⃣ 新數據測試

  • 上傳新測試數據
  • 同時比較最多 3 個模型:
    • 純 BERT (Baseline)
    • 第一次微調模型
    • 第二次微調模型
  • 並排顯示所有評估指標

4️⃣ 模型預測

  • 選擇任一已訓練模型
  • 輸入病歷文本進行預測
  • 同時顯示未微調和微調模型的預測結果

📋 資料格式

CSV 檔案必須包含以下欄位:

  • Text: 病歷文本 (英文)
  • label: 標籤 (0=存活, 1=死亡)

範例:

Text,label
"Patient is a 45-year-old female with stage II breast cancer...",0
"65-year-old woman diagnosed with triple-negative breast cancer...",1

🚀 使用流程

步驟 1: 第一次微調

  1. 進入「1️⃣ 第一次微調」頁面
  2. 上傳訓練數據 A (CSV)
  3. 選擇微調方法 (建議先用 Full Fine-tuning)
  4. 調整訓練參數:
    • 權重倍數: 0.8 (處理不平衡數據)
    • 訓練輪數: 8-10
    • 學習率: 2e-5
  5. 點擊「開始第一次微調」
  6. 等待訓練完成,查看結果

步驟 2: 二次微調

  1. 進入「2️⃣ 二次微調」頁面
  2. 點擊「🔄 重新整理模型列表」
  3. 選擇第一次微調的模型
  4. 上傳新的訓練數據 B
  5. 調整訓練參數 (建議):
    • 訓練輪數: 3-5 (比第一次少)
    • 學習率: 1e-5 (比第一次小)
  6. 點擊「開始二次微調」
  7. 等待訓練完成

步驟 3: 新數據測試

  1. 進入「3️⃣ 新數據測試」頁面
  2. 上傳測試數據 C
  3. 選擇要比較的模型:
    • 純 BERT: 選擇「評估純 BERT」
    • 第一次微調: 從下拉選單選擇
    • 第二次微調: 從下拉選單選擇
  4. 點擊「開始測試」
  5. 查看三個模型的比較結果

步驟 4: 預測

  1. 進入「4️⃣ 模型預測」頁面
  2. 選擇要使用的模型
  3. 輸入病歷文本
  4. 點擊「開始預測」
  5. 查看預測結果

🎯 微調方法比較

方法 參數量 訓練速度 記憶體使用 效果
Full Fine-tuning 100% 1x (基準) 最佳
LoRA ~1% 3-5x 快 良好
AdaLoRA ~1% 3-5x 快 良好

💡 二次微調最佳實踐

何時使用二次微調?

  1. 領域適應

    • 第一次: 使用通用醫療數據
    • 第二次: 使用特定醫院/科別數據
  2. 增量學習

    • 第一次: 使用歷史數據
    • 第二次: 加入新收集的數據
  3. 數據稀缺

    • 第一次: 使用大量相關領域數據
    • 第二次: 使用少量目標領域數據

參數調整建議

參數 第一次微調 第二次微調 原因
Epochs 8-10 3-5 避免過度擬合
Learning Rate 2e-5 1e-5 保護已學習知識
Warmup Steps 200 100 較少的預熱
權重倍數 根據數據調整 根據新數據調整 處理不平衡

注意事項

⚠️ 重要提醒:

  • 第二次微調會自動使用第一次的微調方法,無法更換
  • 建議第二次的學習率比第一次小,避免「災難性遺忘」
  • 如果第二次數據與第一次差異很大,可能需要更多輪數
  • 始終在新數據上測試,確保沒有性能下降

📊 評估指標說明

指標 說明 適用場景
F1 Score 精確率和召回率的調和平均 平衡評估,通用指標
Accuracy 整體準確率 數據平衡時使用
Precision 預測為死亡中的準確率 避免誤報時優化
Recall 實際死亡中被識別的比例 避免漏診時優化
Sensitivity 等同於 Recall 醫療場景常用
Specificity 實際存活中被識別的比例 避免過度治療
AUC ROC 曲線下面積 整體分類能力

🔧 技術細節

訓練流程

  1. 數據準備

    • 載入 CSV
    • 保持原始類別比例
    • Tokenization (max_length=256)
    • 80/20 訓練/驗證分割
  2. 模型初始化

    • 第一次: 從 bert-base-uncased 載入
    • 第二次: 從第一次微調模型載入
    • 應用 PEFT 配置 (如果使用 LoRA/AdaLoRA)
  3. 訓練

    • 使用類別權重處理不平衡
    • Early stopping (基於驗證集)
    • 保存最佳模型
  4. 評估

    • 在驗證集上評估
    • 計算所有指標
    • 生成混淆矩陣

模型儲存

  • 模型檔案: ./breast_cancer_bert_{method}_{type}_{timestamp}/
  • 模型清單: ./saved_models_list.json
  • 包含所有訓練資訊和超參數

🐛 常見問題

Q1: 為什麼二次微調不能更換方法?

A: 因為不同方法的參數結構不同。例如 LoRA 添加了低秩矩陣,如果切換到 Full Fine-tuning,這些參數會遺失。

Q2: 第二次微調的數據量應該多少?

A: 建議至少 100 筆,但可以比第一次少。如果數據太少,可能會過度擬合。

Q3: 如何選擇最佳化指標?

A:

  • 醫療場景通常優先 Recall (避免漏診)
  • 如果誤報代價高,選 Precision
  • 平衡場景選 F1 Score

Q4: GPU 記憶體不足怎麼辦?

A:

  • 使用 LoRA 或 AdaLoRA (減少 90% 記憶體)
  • 減小 batch size
  • 減少 max_length

Q5: 訓練時間太長?

A:

  • 使用 LoRA/AdaLoRA (快 3-5 倍)
  • 減少 epochs
  • 增加 batch size (如果記憶體允許)

📝 版本資訊

  • Version: 1.0.0
  • Python: 3.10+
  • 主要依賴:
    • transformers 4.36.0
    • torch 2.1.0
    • peft 0.7.1
    • gradio 4.44.0

📄 授權

本專案完全保留您的原始程式邏輯,僅新增二次微調和測試功能。

🙏 致謝

基於 BERT 模型和 Hugging Face Transformers 庫開發。