Spaces:
Sleeping
Sleeping
| 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 庫開發。 |