A.8 学習が止まったときのレスキュー


詰まったら、「自分には無理」ではなく「どこで失敗しているかを探せる」に変えます。
まず問題を分類する
| 症状 | ありそうな問題 | 最初の動き |
|---|---|---|
ModuleNotFoundError | 環境違い、または依存関係不足 | Python と pip の場所を確認 |
| ファイルが見つからない | 作業ディレクトリや相対パスの問題 | Path.cwd() を出力 |
| コードは動くが結果が変 | 入力、ラベル、評価指標の問題 | サンプルと中間値を出力 |
| 学習が改善しない | データ、loss、学習率、ラベル形式の問題 | 小さなデータに過学習できるか試す |
| GPU メモリ不足 | batch、入力、モデルが大きすぎる | まず batch size を下げる |
| プロジェクトが大きすぎる | 最小閉ループがない | 1 入力、1 処理、1 出力にする |
まず実行する確認
python --version
which python
pip --version
pip list
pwd
ls
NVIDIA GPU を使う場合:
nvidia-smi
パス問題はこう確認します。
from pathlib import Path
print(Path.cwd())
print(Path("data").exists())
期待される出力:
現在のフォルダは環境によって変わりますが、形は次のようになります。
/your/current/project
False
この順番でデバッグする
- 最初の 2 件の入力とラベルを出す。
- shape、長さ、値の範囲を出す。
- モデルに入る前の中間結果を 1 つ出す。
- 評価指標を計算する前のモデル出力を 1 つ出す。
- モデルやパラメータを変えるのは最後にする。
最小確認例:
texts = ["refund request", "invoice copy", "shipping delay"]
labels = ["support", "billing", "support"]
print("samples:", len(texts))
print("first texts:", texts[:2])
print("first labels:", labels[:2])
print("label set:", sorted(set(labels)))
期待される出力:
samples: 3
first texts: ['refund request', 'invoice copy']
first labels: ['support', 'billing']
label set: ['billing', 'support']
助けを求めるときの形
やっていること:
期待した結果:
実際に起きたこと:
エラー全文の最後 20 行:
すでに試したこと:
最小再現コード:
最小再現の習慣
プロジェクトが複雑すぎるときは、まず動くところまで縮めます。
def predict(x):
return x * 2
data = [1, 2, 3]
preds = [predict(x) for x in data]
print(preds)
期待される出力:
[2, 4, 6]
そこへ実際の処理を 1 層ずつ戻します。壊れた層が、調べるべき層です。
止まるか、続けるか
| 状況 | よい行動 |
|---|---|
| 30 分ほどランダムに直している | 止まって仮説を書く |
| コピーしているコマンドの意味を説明できない | 止まって環境を確認する |
| 1-2 個の明確な仮説がある | テストを続ける |
| 次に見るべき結果がわかっている | 進める |