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