在自己书写的梯度下降求出参数梯度后,为什么按照大伙儿常用的学习率0.01设定学习率后,正确率总上不去?
很大一个原因是因为卷积层和全连接层初始化没做或者没做好,应该检查一下。
这里就看了一种参数初始化的方式Xavier。
该方法的局限性:
1)激活函数关于0对称。
2)在激活函数非饱和区,我们可以近似为线性。
比如tanh的图像,在x不趋近于两端时,我们可以用tanh’(0)为斜率的一条直线来近似这个函数。就满足这个条件。
ReLU激活函数,就不能满足2)中这种线性近似,所以以ReLU为激活函数就不太能适用Xavier参数初始化方法了。
3)网络中参数满足的分布中均值必须为0。之所以有这个假设,是因为下图Var(Wij)计算时E(X)为0,就简化了计算。
我认为必须要搞懂这个局限性,否则进行参数初始化时依然是瞎初始化。
4)偏置项初始化为全0。
关于Xavier初始化的总结
参考:https://blog.csdn.net/victoriaw/article/details/73000632
https://blog.csdn.net/weixin_39910711/article/details/124285848
如果不是tanh函数,这个链接最后说可以给方差乘上导数的导数,这样也可以以Xavier分布来初始化参数,还不太懂这个是怎么来的。
**
总结:
**
激活函数为tanh时,我们在使用Xavier函数进行参数初始化时,保证了两点:
1)网络中间每一层结点的激活后的值都时刻服从均值为0,标准差为Var (z0)。而没有让各层激活值的方差逐层递减,这样在计算各层参数的梯度时,不会出现梯度消失的现象。
2)各层结点反向传播的梯度的方差也都服从均值为0,标准差为Var(δ Cost / δ Zd)。而没有让各层结点反向传播的梯度的方差也逐层递减。
满足以上两点,也就一定程度上避免了梯度消失的现象。使我们的网络更好的收敛。
从而可以联想到为什么图像预处理时除了归一化还要做标准化的操作。标准化可以将输入数据映射到均值为0,标准差为1的分布上。
如果我们初始的输入满足均值为0,标准差Var(z0)为1,就可以按Xavier中根号六 / 根号下nj+nj+1的那个分布来初始化参数了。当然你也可以初始化后的均值为0,标准差不为1,那么最后就不是根号六这个数了,还要除以这个标准差。那为何不标准化为方差为1呢?这样就可以直接用根号六了。这不是给自己找麻烦嘛?
**
利用torchvision中的Normalize进行标准化
一般的数据集,比如MNIST,一个通道的数据,我们都可以搜到这两个数,它们分别对应要对这组图像数据进行标准化所要用到的均值mean,和标准差std。减均值除以标准差得到的就是满足均值为0,标准差为1的分布。
**
torchvision.transforms.Normalize(mean=(0.1307), std=(0.3081))
**
以全连接层为例,初始化权重写法
**
# input_nums:输入结点数
# output_nums:输出结点数
a = np.sqrt(6. / (input_nums + output_nums))
self.weights = np.random.uniform(low=-a,high=a,size = [output_nums,input_nums]) #全连接层的weight采用xavier分布
self.bias = np.zeros((output_nums,1))