LLM 課程文件
理解學習曲線
並獲得增強的文件體驗
開始使用
理解學習曲線
現在您已經學會了如何使用 Trainer
API 和自定義訓練迴圈來實現微調,理解如何解釋結果至關重要。學習曲線是寶貴的工具,可以幫助您在訓練期間評估模型效能,並在潛在問題導致效能下降之前識別它們。
在本節中,我們將探討如何閱讀和解釋準確度曲線和損失曲線,理解不同曲線形狀告訴我們模型行為的含義,並學習如何解決常見的訓練問題。
什麼是學習曲線?
學習曲線是模型在訓練過程中效能指標隨時間變化的視覺表示。需要監控的兩個最重要曲線是:
- 損失曲線:顯示模型誤差(損失)如何隨訓練步驟或時期變化
- 準確度曲線:顯示在訓練步驟或時期中正確預測的百分比
這些曲線幫助我們瞭解模型是否有效學習,並指導我們進行調整以提高效能。在 Transformers 中,這些指標是為每個批次單獨計算的,然後記錄到磁碟。然後,我們可以使用 Weights & Biases 等庫來視覺化這些曲線並跟蹤模型的效能。
損失曲線
損失曲線顯示模型誤差如何隨時間下降。在一次典型的成功訓練執行中,您會看到一條類似於下圖的曲線:
- 初始損失高:模型開始時未最佳化,因此預測最初較差
- 損失遞減:隨著訓練的進行,損失通常會下降
- 收斂:最終,損失穩定在低值,表明模型已學習到資料中的模式
與前幾章一樣,我們可以使用 Trainer
API 來跟蹤這些指標並在儀表板中視覺化它們。下面是如何使用 Weights & Biases 執行此操作的示例。
# Example of tracking loss during training with the Trainer
from transformers import Trainer, TrainingArguments
import wandb
# Initialize Weights & Biases for experiment tracking
wandb.init(project="transformer-fine-tuning", name="bert-mrpc-analysis")
training_args = TrainingArguments(
output_dir="./results",
eval_strategy="steps",
eval_steps=50,
save_steps=100,
logging_steps=10, # Log metrics every 10 steps
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
report_to="wandb", # Send logs to Weights & Biases
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
processing_class=tokenizer,
compute_metrics=compute_metrics,
)
# Train and automatically log metrics
trainer.train()
準確度曲線
準確度曲線顯示正確預測的百分比隨時間變化。與損失曲線不同,準確度曲線通常會隨著模型學習而增加,並且通常可以包含比損失曲線更多的步驟。
- 初始值低:初始準確度應較低,因為模型尚未學習資料中的模式
- 隨訓練增加:如果模型能夠學習資料中的模式,準確度通常會隨著模型學習而提高
- 可能出現平臺期:準確度通常以離散跳躍而非平滑的方式增加,因為模型會做出接近真實標籤的預測
💡 為什麼準確度曲線是“階梯狀”的:與連續的損失不同,準確度是透過將離散預測與真實標籤進行比較來計算的。模型信心的微小改進可能不會改變最終預測,導致準確度保持平坦,直到超過某個閾值。
收斂
當模型效能穩定,損失和準確度曲線趨於平穩時,就發生了收斂。這表明模型已經學習了資料中的模式並已準備好使用。簡單來說,我們的目標是讓模型在每次訓練時都能收斂到穩定的效能。
一旦模型收斂,我們就可以使用它們對新資料進行預測,並參考評估指標來了解模型的表現。
解釋學習曲線模式
不同的曲線形狀揭示了模型訓練的不同方面。讓我們檢查最常見的模式及其含義。
健康的學習曲線
一個良好的訓練執行通常會顯示類似於下圖的曲線形狀
讓我們看看上面的插圖。它顯示了損失曲線(左側)和相應的準確度曲線(右側)。這些曲線具有獨特的特徵。
損失曲線顯示模型損失隨時間變化的值。最初,損失很高,然後逐漸降低,表明模型正在改進。損失值的降低表明模型正在做出更好的預測,因為損失代表預測輸出和真實輸出之間的誤差。
現在讓我們將注意力轉向準確度曲線。它代表模型隨時間變化的準確度。準確度曲線從低值開始,並隨著訓練的進行而增加。準確度衡量正確分類例項的比例。因此,隨著準確度曲線的上升,它表明模型正在做出更多正確的預測。
曲線之間一個顯著的區別是準確度曲線的平滑度和“平臺期”的存在。雖然損失平滑下降,但準確度曲線上的平臺期表示準確度的離散跳躍而不是連續增加。這種行為歸因於準確度的測量方式。即使最終預測仍然不正確,如果模型的輸出更接近目標,損失也會改善。然而,準確度只有當預測跨越閾值變為正確時才會提高。
例如,在區分貓(0)和狗(1)的二元分類器中,如果模型對狗的影像(真實值1)預測為0.3,則四捨五入為0,這是不正確的分類。如果在下一步中預測為0.4,它仍然不正確。損失會減少,因為0.4比0.3更接近1,但準確度保持不變,從而形成平臺期。只有當模型預測的值大於0.5並四捨五入為1時,準確度才會跳升。
健康曲線的特徵
- 損失平穩下降:訓練損失和驗證損失都穩步下降
- 訓練/驗證效能接近:訓練和驗證指標之間差距小
- 收斂:曲線趨於平穩,表明模型已學習到模式
實際案例
讓我們透過一些學習曲線的實際例子。首先,我們將強調一些在訓練期間監控學習曲線的方法。下面,我們將分解學習曲線中可以觀察到的不同模式。
訓練期間
在訓練過程中(執行 trainer.train()
後),您可以監控這些關鍵指標
- 損失收斂:損失是否仍在下降,或者是否已趨於平穩?
- 過擬合跡象:驗證損失是否開始增加,而訓練損失下降?
- 學習率:曲線是否過於不穩定(學習率過高)或過於平坦(學習率過低)?
- 穩定性:是否存在表明問題的突然峰值或下降?
訓練後
訓練過程完成後,您可以分析完整的曲線以瞭解模型的效能。
- 最終效能:模型是否達到了可接受的效能水平?
- 效率:是否可以透過更少的時期達到相同的效能?
- 泛化能力:訓練和驗證效能有多接近?
- 趨勢:額外的訓練是否可能提高效能?
🔍 W&B 儀表板功能:Weights & Biases 會自動建立美觀、互動式的學習曲線圖。您可以
- 並排比較多個執行
- 新增自定義指標和視覺化
- 設定異常行為警報
- 與您的團隊分享結果
在 Weights & Biases 文件中瞭解更多資訊。
過擬合
過擬合發生在模型從訓練資料中學習過多,導致無法泛化到不同資料(由驗證集表示)的情況。
症狀
- 訓練損失持續下降,而驗證損失增加或趨於平穩
- 訓練準確度和驗證準確度之間存在較大差距
- 訓練準確度遠高於驗證準確度
過擬合的解決方案
- 正則化:新增 Dropout、權重衰減或其他正則化技術
- 早停:當驗證效能停止改進時停止訓練
- 資料增強:增加訓練資料多樣性
- 降低模型複雜度:使用較小的模型或較少的引數
在下面的示例中,我們使用早停來防止過擬合。我們將 early_stopping_patience
設定為 3,這意味著如果驗證損失連續 3 個時期沒有改善,訓練將停止。
# Example of detecting overfitting with early stopping
from transformers import EarlyStoppingCallback
training_args = TrainingArguments(
output_dir="./results",
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=100,
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
greater_is_better=False,
num_train_epochs=10, # Set high, but we'll stop early
)
# Add early stopping to prevent overfitting
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
processing_class=tokenizer,
compute_metrics=compute_metrics,
callbacks=[EarlyStoppingCallback(early_stopping_patience=3)],
)
2. 欠擬合
當模型過於簡單而無法捕捉資料中的潛在模式時,就會發生欠擬合。這可能由以下幾個原因造成:
- 模型過小或缺乏學習模式的能力
- 學習率過低,導致學習緩慢
- 資料集過小或不具代表性
- 模型未正確正則化
症狀
- 訓練和驗證損失均保持較高水平
- 模型效能在訓練早期就趨於平穩
- 訓練準確度低於預期
欠擬合的解決方案
- 增加模型容量:使用更大的模型或更多引數
- 延長訓練時間:增加時期數
- 調整學習率:嘗試不同的學習率
- 檢查資料質量:確保資料已正確預處理
在下面的示例中,我們增加了訓練時期數,以檢視模型是否可以學習資料中的模式。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
-num_train_epochs=5,
+num_train_epochs=10,
)
3. 不穩定的學習曲線
當模型學習效率不高時,就會出現不穩定的學習曲線。這可能由以下幾個原因造成:
- 學習率過高,導致模型錯過最佳引數
- 批處理大小過小,導致模型學習緩慢
- 模型未正確正則化,導致過擬合訓練資料
- 資料集未正確預處理,導致模型從噪聲中學習
症狀
- 損失或準確度頻繁波動
- 曲線顯示出高方差或不穩定性
- 效能波動,沒有明確的趨勢
訓練和驗證曲線都顯示出不穩定行為。
不穩定曲線的解決方案
- 降低學習率:減小步長以實現更穩定的訓練
- 增加批次大小:更大的批次提供更穩定的梯度
- 梯度裁剪:防止梯度爆炸
- 更好的資料預處理:確保一致的資料質量
在下面的示例中,我們降低了學習率並增加了批處理大小。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
-learning_rate=1e-5,
+learning_rate=1e-4,
-per_device_train_batch_size=16,
+per_device_train_batch_size=32,
)
關鍵要點
理解學習曲線對於成為一名有效的機器學習實踐者至關重要。這些視覺化工具提供了關於模型訓練進度的即時反饋,並幫助您就是否停止訓練、調整超引數或嘗試不同方法做出明智的決定。透過練習,您將對健康的學習曲線是什麼樣子以及如何在出現問題時解決問題有一個直觀的理解。
💡 關鍵要點:
- 學習曲線是理解模型訓練進度的重要工具
- 監控損失曲線和準確度曲線,但請記住它們具有不同的特徵
- 過擬合表現為訓練/驗證效能分歧
- 欠擬合表現為訓練和驗證資料效能均不佳
- Weights & Biases 等工具可以輕鬆跟蹤和分析學習曲線
- 早停和適當的正則化可以解決大多數常見的訓練問題
🔬 後續步驟:在您自己的微調實驗中練習分析學習曲線。嘗試不同的超引數並觀察它們如何影響曲線形狀。這種動手實踐是培養閱讀訓練進度直覺的最佳方式。
章節測驗
測試您對學習曲線和訓練分析的理解