Tensorflow layersの重みの初期化
tensorflow.keras.initializersをインポートし,layers APIのkernel_initializerに任意のクラスを引数として与えると,条件(定数や確率分布)に従って重みを初期化できます.
初期化 - Keras Documentation
- keras.initializers.Zeros()
- すべての重みを0で初期化
- keras.initializers.Ones()
- すべての重みを1で初期化
- keras.initializers.Constant(value=0)
- すべての重みを定数で初期化.デフォルトは0(Zeros()と同じ挙動).
- keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)
- keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)
- すべての重みを一様分布に従って初期化.乱数の下限及び上限,seedが指定可能.
- keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)
- すべての重みを切断正規分布に従って初期化.
- 正規分布と異なる点は,平均より標準偏差の分以上離れた値は切り捨てられること.TruncatedNormalはニューラルネットワークの重みの初期化方法として推奨される.
- すべての重みを切断正規分布に従って初期化.
使用例
import tensorflow as tf from tensorflow import keras from tensorflow.keras import initializers inputs = keras.layers.Input(shape=(28*28, )) x = keras.layers.Dense(1024, activation='relu', kernel_initializer=initializers.TruncatedNormal())(input) outputs = keras.layers.Dense(10, activation='softmax')
注意点
ZerosやOnesを記載してから言うのもなんですが,重みの初期値を均一な値にすることは避けるべきです.
なぜなら,順伝播時には次の層への出力がすべての同じ値になってしまい,誤差逆伝播時にはすべての重みの値が同じように更新されてしまい(重みが同じ値を持ってしまい),大量の重みを使う利点が損なわれてしまうからです.
入力層(ノード数3)→隠れ層(ノード数4)間の重みをすべて1とした場合を考えると,
まとめ
便利な呪文
kernel_initializer=initializers.TruncatedNormal()