深度学习笔记(七)—— 初始化权值[Weight Initialization]

  这是深度学习笔记第七篇,完整的笔记目录可以点击这里查看。
  
  首先说一个误区,那就是将所有权值都初始化为0。我们不知道训练网络中每个权重的最终值应该是多少,但是通过适当的数据规范化,可以合理地假设大约一半的权重为正,一半为负。一个听起来合理的想法可能是将所有初始权重设置为零。但是,这是一个错误的想法。因为如果网络中的每个神经元计算相同的输出,那么它们在反向传播过程中也会计算相同的梯度,并经历完全相同的参数更新。换言之,如果神经元的权值被初始化为相同的数值,那么神经元之间就没有不对称的根源。下面介绍几种权值初始化的方法:

1. Small random numbers

  我们仍然希望权重非常接近于零,但正如我们上面所讨论的,不是完全相同的零。作为一种解决方案,通常将神经元的权值初始化为小数值,并将其称为对称性破除(symmetry breaking)。这个想法来源于,神经元在开始的时候都是随机的和唯一的,因此它们会计算不同的更新,并将自己整合为整个网络的不同部分。一个权重矩阵的实现比如:W = 0.01* np.random.randn(D,H),其中randn函数从零均值、单位高斯标准差中采样。该代码将每个神经元的权值向量初始化为一个多维高斯随机向量,使神经元在输入空间中指向随机方向。
  需要注意的一点是,并不是说数字越小效果越好。例如,具有非常小权重的神经网络层将在反向传播期间计算出非常小的梯度(因为该梯度与权重值成比例)。这可能会大大减少“梯度信号”通过网络反向传播的强度,使深层网络无法很好地训练。

2.Calibrating the variances with 1/sqrt(n)

  第一种初始化方法的一个问题是,随机初始化的神经元的输出分布有一个随输入数量增加的方差。对此,我们可以将每个神经元输出的方差标准化为1,方法是通过除以权值数量的平方根来缩放其权重向量。也就是说,建议的启发式方法是将每个神经元的权重向量初始化为w = np.random.randn(n) / sqrt(n),其中n是它的输入数量。这确保了网络中的所有神经元最初具有近似相同的输出分布,并从经验上提高了收敛速度。这种做法的原理分析可以参考这篇文献。
  对于这类方法,一个更新的深入研究是由He等人,推导出了一个专门针对ReLU神经元的初始化,得出网络中神经元的方差应为2.0/n的结论,由此得到初始值w = np.random.randn(n) * sqrt(2.0/n),这是当前推荐在带有ReLU神经元的神经网络下使用的方法,实际应用较为广泛。

3. Sparse initialization

  解决未校准方差问题的另一种方法是将所有权重矩阵设置为零,但为了破除对称性,每个神经元随机连接(和第2种方法中数值很小的高斯采样权重)到它下面的固定数量的神经元。通常,要连接的神经元的数目可能只有10个。

4. Batch Normalization

  批处理规范化(Batch Normalization)的技术通过在训练开始时显式地强制整个网络中的激活采用单位高斯分布来适当初始化神经网络,从而减轻了许多头疼的问题。这样做是可以的,因为归一化是一个简单的可微操作。在实现中,应用此技术通常相当于在全连接层(或卷积层)之后和非线性之前立即插入BatchNorm层。在神经网络中使用Batch Normalization已经成为一种非常常见的做法。在实际应用中,使用Batch Normalization的网络对于错误的初始化具有非常高的鲁棒性(robust)。此外,Batch Normalization可以解释为在网络的每一层进行预处理,但是是以可微的方式集成到网络本身中。干净利落!

5. Initializing the biases

  最后讲讲bias(偏差)的初始化方法。由于对称性破除是由权值中的小随机数提供的,因此将bias初始化为零是可能且常见的做法。对于非线性的ReLU,有些人喜欢使用小的常量值,例如0.01来初始化所有的bias,因为这样可以确保所有ReLU单元在一开始就被触发,从而获得并传播一些梯度。但是,这种做法是否提供了一致的改进并未得到验证(事实上,一些结果表明这种方法的结果似乎更差),更常见的是使用0来初始化bias。



*本博客翻译总结自CS231n课程作业网站,该网站需要才能访问。

你可能感兴趣的:(CS231n课程笔记,网络,神经网络,深度学习,人工智能,机器学习)