手工制作的Xavier初始化器:lrelu和relu的值

时间:2016-08-30 15:02:51

标签: machine-learning initialization tensorflow

作为How to do Xavier initialization on TensorFlow中回复(不是所选回复)的后续跟进:任何有想法的人,在relu中使用哪些值,尤其是漏洞relu?

我的意思是这一部分:

# use 4 for sigmoid, 1 for tanh activation

这是在那里给出的:

(fan_in, fan_out) = ...
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out))
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32))

1 个答案:

答案 0 :(得分:3)

根据He et al 2015 Eq。如图15所示,当使用ReLu时,一层的理论权重方差变为:

n*Var[W] = 2

其中n是图层大小。

如果你想使用in层和out层的池化方差,那么它就变成了:

(fan_in, fan_out) = ...
low = -2*np.sqrt(1.0/(fan_in + fan_out))
high = 2*np.sqrt(1.0/(fan_in + fan_out))

如果您使用张量流,则它们具有variance_scaling_initializer,您可以在其中设置因子变量和模式变量来控制初始化的方式。

如果对此初始值设定项使用参数factor = 2.0的默认设置,则会获得He et al 2015建议的ReLu激活初始化差异。虽然您可以使用参数模式来获得略微不同的权重初始化差异。仅在图层中使用:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_IN') 

会给你以下的信息:

(fan_in, fan_out) = ...
low = -np.sqrt(2.0/fan_in)
high = np.sqrt(2.0/fan_in)

同时使用in和out图层:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_AVG')

会给你:

(fan_in, fan_out) = ...
low = -np.sqrt(4.0/(fan_in+fan_out)) = -2.0*np.sqrt(1.0/(fan_in+fan_out))
high = np.sqrt(4.0/(fan_in+fan_out)) = 2.0*np.sqrt(1.0/(fan_in+fan_out))

仅使用图层:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_AVG')

会给你:

(fan_in, fan_out) = ...
low = -np.sqrt(2.0/fan_out)
high = np.sqrt(2.0/fan_out)