1、参数初始化
几种方式,结果差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。
优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致。不然更新后的激活值方差发生改变,造成数据的不稳定。
Xavier初始化 :
- 条件:正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
- 论文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
- 理论方法:
- 假设激活函数关于0对称,且主要针对于全连接神经网络。适用于tanh和sigmoid。
He初始化:
-
条件:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
-
理论方法
- 适用于ReLU的初始化方法:
- 适用于Leaky ReLU的初始化方法:
其中
具体方法
下面的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])
- Xavier初始法,适用于普通激活函数(tanh,sigmoid):
scale = np.sqrt(3/n)
- He初始化,适用于ReLU:
scale = np.sqrt(6/n)
- Xavier初始法,适用于普通激活函数(tanh,sigmoid):
-
normal高斯分布初始化:
w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
- Xavier初始法,适用于普通激活函数 (tanh,sigmoid):
stdev = np.sqrt(n)
- He初始化,适用于ReLU:
stdev = np.sqrt(2/n)
- Xavier初始法,适用于普通激活函数 (tanh,sigmoid):
-
svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120
技巧
正确初始化最后一层的权重。如果回归一些平均值为50的值,则将最终偏差初始化为50。如果有一个比例为1:10的不平衡数据集,请设置对数的偏差,使网络预测概率在初始化时为0.1。正确设置这些可以加速模型的收敛。
2、数据预处理方式
-
zero-center
这个挺常用的.
X -= np.mean(X, axis = 0) # zero-center X /= np.std(X, axis = 0) # normalize
-
PCA whitening
这个用的比较少.
3、梯度裁剪
实现方法见**pytorch小操作**