tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
は、正規分布からランダムな値を出力します。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
は、切り捨てられた正規分布からランダムな値を出力します。
「切り捨てられた正規分布」をググリングしてみました。しかし、あまり理解していませんでした。
documentation はすべてを表しています:切り捨てられた正規分布の場合:
生成された値は、平均と標準偏差が指定された正規分布に従いますが、大きさが平均から2標準偏差を超える値は削除され、再選択されます。
ほとんどの場合、グラフを自分でプロットすることで違いを理解するのは簡単です(%magicはjupyterノートブックを使用しているためです)。
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
n = 500000
A = tf.truncated_normal((n,))
B = tf.random_normal((n,))
with tf.Session() as sess:
a, b = sess.run([A, B])
そしていま
plt.hist(a, 100, (-4.2, 4.2));
plt.hist(b, 100, (-4.2, 4.2));
切り捨てられた法線を使用するポイントは、シグモイドのようなトーム関数の飽和を克服することです(値が大きすぎる/小さすぎる場合、ニューロンは学習を停止します)。
tf.truncated_normal()
は、平均が0に近く、値が0に近い正規分布から乱数を選択します。たとえば、-0.1から0.1です。正規分布から裾を切り落とすため、切り捨てと呼ばれます。
tf.random_normal()
は、平均が0に近い正規分布から乱数を選択しますが、値は少し離れている場合があります。たとえば、-2から2です。
機械学習では、実際には、通常、重みを0に近づける必要があります。
tf.truncated_normal()のAPIドキュメント は、関数を次のように説明しています。
切り捨てられた正規分布からランダムな値を出力します。
生成された値は、平均と標準偏差が指定された正規分布に従いますが、大きさが平均から2標準偏差を超える値は削除され、再選択されます。