NN模型设置--参数初始化

参数初始化的原理

  权值初始化对网络优化至关重要。早年深度神经网络无法有效训练的一个重要原因就是早期人们对初始化不太重视。
  模型对初始的参数是很敏感的,如果参数都很大,那么经过wx+b这个线性函数时,输出的值也会很大,若是经过tanh这个激活函数,输出的结果绝对值都几乎接近于1,也就是说每个神经元的输出都几乎相同,这完全违背了神经网络的初衷,事实上我们希望每个神经网络都能去学习一个不同的特征,他们的输出值应该是有差异的。
  另一方面,如果w值设置地太小了,经过线性函数wx+b的时候,wx可以忽略不计,于是线性函数的输出都约等于b,经过激活函数后的输出也几乎相同,又造成了神经元彼此雷同的尴尬局面呢。


权重初始化的要求

  神经元不容易饱和,学习速度不会太慢。
  这样的⼀个神经元更不可能饱和,因此也不⼤可能遇到学习速度下降的问题。
NN模型设置--参数初始化_第1张图片

权重初始化的常用方法

  初始化的基本思想:方差不变,即设法对权值进行初始化,使得各层神经元的方差保持不变。
  参数初始化可能导致梯度消失或爆炸,所以基本原则是确保每一层的权重矩阵的方差都近似为 1。

  1)为网络中的所有连接权值赋上一个服从均值为0,标准差为0.01的正态分布的一个随机数。为第二、四、五层的卷积层和所有的全连接层神经元的偏置都赋予1的初始值,而其他层神经元的偏置均为0。这种初始化方法在模型的训练初期,能够有效的提速。因为为ReLU输入的都是正值。

  2)Xavier初始化
  从高斯分布或均匀分布中对权值进行采样,使得权值的方差是1/n,其中n是输入神经元的个数。该推导假设激活函数是线性的。

  3)He初始化/MSRA初始化
  从高斯分布或均匀分布中对权值进行采样,使得权值的方差是2/n。该推导假设激活函数是ReLU。因为ReLU会将小于0的神经元置零,大致上会使一半的神经元置零,所以为了弥补丢失的这部分信息,方差要乘以2。

  4)批量规范化(batch-normalization,BN)
  每层显式地对神经元的激活值做规范化,使其具有零均值和单位方差。批量规范化使激活值的分布固定下来,这样可以使各层更加独立地进行学习。批量规范化可以使得网络对初始化和学习率不太敏感。此外,批量规范化有些许正则化的作用,但不要用其作为正则化手段。

  5)
  ①经验规则适用于[-1,1]的输入,如果直接用,那么会爆网络。
  ②ReLu的非饱和线性端是做回归用的激活函数,输出近似高斯分布。
  基于以上两点,Alex选择了高斯分布生成零均值、小标准差的随机值作为初始化W,并且逐层加大标准差,使得W有弹性。(0.0001-0.01-0.01-0.1-0.1)
  由于高斯分布的的不均匀性(超大值有,超小值也有),使得经过ReLu激活,不会有很无解的爆数值问题.当然输入不要太大,[ 0,256] ( 原始) 或 [ -128,128] ( 减均值)

  6)目前在神经网络中建议使用的权重初始化策略是将值归一化到范围[-b,b],b为:
NN模型设置--参数初始化_第2张图片
  其中,Hk是前后隐含层的神经元数目。


bias的初始化

  用caffenet训练数据,后面几层的bias_filter的value原始设置为1,我就没有修改,后来发现训练不收敛。把value值变小后,就可以了。
  是filler,填充器。如果type设为“constant”,value置为1,表示用常量1填充。不设value值,则默认用0填充。你的试验说明用1填太大了。一般用0填即可。


小技巧

  1)统计一下L1的参数分布;
  2)在大初始化的情况下,DNN 的泛化能力也会变差。

你可能感兴趣的:(算法的实际使用)