重みの初期化 おもみのしょきか
重みの初期化パラメータ初期化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初期化 |
| Transformer | Xavier初期化(または論文指定の方法) |
| RNN | 直交初期化(重み行列) |
| バイアス | ゼロ初期化 |
関連用語
- Xavier初期化 / He初期化 — 代表的な初期化手法の詳細
- 勾配消失 / 勾配爆発 — 初期化失敗で起きる問題
- 残差接続(Residual Connection) — 初期化の影響を緩和する構造
- 層正規化(Layer Normalization) — 初期化と組み合わせて学習を安定化