「学习内容总结自 udacity 深度学习课程,截图来自 udacity 课件」
权重初始化对于神经网络来说十分重要,一个好的权重初始化的方法能够帮助神经网络更快的找到最优解决方案。之前在TensorFlow的基本使用(1)-创建简单神经网络这篇笔记中提到使用截断正态分布的方法随机初始化权重,在学习了weight initialization这门课后有了更直观的理解。
初始化为全1或全0
按照一般思路和做法,会把权重全都初始化为1或0,这样看似没有问题,但在神经网络中却会出现大问题。
当每层的权重全部初始化为0或1时,神经网络的每个单元计算Z[L] = W[L]x + b[L]都为一样的值。计算反向传播时,每个梯度也都为一样的值。所以最后更新得到的权重也是一样的值。当所有的特征输入配与的权重都是一样大小的的时候,神经网络就不能学到哪些特征是重要的,哪些特征是不重要的。也就不知道哪些权重需要更新。对于深层神经网络来说,这样初始化的话,会造成深层并没有意义,反而会比不上线性分类器的效果。
实验初始化全为0或1时得到的结果如下图所示,全0的情况下损失虽然低但验证准确率也是很低的。全1的情况下损失很大验证准确率也不高。
采用均匀分布初始化权重
为了避免上述每个特征配与相同的权重情况。现在为每个特征配与独一无二的权重,让网络自己学习哪些特征是重要的,哪些特征是不重要的。用统计学上的均匀分布可以使产生的权重取值每个都不一样。
- [0,1]范围的均匀分布
课程中使用TensorFlow提供的tf.random_uniform()函数。该函数默认在[0,1]范围内取值。运行结果如下图所示,损失能够降到很低且验证准确率也有大幅提高。
- [-y,y]范围的均匀分布
设置神经网络权重的一般规则是使它接近0但不能太小。有一个典型的方法是在[-y,y]之间取值,其中 y = 1/ sqrt(n),n为输入个数。
上面采用[0,1]范围内的均匀分布,并不能使大多数的权重靠近0。所以会想到采用对称的取值范围,来使权重大部分取值靠近0。
先采用[-1,1]的范围与[0,1]范围进行对比,结果如下所示,发现取值在[-1,1]范围的效果好于[0,1]范围。说明我们进行的方向是正确的。
- 权重设置太小的情况
我们仍旧希望权重的取值尽可能小,接下来看看权重能尽可能的设置为多小。下面采用在[-0.1,0.1],[-0.01,0.01],[-0.001,0.001]三个范围内进行均匀分布取值。实验结果如下,发现在[-0.1,0.1]范围取值达到的效果最好,之后的取值都太小。
- 采用典型方法取值
上面提到典型方法是在[-y,y]之间取值,其中 y = 1/ sqrt(n),n为输入个数。现在将采用典型方法与[-0.1,0.1]范围内均匀取值的方法进行对比。对比结果如下,两者的结果很接近。说明我们发现的取值范围[-0.1,0.1]与典型方法很接近。
采用正态分布初始化权重
上面尝试的权重初始化方法都是在权重的取值要靠近0而不能太小的方向上进行着。正态分布正好符合这个方向,其大部分取值靠近0。
- 正态分布
下面是采用正态分布的取值与在[-0.1,0.1]范围内取值的对比结果,两者的结果也很接近,正态分布方法略好一点。
- 截断正态分布
还有一个截断正态分布的概念,能够使我们的取值比起正态分布更多的分布在靠近0的范围内,因为截断正态分布会截断超出2σ外的值,相当于是把离0较远的值一些值抛弃了。下面是截断正态分布与正态分布的图像对比:
下面是采用截断正态分布取值与采用正态分布取值的结果对比,两者的结果也很接近,截断正态分布方法略好一点。