本文共 1559 字,大约阅读时间需要 5 分钟。
几种方式,结果差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。
优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致。不然更新后的激活值方差发生改变,造成数据的不稳定。
Xavier初始化 :
W ∼ U [ − 6 n i + n i + 1 , 6 n i + n i + 1 ] W \sim U[-\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}},\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}] W∼U[−ni+ni+16,ni+ni+16]
He初始化:
条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
论文:
理论方法
W ∼ U [ 0 , 2 n ^ i ] W \sim U[0,\sqrt{\frac{2}{\hat{n}_i}}] W∼U[0,n^i2]
W ∼ U [ 0 , 2 ( 1 + α 2 ) n ^ i ] W \sim U[0,\sqrt{\frac{2}{(1+\alpha^2)\hat{n}_i}}] W∼U[0,(1+α2)n^i2]
其中
n ^ i = h i ∗ w i ∗ d i h i , w i 分 别 表 示 卷 积 层 中 卷 积 核 的 高 和 宽 d i 表 示 当 前 层 卷 积 核 的 个 数 \hat{n}_i = h_i * w_i * d_i \\ h_i,w_i分别表示卷积层中卷积核的高和宽 \\ d_i表示当前层卷积核的个数 n^i=hi∗wi∗dihi,wi分别表示卷积层中卷积核的高和宽di表示当前层卷积核的个数具体方法
下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)/2
uniform均匀分布初始化:
w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
scale = np.sqrt(3/n)
scale = np.sqrt(6/n)
normal高斯分布初始化:
w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
stdev = np.sqrt(n)
stdev = np.sqrt(2/n)
svd初始化:对RNN有比较好的效果。参考论文:
技巧
正确初始化最后一层的权重。如果回归一些平均值为50的值,则将最终偏差初始化为50。如果有一个比例为1:10的不平衡数据集,请设置对数的偏差,使网络预测概率在初始化时为0.1。正确设置这些可以加速模型的收敛。
zero-center
这个挺常用的.
X -= np.mean(X, axis = 0) # zero-centerX /= np.std(X, axis = 0) # normalize
PCA whitening
这个用的比较少.
实现方法见****
转载地址:http://nsvvi.baihongyu.com/