VISION / LESSON 12

覚えすぎを防ぐ

学習用だけ満点でも安心できない。DropoutとBatchNormの役割を比べよう。

図から学ぶ
覚えすぎを防ぐを表すキャラクターと学習内容のイラスト
TODAY'S GOAL

この回でつかむこと

過学習を見つけ、2つの手法の違いを言える。

ことばの窓
01 / SEE THE IDEA

覚えすぎを防ぐって何だろう?

過学習は学習用データに合わせすぎた状態です。Dropoutは学習中に一部の値をランダムに0にして、特定の経路に頼りすぎないようにします。PyTorchのpは0にする確率です。

あおい

練習問題は満点! でも初めての問題は外しちゃった。

AI先生

それが『覚えすぎ』かもしれないね。学習用と検証用を別々に見よう。

はる

Dropoutは学習中に一部の値を0にし、BatchNormは途中の値を整える。役割が違うのですね。

学習用とテスト用を比べる模式例。学習用だけ良くても不十分。テスト用との差に注目。別のデータで確かめる。
図12 学習用とテスト用を比べる模式例。学習用だけ良くても不十分。テスト用との差に注目。別のデータで確かめる。

AI先生 練習では得意でも、初めての問題ではどうか確かめようね。

図を読むと

訓練精度だけでは、未知のデータでの性能は分からない。 過学習は学習用データに合わせすぎた状態です。Dropoutは学習中に一部の値をランダムに0にして、特定の経路に頼りすぎないようにします。PyTorchのpは0にする確率です。

小さなコードで確かめるまず結果を予想しよう
import torch
from torch import nn
torch.manual_seed(3)
drop = nn.Dropout(p=0.5)
x = torch.ones(8)
print(drop(x))
drop.eval(); print(drop(x))
実行結果学習時は0を含み、評価時は元の1が並ぶ

なぜそうなる? 学習時の残った値は期待値を保つよう調整されます。評価時はDropoutを止めます。

02 / GO ONE STEP FURTHER

BatchNormは何を調整する?

Batch Normalizationはバッチの統計を使って中間の値を整えます。学習時と評価時で使う統計が異なるため、評価前にeval()へ切り替えます。

bn = nn.BatchNorm1d(2)
bn.train(); print(bn(torch.tensor([[1.,3.],[3.,5.]])).shape)
bn.eval(); print(bn(torch.tensor([[2.,4.]])).shape)
実行結果どちらも2列の出力

ここに注目 BatchNormは出力の形を変えません。Dropoutと同じ操作ではありません。

03 / YOUR TURN

予想して、理由を話そう

答えを選んで、説明を確かめよう。外れても発見が一つ増えるよ。

PyTorchのDropout(p=0.2)は?

答えを選ぶと理由が表示されます。

04 / TRY ON COLAB

Colabで試してみよう

コードの実行はColaboratoryの実行環境で行います。まずノートブックを保存し、Colabで「ファイル → ノートブックをアップロード」から開いてください。上から順に実行し、最後に値を変えてみましょう。

保存ボタンを押しても画面は切り替わりません。通常はブラウザの「ダウンロード」フォルダに .ipynb が保存されます。見つからない場合はダウンロード履歴を確認してください。Colabの実習は小さな例から始められます。

COFFEE BREAK

身近な技術とつなげてみよう

AI先生

AI先生:模擬試験の答えだけ暗記しても、初めての問題で困るよね。モデルにも同じ確認が必要なんだ。

KEY TERMS

この回の重要な用語

本文で出会った言葉を、ここで意味と一緒に振り返ろう。上の「ことばの窓」からも説明を開けるよ。

過学習
学習データには合うのに、未知のデータではうまくいかない状態です。
Dropout
学習中に一部の値をランダムに0にする手法です。
BatchNorm
Batch Normalization。中間の値をバッチ統計で整える層です。
検証用データ
学習の進み方や設定を確認するため、重み更新には使わないデータです。