【问题标题】:What is difference between tf.truncated_normal and tf.random_normal?tf.truncated_normal 和 tf.random_normal 有什么区别?
【发布时间】:2017-06-01 22:47:56
【问题描述】:

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) 从截断的正态分布中输出随机值。

我尝试在谷歌上搜索“截断正态分布”。但是不太明白。

【问题讨论】:

    标签: math machine-learning tensorflow


    【解决方案1】:

    documentation 说明了一切: 对于截断的正态分布:

    这些值是从具有指定均值和标准偏差的正态分布中提取的,丢弃并重新提取任何与均值有两个以上标准偏差的样本。

    很可能通过自己绘制图表很容易理解差异(%magic 是因为我使用 jupyter notebook):

    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));
    


    使用截断法线的目的是克服像 sigmoid 这样的函数的饱和(如果值太大/太小,神经元会停止学习)。

    【讨论】:

    • 感谢您的代码。太好了。但是,我无法在 PC 上打印出直方图,如下所示。你知道为什么吗? ,>>> plt.hist(b,100,(-4.2,4.2)); (数组([ 3.00000000e+00, 6.00000000e+00, 9.00000000e+00, 4.00000000e+00, 1.60000000e+01, 8.00000000e+00, 3.864, 3.948, 4.032, 4.116]) 100 个补丁对象>)
    • @Hong 对不起,但我不知道为什么。看起来它是计算出来的,但由于某种原因没有绘制出来。也许你可以问一个与matplotlib相关的问题
    • @SalvadorDali 这个问题之后的问题是,什么时候比另一个更受欢迎?在我看来, truncated_normal 往往是首选选项。什么时候 random_normal 是一个有效的选择?
    • @CarlosJimenezBermudez 很难预测哪种初始化会导致最快的学习。 random_normal 可能与 RELU 激活一起使用。不使用 random_normal 的原因是 sigmoid/tanh 的饱和度,但它们现在不常用。
    【解决方案2】:

    tf.truncated_normal() 从均值接近 0 且值接近 0 的正态分布中选择随机数。例如,从 -0.1 到 0.1。之所以称为截断,是因为您从正态分布中截断了尾部。

    tf.random_normal() 从均值接近于 0 的正态分布中选择随机数,但值可能相差更远。例如,从 -2 到 2。

    在机器学习中,在实践中,您通常希望权重接近 0。

    【讨论】:

    • 在 ML 中,通常的建议是权重的平均值为 0,标准差为 0.1 或 0.01,接近 0 且分布均匀。你能说出具体原因吗?
    • @pravbeatle 我相信这篇文章可以帮助你,cs231n.github.io/neural-networks-2。这些值是首选,因为网络将训练得更快。
    • @pravbeatle 对 sigmoid 链接权重饱和的另一种解释:stats.stackexchange.com/questions/228670/…
    【解决方案3】:

    API documentation for tf.truncated_normal() 将函数描述为:

    从截断的正态分布中输出随机值。

    生成的值遵循具有指定均值和标准差的正态分布,但幅度为 超过平均值的 2 个标准差被丢弃,并且 重新挑选。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      相关资源
      最近更新 更多