ニューラルネットワーク

重みの初期化 おもみのしょきか

重みの初期化パラメータ初期化Xavier初期化He初期化勾配消失深層学習
重みの初期化について教えて

簡単に言うとこんな感じ!

ニューラルネットは学習前に重みの初期値を決めないといけないんだ。全部ゼロにすると全ニューロンが同じ動きをして学習できない(対称性の問題)、かといって大きすぎると勾配爆発……ちょうどいい初期値を賢く決める技術が「重みの初期化」だよ!


重みの初期化とは

重みの初期化(Weight Initialization) とは、ニューラルネットワークの学習を始める前に、各ニューロン間の接続重みの初期値を適切に設定することです。初期値の設定は学習の収束速度・最終的な精度・学習の安定性に大きく影響します。

初期値をすべてゼロに設定する(ゼロ初期化)と失敗します。すべての重みが同じ値なら、すべてのニューロンが同じ勾配を受け取り、同一の更新が行われます。この「対称性の問題」により、ニューラルネットワークが複数のニューロンを持つ意味がなくなります。

適切な初期化によって勾配消失・勾配爆発を防ぎ、学習が安定して進むようになります。層が深くなるほど初期化の影響が大きくなるため、深層学習では特に重要な技術です。


代表的な初期化手法

手法分布向いている活性化関数
ゼロ初期化全て0使ってはいけない(バイアスのみ可)
ランダム初期化小さい正規分布浅いネット(深いと勾配消失)
Xavier初期化分散を層サイズで調整Sigmoid・tanh
He初期化Xavierの2倍の分散ReLU・Leaky ReLU
直交初期化直交行列で初期化RNN系に有効
import torch.nn as nn

# PyTorchでの初期化例
linear = nn.Linear(256, 128)

# Xavier(Glorot)初期化
nn.init.xavier_uniform_(linear.weight)

# He初期化(ReLUに推奨)
nn.init.kaiming_uniform_(linear.weight, nonlinearity='relu')

# バイアスはゼロ初期化が一般的
nn.init.zeros_(linear.bias)

歴史と背景

  • 1990年代:ランダム初期化が主流だったが、深いネットでは勾配消失が問題に
  • 2010年:GlorotとBengio(Xavier)がXavier初期化を提案。Sigmoidネットの学習が改善
  • 2015年:HeらがReLU向けのKaiming(He)初期化を提案。ResNetなど深いネットで活躍
  • 現在:フレームワークのデフォルト初期化としてXavier/Heが標準実装されている

初期化手法の選び方

状況推奨手法
Sigmoid / tanh使用Xavier初期化
ReLU / Leaky ReLU使用He初期化
TransformerXavier初期化(または論文指定の方法)
RNN直交初期化(重み行列)
バイアスゼロ初期化

関連用語