Spaces:
Sleeping
Sleeping
A newer version of the Gradio SDK is available:
6.1.0
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️⃣ 第一次微調」頁面
- 上傳訓練數據 A (CSV)
- 選擇微調方法 (建議先用 Full Fine-tuning)
- 調整訓練參數:
- 權重倍數: 0.8 (處理不平衡數據)
- 訓練輪數: 8-10
- 學習率: 2e-5
- 點擊「開始第一次微調」
- 等待訓練完成,查看結果
步驟 2: 二次微調
- 進入「2️⃣ 二次微調」頁面
- 點擊「🔄 重新整理模型列表」
- 選擇第一次微調的模型
- 上傳新的訓練數據 B
- 調整訓練參數 (建議):
- 訓練輪數: 3-5 (比第一次少)
- 學習率: 1e-5 (比第一次小)
- 點擊「開始二次微調」
- 等待訓練完成
步驟 3: 新數據測試
- 進入「3️⃣ 新數據測試」頁面
- 上傳測試數據 C
- 選擇要比較的模型:
- 純 BERT: 選擇「評估純 BERT」
- 第一次微調: 從下拉選單選擇
- 第二次微調: 從下拉選單選擇
- 點擊「開始測試」
- 查看三個模型的比較結果
步驟 4: 預測
- 進入「4️⃣ 模型預測」頁面
- 選擇要使用的模型
- 輸入病歷文本
- 點擊「開始預測」
- 查看預測結果
🎯 微調方法比較
| 方法 | 參數量 | 訓練速度 | 記憶體使用 | 效果 |
|---|---|---|---|---|
| Full Fine-tuning | 100% | 1x (基準) | 高 | 最佳 |
| LoRA | ~1% | 3-5x 快 | 低 | 良好 |
| AdaLoRA | ~1% | 3-5x 快 | 低 | 良好 |
💡 二次微調最佳實踐
何時使用二次微調?
領域適應
- 第一次: 使用通用醫療數據
- 第二次: 使用特定醫院/科別數據
增量學習
- 第一次: 使用歷史數據
- 第二次: 加入新收集的數據
數據稀缺
- 第一次: 使用大量相關領域數據
- 第二次: 使用少量目標領域數據
參數調整建議
| 參數 | 第一次微調 | 第二次微調 | 原因 |
|---|---|---|---|
| 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 曲線下面積 | 整體分類能力 |
🔧 技術細節
訓練流程
數據準備
- 載入 CSV
- 保持原始類別比例
- Tokenization (max_length=256)
- 80/20 訓練/驗證分割
模型初始化
- 第一次: 從
bert-base-uncased載入 - 第二次: 從第一次微調模型載入
- 應用 PEFT 配置 (如果使用 LoRA/AdaLoRA)
- 第一次: 從
訓練
- 使用類別權重處理不平衡
- Early stopping (基於驗證集)
- 保存最佳模型
評估
- 在驗證集上評估
- 計算所有指標
- 生成混淆矩陣
模型儲存
- 模型檔案:
./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 庫開發。