加速
- minibatch
batch将一个batch里的example组成matrix进行运算。
GPU使同时运算。GPU+minibatch
提升performance
bn
1、bn是因为,1 线性变换加上激活的非线性变换,导致中间层的输入远离初始分布,后面的网络由于每次输入分布变化,导致网络的学习比较慢。2 由于一些激活函数求导随着层数增加,乘积越来越小,导致梯度接近0,模型近似饱和。又有情况是,w的梯度越来越大,w值也越来越大。此时可以改变激活函数为非饱和激活函数如Relu,也可以通过让激活函数的输入分布保持在一个稳定状态,尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。
即,一个是分布变化,一个是梯度问题。
2、解决:
1 白化,通过使得输入特征的均值为0,方差为1或者相同,来保证分布的稳定并去除特征相关性,从而加速收敛
2 bn : 白化的缺点是计算量并且改变了特征的分布导致信息丢失,所以引入了bn– 简化、进化版的白化。
4、 test上bn
无偏估计、每个层的bn进行指数
5、 优点
1分布稳定,避免梯度消失,加速收敛 2对网络参数不敏感 3引入随机噪声,正则化效果
尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。原作者通过也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。
trick
lr:
learning rate ,推荐了解 cosine learning rate
weight:
weight decay。
loss:
当你的模型还不错的时候,可以试着做数据增广和改损失函数锦上添花了。
全连接:
1、能用全卷积的任务,少用全连接层,参数量小。
2、highway net:可以考虑将全连接层(MLP)替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动
参数初始化:
1、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)
2、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)
3、svd初始化:对RNN有比较好的效果。
4、LSTM 的forget gate的bias,用1.0或者更大的值做初始化
batch_size:
embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
数据预处理:
bn、pca白化
激活函数:
sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0。输入0均值,sigmoid函数的输出不是0均值的。
把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类
ensemble:
cv
不同模型线性融合
优化器:
用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞
dropout:
dropout对小数据防止过拟合有很好的效果,值一般设为0.5
小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显
因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置
梯度:
要做梯度归一化,即算出来的梯度除以minibatch size
clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。
正则:
一轮加正则,一轮不加正则,反复进行。
数据集:
判断测试集靠不靠谱,包括采样/数据分布的线上一致性、时效性、标注正确率、评测方差/置信度
除了标准和采样问题外,数据问题上还可以组合大量预处理策略和训练策略
性能关注
运行速度,准确率,召回率,auc,显存利用率,显存占用,cpu利用率,内存占用,并发路数
业务场景和模型是否合适
陌生社交和graphsage的相似top推荐思路的逻辑不恰
dropout
当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。
1、取平均,相当于训练了很多个模型然后投票
2、正则化
3、避免共适应、共线性
本文链接: https://satyrswang.github.io/2021/10/06/dl技巧/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!