Bert_two / README.md
smartTranscend's picture
Update README.md
fbacfd8 verified
---
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 庫開發。