正則化#
正則化は、モデルの過剰適合を減少させることを目的とした深層学習で使用される技術です。これは、目的関数に正則化項を追加することで、モデルの複雑さに対するペナルティを導入し、パラメータの大きさやパラメータ間の関係を制約することにより、一般化能力を向上させ、未見のデータに対するモデルの性能を向上させます。
過剰適合と不足適合#
過剰適合#
過剰適合(Overfitting)とは、モデルが訓練データに過度に適合し、訓練データでは良好な性能を示すが、新しいデータでは性能が悪くなることを指します。これは、モデルがあまりにも複雑で、訓練データの詳細やノイズに過度に注意を払い、未見のデータにうまく一般化できないためです。
不足適合#
不足適合(Underfitting)とは、モデルが訓練データにうまく適合できず、データ内の重要な特徴やパターンを捉えられず、訓練データと新しいデータの両方で性能が不十分であることを指します。
- モデルの複雑さを増加させる
- 特徴エンジニアリング(Feature Engineering)
- 訓練データの量を増加させる
- 正則化を減少させる
- より複雑なモデルを使用する
L1 正則化 (Lasso)#
L1 正則化は、モデルの損失関数に L1 ノルムペナルティ項を追加することで実現されます。L1 ノルムは、モデルの重みパラメータの絶対値の合計を指します。L1 正則化の目標は、損失関数と L1 ノルムペナルティ項の和を最小化することです。その効果は、一部の重みパラメータをゼロに圧縮することで、特徴選択とスパース性を実現します。
勾配は定数項を追加されます;各イテレーションで情報を提供しない特徴から少しずつ引き算することで、それらの重みをゼロに強制し、最終的にゼロにします。モデルに小さな係数を持たせることを奨励し、スパース性を引き起こす可能性があります。
L2 正則化 (Ridge)#
L2 正則化は、モデルの損失関数に L2 ノルムペナルティ項を追加することで実現されます。L2 ノルムは、モデルの重みパラメータの平方和の平方根を指します。L2 正則化の目標は、損失関数と L2 ノルムペナルティ項の和を最小化することです。その効果は、重みパラメータの値を小さくし、モデルの重みパラメータをより滑らかで安定させることです。
効果は weight decay に似ています。モデルに小さな係数を持たせることを奨励しますが、スパース性を引き起こすことはありません。
L1 | L2 | |
---|---|---|
効果 | よりスパースなモデルを生成できる | 計算の病的な問題を助ける |
確率先験 | パラメータはラプラス分布に従う | パラメータはガウス先験分布に従う |
ドロップアウト#
ドロップアウト正則化は、訓練中にランダムに一部のニューロンの出力をゼロにすることで実現されます。具体的には、各ニューロンが一定の確率でドロップされるため、モデルは特定のニューロンに依存できず、モデルの一般化能力を強化します。
(1)平均を取る効果: まず標準のモデル、すなわちドロップアウトがない状態に戻ります。同じ訓練データを使って 5 つの異なるニューラルネットワークを訓練すると、通常は 5 つの異なる結果が得られます。このとき、「5 つの結果の平均を取る」または「多数決の投票戦略」を使用して最終結果を決定できます。例えば、3 つのネットワークが数字 9 と判断した場合、実際の結果は数字 9 である可能性が高く、他の 2 つのネットワークは誤った結果を示しました。この「統合して平均を取る」戦略は、過剰適合の問題を効果的に防ぐことができます。異なるネットワークは異なる過剰適合を生じる可能性があり、平均を取ることで「逆の」適合が相殺される可能性があります。ドロップアウトは異なる隠れニューロンをドロップすることは、異なるネットワークを訓練することに似ており、隠れニューロンの半分をランダムに削除することでネットワーク構造が異なるため、全体のドロップアウトプロセスは多くの異なるニューラルネットワークの平均を取ることに相当します。そして、異なるネットワークが異なる過剰適合を生じ、一部の「逆の」適合が相互に相殺されることで、全体的に過剰適合を減少させることができます。
(2)ニューロン間の複雑な共適応関係を減少させる: ドロップアウトプログラムにより、2 つのニューロンが必ずしも毎回同じドロップアウトネットワークに出現するわけではありません。このように、重みの更新は固定された関係を持つ隠れノードの共同作用に依存しなくなり、特定の特徴が他の特定の特徴の下でのみ効果を持つ状況を防ぎます。ネットワークによりロバストな特徴を学習させることを強制し、これらの特徴は他のニューロンのランダムなサブセットにも存在します。言い換えれば、もし私たちのニューラルネットワークが何らかの予測を行っている場合、特定の手がかりの断片に対して過度に敏感であってはならず、特定の手がかりを失っても、他の多くの手がかりから共通の特徴を学ぶことができるべきです。この観点から見ると、ドロップアウトは L1、L2 正則化に似ており、重みを減少させることで、特定のニューロン接続の喪失に対するネットワークのロバスト性を高めます。
(3)ドロップアウトは生物進化における性別の役割に似ています:種は生存のために環境に適応しようとする傾向がありますが、環境の変化は種が迅速に反応するのを難しくします。性別の出現は、新しい環境に適応した変種を繁殖させることができ、過剰適合を効果的に防ぎ、環境が変化したときに種が直面する可能性のある絶滅を避けることができます。
- バニラドロップアウト:テスト時に出力を で乗算
- 反転ドロップアウト:(主流の方法)訓練時にデータを で乗算
import numpy as np
class Dropout:
def __init__(self, dropout_rate):
self.dropout_rate = dropout_rate
self.mask = None
def forward(self, x, is_train):
if is_train:
self.mask = np.random.binomial(1, 1 - self.dropout_rate, size=x.shape) / (1 - self.dropout_rate)
out = x * self.mask
else:
out = x
return out
def backward(self, dout):
dx = dout * self.mask
return dx
アーリーストッピング#
アーリーストッピングは、検証セットの性能に基づく戦略で、訓練中にモデルの訓練を早期に停止するために使用されます。モデルの検証セットにおける性能指標(損失関数や精度など)を監視し、一定の訓練エポック内にモデルの性能が改善されない場合、過剰適合を避けるために訓練を早期に終了します。
バッチ正規化#
バッチ正規化は、各バッチの入力を正規化することによって、ネットワークの中間層の入力が小さな分布変動を保つようにします。これは、入力データの内部共分散移動とスケーリングを減少させることで、ネットワークの訓練プロセスを加速し、勾配消失や勾配爆発を防ぐのに役立ちます。
バッチが大きく、シーケンスの長さが固定されている場合に適しています。例えば、CNN の場合です。
$\gamma$ と $\beta$ はそれぞれスケーリングファクターとオフセットです。平均を引いて分散で割ることが必ずしも最良の分布とは限らないため、データ分布を改善するために 2 つの学習可能な変数を追加します。
訓練時には移動平均を使用して平均と分散を収集し、テスト時には直接使用します。
import numpy as np
class BatchNormalization:
def __init__(self, epsilon=1e-5, momentum=0.9):
self.epsilon = epsilon
self.momentum = momentum
self.running_mean = None
self.running_var = None
self.gamma = None
self.beta = None
def forward(self, X, training=True):
N, D = X.shape
if self.running_mean is None:
self.running_mean = np.zeros(D)
if self.running_var is None:
self.running_var = np.zeros(D)
if training:
sample_mean = np.mean(X, axis=0)
sample_var = np.var(X, axis=0)
X_normalized = (X - sample_mean) / np.sqrt(sample_var + self.epsilon)
self.running_mean = self.momentum * self.running_mean + (1 - self.momentum) * sample_mean
self.running_var = self.momentum * self.running_var + (1 - self.momentum) * sample_var
self.gamma = np.ones(D)
self.beta = np.zeros(D)
else:
X_normalized = (X - self.running_mean) / np.sqrt(self.running_var + self.epsilon)
out = self.gamma * X_normalized + self.beta
return out
BN は何の問題を解決するのか?
神経ネットワークが非線形変換を行う前の活性化入力値は、ネットワークの深さが増すにつれて、その分布が徐々に偏移します(内部共変量偏移)。訓練が収束するのが遅い理由は、全体の分布が徐々に非線形関数の区間の両端に近づくためであり、これが逆伝播の底層ネットワークの訓練勾配消失を引き起こします。BN は、一定の正則化手段を通じて、各層の神経ネットワークの任意のニューロンの入力値の分布を強制的に平均 0、分散 1 の標準正規分布に戻します。
レイヤー正規化#
可変長シーケンスに適しています。例えば、RNN や Transformer の場合です。
その他#
- エラスティックネット正則化:L1 正則化と L2 正則化を組み合わせた方法です。損失関数に L1 ノルムと L2 ノルムのペナルティ項を同時に導入し、両者の重みハイパーパラメータを調整することで正則化の影響をバランスさせます。エラスティックネット正則化は、特徴選択と重みの縮小の効果を同時に実現できます。
- データ拡張は、元の訓練データに対して一連のランダム変換や拡張を行うことでデータサンプルの量を増加させる技術です。これらの変換には、ランダムな回転、平行移動、スケーリング、反転などの操作が含まれます。データ拡張は、モデルがより良く一般化できるようにし、過剰適合の問題を軽減します。
- パラメータ共有は、神経ネットワーク内で一部のパラメータを共有する技術です。類似の構造や機能を持つ層間でパラメータを共有することで、モデルのパラメータ量を減少させ、モデルの複雑さと過剰適合のリスクを低下させます。パラメータ共有は通常、畳み込み神経ネットワーク(Convolutional Neural Networks)で使用されます。