Dropout#
Dropout は,ニューラルネットワークの過学習を防ぐために用いられる正則化手法の一つである.具体的に,順伝播の際に得られる \(d\) 次元の特定の隠れ層の出力 \(\boldsymbol{h} \in \mathbb{R}^d\) に対して,Dropoutは特定の確率 \(p\) でニューロン(特定の次元)の出力を0とする.\(i\)番目のニューロンについて式で書くと,
\[\begin{split}
h_i^{\prime}= \begin{cases}0 & \text { with probability } p \\ \frac{h_i}{1-p} & \text { otherwise }\end{cases}
\end{split}\]
となる.推論時はDropoutを適用しないので,学習時と出力のスケールを一致させるために,\(1/1-p\)倍している.これによってテスト時の出力が学習時の期待値と一致 \(\mathbb{E}[\boldsymbol{h}']=\boldsymbol{h}\) する.
PyTorchは次のようにDropoutを利用できる.
import torch
import torch.nn as nn
dropout = nn.Dropout(p=0.5)
x = torch.arange(10, dtype=torch.float)
h = dropout(x)
print('x:', x)
print('h:', h)
x: tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
h: tensor([ 0., 0., 4., 0., 8., 10., 12., 14., 16., 18.])
一般的に,畳み込みニューラルネットワークでは畳み込みによる特徴抽出が終わって線形層でのロジットへの変換が行われる際に,Dropoutを適用することが多い.ViTではMLPブロックやAttentionへの正則化のために利用される.