チラ裏備忘録

情報整理

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)
使用例
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とした場合を考えると,
{
\begin{pmatrix}
1&2&3
\end{pmatrix}

\begin{pmatrix}
1&1&1&1\\
1&1&1&1\\
1&1&1&1
\end{pmatrix}
=
\begin{pmatrix}
6&6&6&6
\end{pmatrix}
}

まとめ

便利な呪文
kernel_initializer=initializers.TruncatedNormal()