2020-09-27 权重初始化

在开始训练网络之前,还需要初始化网络的参数。

1、全零初始化

把这些权重的初始值都设为0这个做法错误的。
因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。

2、小随机数初始化。

权重初始值要非常接近0又不能等于0。

解决方法:

就是将权重初始化为很小的数值,以此来打破对称性
其思路是:
如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。
小随机数权重初始化的实现方法是:
W = 0.01 * np.random.randn(D,H)。
其中randn
函数是基于零均值和标准差的一个高斯分布来生成随机数的。

警告:

并不是小数值一定会得到好的结果。例如,一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度(因为梯度与权重值是成比例的)。这就会很大程度上减小反向传播中的“梯度信号”,在深度网络中,就会出现问题。

3、使用1/sqrt(n)校准方差

可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。
也就是说,建议将神经元的权重向量初始化为:w = np.random.randn(n) / sqrt(n)。
其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

4、稀疏初始化(Sparse initialization)

另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。

5、偏置(biases)的初始化

通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。
对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。
然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。

6、批量归一化(Batch Normalization)

批量归一化是loffe和Szegedy最近才提出的方法,该方法减轻了如何合理初始化神经网络这个棘手问题带来的头痛。

其做法是:

让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。因为归一化是一个简单可求导的操作,所以上述思路是可行的。
在实现层面
应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层。
需要知道的是在神经网络中使用批量归一化已经变得非常常见。
在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。

你可能感兴趣的:(2020-09-27 权重初始化)