权重W初始化
全部初始化为0
全部初始化为0,导致一个问题就是每个神经元的输出是一样的,那么在反向传播时,更新的梯度肯定也是一样的,也就是说不管怎么迭代,网络的里参数全部都是一样的,这就没法玩了。
高斯随机初始化
W = 0.01* np.random.randn(D,H)
我们依然想要靠近0的初始化,所以采用零均值,标准差为1的高斯分布,然后乘以0.01,相当与将权重缩小100倍来初始化,这样可以打破上一种初始化方式的的对称,名字叫symmetry breaking.
这种初始化方式在小网络中还能用,但是放到比较深的网络就跪了。lecture5的ppt给出了实验结果图,使用这种方式初始化,随着深度的增加,大概到第三层以后,每层输出的均值和标准差基本为0。也就是说所有的激活函数输出为0.这就导致了反向传播过程中,梯度消失,因为的导数肯定是和有关,现在为0,那么梯度也就为0了。这样就没法玩了。 当初始化参数过大,比如
W = 1.0* np.random.randn(D,H)
这会导致神经元饱和,输出要么是-1,要么是+1,梯度依然为0。 以上例子都是以tanh函数为激活函数举例。
Xavier 初始化
w = np.random.randn(fan_in, fan_out) / sqrt(fan_in) # fan_in是输入的个数
推理过程见笔记,基于的思想是保证每一层的输入和输出的方差一致。即找出什么样的W可以使成立,其中.
如果使用ReLU作为激活函数,初始化方式为
w = np.random.randn(fan_in, fan_out) / sqrt(fan_in/2)
稀疏初始化
将权重矩阵为0,但是为了打破对称,可以只连接部分神经元,其他神经元不连接,连接的神经元个数一般设为10. 有点类似dropout的做法。
bias初始化
一般bias初始化为0,对于ReLu类的激活函数,bias初始化为0.01,防止其开始被抑制导致一直无法更新梯度。