Spaces:
Sleeping
Sleeping
File size: 6,443 Bytes
fbacfd8 fa3056f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
---
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=死亡)
範例:
```csv
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 庫開發。 |