全1或全0初始化
全1或全0初始化的训练效果
代码语言:javascript复制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的训练效果
代码语言:javascript复制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的不同区间值的效果
代码语言:javascript复制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的训练效果
代码语言:javascript复制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的训练效果
代码语言:javascript复制After 858 Batches (2 Epochs):
Validation Accuracy
97.020% -- Normal
97.480% -- Truncated Normal
Loss
0.088 -- Normal
0.034 -- Truncated Normal
模型再大点差别会更明显,因为正态分布有些过大过小的数会影响模型,而截断他就少受影响
结论
一般来说就用 TruncatedNormalDistribution
,效果是最猴滴~