隐含层权重参数的初始化方式的对比实验

管理员

全1或全0初始化

全1或全0初始化的训练效果

After 858 Batches (2 Epochs):
Validation Accuracy
   11.260% -- All Zeros
    9.900% -- All Ones
Loss
    2.300  -- All Zeros
  372.644  -- All Ones

全1和全0的方式都不好,因为大家都一样,反向传播算法不知道更新哪一个

Uniform Distribution

Uniform Distribution的训练效果

After 858 Batches (2 Epochs):
Validation Accuracy
   65.340% -- tf.random_uniform [0, 1)
Loss
   64.356  -- tf.random_uniform [0, 1)

设置 UniformDistribution权重的方式

通用的方法是,设置一个0左右的不太小的区间。

一个好的选择起点是从 $ y=frac1{sqrt{n}}$公式选取 [−y,y],公式里的n是神经元输入的个数。

y的不同区间值的效果

After 858 Batches (2 Epochs):
Validation Accuracy
   91.000% -- [-1, 1)
   97.220% -- [-0.1, 0.1)
   95.680% -- [-0.01, 0.01)
   94.400% -- [-0.001, 0.001)
Loss
    2.425  -- [-1, 1)
    0.098  -- [-0.1, 0.1)
    0.133  -- [-0.01, 0.01)
    0.190  -- [-0.001, 0.001)

如果设置的太小会有问题

Normal Distribution

Normal Distribution的训练效果

After 858 Batches (2 Epochs):
Validation Accuracy
   96.920% -- Uniform [-0.1, 0.1)
   97.200% -- Normal stddev 0.1
Loss
    0.103  -- Uniform [-0.1, 0.1)
    0.099  -- Normal stddev 0.1

UniformDistribution稍微有所提高

Truncated Normal Distribution

Truncated Normal Distribution的训练效果

After 858 Batches (2 Epochs):
Validation Accuracy
   97.020% -- Normal
   97.480% -- Truncated Normal
Loss
    0.088  -- Normal
    0.034  -- Truncated Normal

模型再大点差别会更明显,因为正态分布有些过大过小的数会影响模型,而截断他就少受影响

结论

一般来说就用 TruncatedNormalDistribution,效果是最猴滴~