AIToday
AIコーディングQiita 機械学習掲載日時: 2026年11月13日 16:00

PyTorch、evalなしはDropout残存

LINEで送る
PyTorch、evalなしはDropout残存

3つのポイント

  1. 何が起きたか

    PyTorch 2.12.0でLinear層とDropout(p=0.5)を使い4通りを検証したところ、inference_mode()のみでeval()なしの行は0.0と2.0を両方出力した。

  2. なぜ重要か

    勾配を無効にする設定だけでは出力に学習時のランダム性が残るため、requires_gradの確認だけでは設定ミスを見逃す。

わからないところ、AIに聞けます

質問と回答はこのページに公開されます。

こういう要約が、毎朝あなたのメールに届きます。

背景と解説

検証は意図的に組まれていた。入力はすべて1、Linearの重みは単位行列で、非線形性はp=0.5のDropoutだけだった。これにより出力値はDropoutが有効だったかどうかを直接示す。学習時の行では出力に0.0と2.0が含まれ、評価時の行では一貫して1.0だった。

2つの別個のスイッチが区別されている。eval()はtrain(False)を呼び、子モジュールにtraining=Falseを再帰的に設定する。Dropoutはこのフラグを読む。inference_mode()はautogradの記録を対象にしており、PyTorchの同じドキュメントには、モデルを自動的に評価モードにしない旨の注意書きがある。スイッチが独立しているため、requires_gradだけを確認するテストはDropoutが動作したままでも通ってしまう。

推奨される実践は、まず評価モードを設定し、勾配記録を無効にし、評価時に挙動が変わる層を出力テストに含め、モデルやラッパーを更新した際に再実行することだ。

よくある質問
eval()とinference_mode()の違いは何か?
eval()はモデルの学習フラグを再帰的にFalseにし、Dropoutを止める。inference_mode()はautogradの記録オーバーヘッドを減らすが、学習フラグは変更しない。
Dropoutは学習時と評価時で何をするのか?
学習時は確率0.5で要素をゼロにし、残りを1/(1-0.5)倍するため、この検証では0.0と2.0が現れた。評価時は入力をそのまま通すため1.0のままになる。
Qiita 機械学習元記事を読む
LINEで送る

あなたの仕事に関係するAIニュースを、毎朝お届けします。

業界と使っているAIツールを選ぶと、仕事に関係するニュースが毎朝届きます。

登録無料・Googleアカウントなら30秒・いつでも解除できますAITodayについて →

AIに質問

この記事についてわからないことをAIに質問できます。AIはこの記事・AIToday の過去記事・Wikipedia を読み、出典を付けて答えます。Q&Aはこのページに公開され、他の読者も読めます。

質問と回答はこのページに公開されます。

このようなAIの動きを、御社の業界・競合に合わせて毎日届ける法人プランもあります → 詳しく見る

関連記事

次の記事へAI同士の敵対的レビューは信頼できず