本文所采用的数据集为UCI 鲍鱼年龄预测数据集,网络模型为8层的全连接神经网络。
1. 实验步骤:
a. 基于不同的权重初始化方式初始化各层权重;
b. 以直方图的形式查看每层输入给激活函数(线性运算后)的数据分布;
2. 正态分布初始化权重
a. 权重更新
weight = np.random.randn(in_node, out_node)
使用默认的均值和方差
b. 实验结论
如图所示,随着网络层的加深,每层的激活函数值有较多的比例接近1和-1,这使得网络的更新梯度太小而无法更新参数。这是本人所使用此鲍鱼年龄预测数据集的实验,您也可以使用别的数据集进行测试,虽实验图像有所不同,但结论相同。
c. 原因分析
若输入和权重都服从均值为0,方差为1的正态分布时,则x*w也服从均值为0,方差为1的正态分布,想像其概率密度曲线,大部分的数据都在[-1,1]之间,这里是有一个比例的。
若x*w+x*w,则服从均值为0,方差为2的正态分布,此时概率密度曲线会变宽,大部分的数据都在[-2,2]之间。而神经网络的每层线性操作就是对正态分布方差的累加,即前层的神经元有多少个,则累加多少次,最终导致线性操作的结果的概率密度曲线非常宽,所以很容易进入激活函数饱和区。
4. Xavier初始化权重
a. 权重更新
weight = np.random.randn(in_node, out_node)/np.sqrt(in_node)
Tensorflow API:
tf.contrib.layers.xavier_initializer_conv2d
b. 实验结论