对于某⼀个神经元来说,需要初始化的参数有两类:⼀类是权重W,还有 ⼀类是偏置b,偏置b初始化为0即可。⽽权重W的初始化⽐较重要,我们着 重来介绍常⻅的初始化⽅式。
随机初始化从均值为0,标准差是1的⾼斯分布中取样,使⽤⼀些很⼩的值 对参数W进⾏初始化。
权重参数初始化从区间均匀随机取值。即在(-1/√d,1/√d)均匀分布中⽣成当 前神经元的权重,其中d为每个神经元的输⼊数量。
该⽅法的基本思想是各层的激活值和梯度的⽅差在传播过程中保持⼀致, 也叫做Glorot初始化。在tf.keras中实现的⽅法有两种:
正态化Xavier初始化: Glorot 正态分布初始化器,也称为 Xavier 正态分布初始化器。它从以 0 为中⼼,标准差为 stddev = sqrt(2 / (fan_in + fan_out)) 的正 态分布中抽取样本, 其中 fan_in 是输⼊神经元的个数, fan_out 是输出的神经元个数。
实现⽅法为:
# 导⼊⼯具包
import tensorflow as tf
# 进⾏实例化
initializer = tf.keras.initializers.glorot_normal()
# 采样得到权重值
values = initializer(shape=(9, 1))
# 打印结果
print(values)
输出结果为:
tf.Tensor(
[[ 0.71967787]
[ 0.56188506]
[-0.7327265 ]
[-0.05581591]
[-0.05519835]
[ 0.11283273]
[ 0.8377778 ]
[ 0.5832906 ]
[ 0.10221979]], shape=(9, 1), dtype=float32)
标准化Xavier初始化 Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。它从 [- limit,limit] 中的均匀分布中抽取样本, 其中 limit 是 sqrt(6 / (fan_in + fan_out)) , 其中 fan_in 是输⼊神经元的个数, fan_out 是输出的神经元个数。
# 导⼊⼯具包
import tensorflow as tf
# 进⾏实例化
initializer = tf.keras.initializers.glorot_uniform()
# 采样得到权重值
values = initializer(shape=(9, 1))
# 打印结果
print(values)
输出结果为:
tf.Tensor(
[[-0.59119344]
[ 0.06239486]
[ 0.65161395]
[-0.30347362]
[-0.5407096 ]
[ 0.35138106]
[ 0.41150713]
[ 0.32143414]
[-0.57354397]], shape=(9, 1), dtype=float32)
4.He初始化 he初始化,也称为Kaiming初始化,出⾃⼤神何恺明之⼿,它的基本思想 是正向传播时,激活值的⽅差保持不变;反向传播时,关于状态值的梯度 的⽅差保持不变。在tf.keras中也有两种:
正态化的he初始化 He 正态分布初始化是以 0 为中⼼,标准差为 stddev = sqrt(2 / fan_in) 的截断正态分布中抽取样本, 其中 fan_in 是输⼊神经元的 个数,在tf.keras中的实现⽅法为:
# 导⼊⼯具包
import tensorflow as tf
# 进⾏实例化
initializer = tf.keras.initializers.he_normal()
# 采样得到权重值
values = initializer(shape=(9, 1))
# 打印结果 print(values)
输出结果为:
tf.Tensor(
[[-0.1488019 ]
[-0.12102155]
[-0.0163257 ]
[-0.36920077]
[-0.89464396]
[-0.28749225]
[-0.5467023 ]
[ 0.27031776]
[-0.1831588 ]], shape=(9, 1), dtype=float32)
标准化的he初始化,He 均匀⽅差缩放初始化器。它从 [-limit,limit] 中的均匀分布中抽取样 本, 其中 limit 是 sqrt(6 / fan_in) , 其中 fan_in 输⼊神经 元的个数。实现为:
# 导⼊⼯具包
import tensorflow as tf
# 进⾏实例化
initializer = tf.keras.initializers.he_uniform()
# 采样得到权重值
values = initializer(shape=(9, 1))
# 打印结果
print(values)
输出结果为:
tf.Tensor(
[[ 0.80033934]
[-0.18773115]
[ 0.6726284 ]
[-0.23672342]
[-0.6323329 ]
[ 0.6048162 ]
[ 0.1637358 ]
[ 0.60797024]
[-0.46316862]], shape=(9, 1), dtype=float32)