本文主要是记录一下深度学习过程中的遇到的一些技巧的总结,这样在训练模型时如果效果不好就过来看看有哪些可以用上。不定期更新(等学到了新知识就会更新一下)
在实际训练之前,先找找一个简单的Batch,尝试训练它,使model可以overfit这个batch。如果模型不能成功的把loss降到接近0,说明模型有问题。
常见的错误有如下:
数据不平衡:有些类别的数据太多,这些类别称为majority class;而有些类别数据又太少,这些类别称为minority class
常用处理方法:
Set the bias of the output layer
For unbalanced datasets, the initial guesses of the network inevitably fall short. Even though the network learns to account for this, setting a better bias at model creation can reduce training times. For the sigmoid layer, the bias can be calculated as (for two classes):
bias = log(pos/negative)
When you create the model, you set this value as the initial bias.
采用Random image cropping and patching (RICAP) 方法。思路为:随机裁剪多个图片的中一部分,然后把它们拼接为一个图片,同时混合这些图片的标签。
random erasing:类似cutout,区别在于,cutout是把图片中随机抽中的矩形区域的像素值置为0,相当于裁剪掉,random erasing是用随机数或者数据集中像素的平均值替换原来的像素值。而且,cutout每次裁剪掉的区域大小是固定的,Random erasing替换掉的区域大小是随机的。
AutoAugment:使用AutoAugment自动选择适合特定数据集的数据增强策略。
输入数据尽量不要使用 one-hot 编码,而是使用embedding压缩特征维度。
对于数值类型的数据,最好将其缩放到 [-1,1] 的范围中,目的是为了加快收敛。
对于分类问题,可以采用标签平滑(Label-smoothing regularization, LSR) 的方式避免过拟合。它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。
对标签进行平滑操作可以减小模型的overconfidence的情况,进而减小overfitting。
例如:标签为[0, 0, 0, 1, 0],对标签平滑之后,标签变为 [0.05, 0.05, 0.05, 0.8, 0.05]。
将样本从简到难的进行划分,先让网络学习简单的样本,然后再让网络学习难的样本,最后再把所有样本让网络整体学习一遍。类似人学习的思路,先简后难。
最优先要考虑的超参数,或最重要的超参数是学习率(Learning Rate)
选择能被4整除的Batch Size, 或选择 2 n 2^n 2n 。
对于密集层(dense layer),输入神经元和输出神经元的数量最好都能被64整除。
对于卷积层,输入层和输出层的channel最好都是4的倍数,或是 2 n 2^n 2n。
对于卷积层,输入和输出的数量最好可以被64整除
pad image inputs from 3 (RGB) to 4 channels(TODO,不懂)
不同尺度的特征融合(例如 YOLOv3-SPP)。例如,将上面卷积层的输出使用不同大小的maxpooling层进行下采样,并将各自的结果融合在一起送给接下来的网络。
低层特征与高层特征进行融合。即将前面卷积层的输出和后面卷积层的输出concat到一起,然后然后进行后续卷积
使用残差块(residual block)防止梯度消失。可参考ResNet
如果网络太大,可以尝试使用Depthwise Conv(DW)卷积 + Pointwise Conv(PW)卷积 来减小网络参数和计算量。可参考MobileV1
对于Recurrent Layer,Batch Size 和 Hidden Size 最好是4的整数,理想情况下,最好是64、128或256的倍数
对于Recurrent Layer,Batch Size最好大一些
预训练模型:作为模型的“上游”模型,由牛逼的大厂预训练好,然后用这个模型的结果进行“下游”任务。例如:“BERT”是一个预训练模型,使用Bert可以将对Token(单词)进行Embedding,然后将其接到自己的“下游”模型上,进行特定任务的训练
计算机视觉:
NLP:
迁移学习:把别人训练好的“针对特定任务的”模型拿过来,然后把“任务”改成自己的特定任务,然后进行训练。
预训练模型和迁移学习的区别(个人理解):
预训练模型是不针对特定任务的,比如“Bert”,它针对NLP领域,但不针对具体任务,你可以拿Bert的输出再接模型进行“情感分析”、“词性标注”什么的都可以。;
但是迁移学习用的是特定任务的模型,比如张三训练了一个模型可以进行情感分析,然后你拿它这个训练好的模型,把最后几层改了,然后用于词性标注,这种是迁移学习。
https://arxiv.org/abs/1708.02002 section 3.3
nn.init.kaiming_normal_
class weights
Tips and tricks for Neural Networks: https://towardsdatascience.com/tips-and-tricks-for-neural-networks-63876e3aad1a
Tips For Using Dropout: https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/
深度神经网络模型训练中的 tricks(原理与代码汇总):https://mp.weixin.qq.com/s/qw1mDd1Nt1kfU0Eh_0dPGQ