随机初始化
在神经网络中,如果初始化所有的参数(也就是权重)相同,那么所有输入都相同,神经网络就失去了它的作用了。所以我们需要随机初始化。
若我们随机初始化所有参数为0,则正向传播时,所有的a也会都为0。
在反向传播时,必定有一项为a,所以求出来的梯度都为0或者都一样。
就导致每一层中的权重都会做相同的更新。这样的话就没有意义了。
我们需要牢记参数初始化的目的是为了让神经网络在训练过程中学习到有用的信息,这意味着参数梯度不应该为0。而我们知道在全连接的神经网络中,参数梯度和反向传播得到的状态梯度以及入激活值有关——激活值饱和会导致该层状态梯度信息为0,然后导致下面所有层的参数梯度为0;入激活值为0会导致对应参数梯度为0。所以如果要保证参数梯度不等于0,那么参数初始化应该使得各层激活值不会出现饱和现象且激活值不为0。我们把这两个条件总结为参数初始化条件:
初始化必要条件一:各层激活值不会出现饱和现象。
初始化必要条件二:各层激活值不为0。
torch.nn.init.calculate_gain(nonlinearity, param=None)
nonlinearlity - 非线性函数名
param - 非线性函数的可选参数
import torch.nn as nn |
torch.nn.init 初始化函数
import torch |
Xavier 初始化
因为Xavier的推导过程是基于几个假设的,其中一个是激活函数是线性的。这并不适用于ReLU激活函数。另一个是激活值关于0对称,这个不适用于sigmoid函数和ReLU函数。所以可以看到图11中并没有对sogmoid网络应用Xavier初始化。
Xavier初始化针对于激活函数为Tanh()的时候效果比较好。
Kaiming 初始化 (He 初始化)
条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
Kaiming初始化适用于ReLU()和LeakyReLU()。
pytorch 手动初始化
from torch import nn |