参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,对训练结果有着重要的影响。
初始化学习参数需要注意的规则
不可以将网络中的所有参数初始化为0,也不能全部初始化为同一个值。如果参数全部初始化为0或者是同一个值,会使得所有神经元的输出都是相同的,进而造成反向传播时,梯度和权重的变化相同,同一层内每个神经元的计算也相同。这显然是不正确的
尽量保证参数初始化的均值为0,正负交错,且正负参数在数量上大致相等
参数初始化的值不可以太大或是太小。初始值如果太大,会使得数据在每层间传递的过程中逐渐放大,导致梯度消失发散,训练失败;初始值如果太小,会使得特征值在每层间传递的过程中逐渐缩小,难以产生作用
TensorFlow中常用的参数初始化方法
TensorFlow提供了一些具有不同特性的初始化函数,如全零初始化(Zero Initialization)、随机初始化(Random Initialization)、Xavier初始化(Xavier Initialization)、He初始化(He Initialization)、迁移学习初始化(Pre-train Initialization)、数据敏感初始化等。
1.把参数初始化为常量的方法:
①tf.constant_initializer(value,dtype) : 可简写为tf.Constant(value,dtype),该方法将参数初始化为常数,通过常用于初始化偏置项(bias)。其中参数value为指定的常量,dtype为设置的数据类型
②tf.zeros_initializer(dtype) : 可简写为tf.Zeros(dtype),该方法生成一个初始值全为0的tensor对象
③tf.ones_initializer(dtype) : 可简写为tf.Ones(dtype),该方法生成一个初始值全为1的tensor对象
2.把参数初始化为正态分布的方法:
①tf.random_normal_initializer(mean,stddev,seed,dtype):可简写为tf.RandomNormal(…),该方法生成一组符合标准正态分布的tensor对象。参数mean为正态分布的均值,默认值是0;stddev为正态分布的标准差,默认值为1;seed为随机数种子,是一个整数,设置后,每次生成的随机数都为seed的值;dtype为设置的数据类型。
②tf.truncated_normal_initializer(mean,stddev,seed,dtype):可简写为tf.truncatedNormal(…),该方法生成一组符合截断正态分布的tensor对象。每个参数的含义与tf.random_normal_initializer方法的相同。由于该函数有截断功能,可以生成相对比较温和的初始值,在TensorFlow中经常使用该方法进行参数的初始化。
3.把参数初始化为均匀分布的方法:
①tf.random_uniform_initializer(minval.maxval,seed,dtype):可简写为tf.RandomUniform(…),该方法生成一组符合均匀分布的tensor对象,参数minval为指定的最小值,maxval为指定的最大值。使用该方法生成的随机数不是从小到大或者从大到小均匀分布的,而是每次从一组服从均匀分布的数里边随机抽取一个数。
②tf.uniform_unit_scaling_initializer(factor,seed,dtype):可简写为tf.UniformUnitScaling(…),该方法与tf.random_uniform_initializer()一样,生成一组符合均匀分布的tensor对象。不同的是,不需要指定最大值和最小值,而是通过公式计算。
max_val = math.sqrt(3/input_size)*factor
min_val = – max_val
其中input_size是生成数据的维度,factor是系数
4.初始化为变尺度正态、均匀分布的方法:
①tf.variance_scaling_initializer(scale,mode,distribution,seed,dtype):可简写为tf.VarianceScaling(…),该方法生成一组截断正态分布和均匀分布的tensor对象,增加了更多的控制参数。参数scale用于缩放尺度,为正浮点数。mode的值为”fan_in”,”fan_out”,”fan_avg”中的一个,用于计算标准差stddev的值。distribution是分布类型,值为”normal”或”uniform”,当distribution = “normal”时,生成截断正态分布的随机数,其中stddev = sqrt(scale/n),n的计算与mode参数有关。如果mode = “fan_in”,n为输入单元的节点数,如果mode = “fan_out”,n为输出单元的节点数,如果mode = “fan_avg”,n为输入和输出单元节点数的平均值。当distribution = “uniform”时,生成均匀分布的随机数,假设分布区间为[-limit,limit],则limit = sqrt(3*scale/n)。
5.正态矩阵初始化方法:
①tf.orthogonal_initializer(gain,dtype,seed):可简写为tf.Orthogonal(…),该方法生成正交矩阵的随机数,形状最少需要是2维的。如果要初始化的张量的形状是2维的,则用从均匀随机数矩阵的奇异值分解(SVD)得到的正交矩阵进行初始化;如果大于2维,则初始化形状为(shape[0] … shape[n – 2],shape[n -1])的矩阵,其中n是形状向量的长度。随后对矩阵进行重新调整以给出所需形状的张量。参数gain为适用于正交矩阵的乘法因子。
6.Glorot初始化方法:
①Glorot正常初始化方法,即tf.glorot_normal_initializer(seed,dtype):也称之为Xavier正常初始化器,该方法可以生成与输入输出节点数相关的截断正态分布随机数。它从以0为中心的截断正态分布中抽取样本,计算公式为:
stddev = sqrt(2/(fan_in + fan_out))
其中fan_in是权重张量中的输入单元数,fan_out是权重张量中的输出单元数。
②Glorot均匀初始化方法,即tf.glorot_uniform_initializer(seed,dtype):也称之为Xavier均匀初始化器。该方法可以生成与输入输出节点数相关的均匀分布随机数。它从一个均匀分布的[-limit,limit]区间中抽取样本,其中limit的计算公式为:
stddev = sqrt(6/(fan_in + fan_out))
fan_in和fan_out与Glorot正常初始化方法中的相同。