新冠疫情预测
- 特征选择
使用sklearn的feature_selection工具中的f_regression方法,选择了与目标显著相关的14个特征 - 网络结构调整
尝试了多种网络结构,发现将网络进行缩小以后效果会变好,个人认为可能由于数据量较小,比较小的单层网络已经可以较好地反映数据内在规律,较大的网络反而可能train不起来。此外使用了drop out与BN的方法。 - 正则化
使用L2正则项,尝试多组正则化参数,选取表现较好的一个(此外尝试过其他损失函数,效果与MSE相差不大) - batch_size
理论上较小的batch_size可以较快到达高精度,但是波动较大,经过多次实验选取了合适的batch_size。 - 优化器
使用Adam作为优化器,Adam存储了过去梯度平方的指数衰减平均值 ,也保持了过去梯度的指数衰减平均值。 - 学习率
~~调整较小的学习率,收敛较慢但精度较高。适当增大了最大轮数以及早停轮数。~~使用默认学习率。 - 训练样本
在找到较好的一组参数后,使用所有训练样本进行模型的训练(不推荐,因为没有验证集早停策略不起效)。 - 调整训练集对验证集的数据比例(例如由10:1改为15:1)训练的模型在测试集上能有更好表现
- 针对影像的限制(CNN>fully-connected全连接)
首次训练
- 不管什么模型,先在一个较小的训练集上train和test,看看它能不能过拟合。如果不能过拟合,可能是学习率太大,或者代码写错了。先调小学习率试一下,如果还不行就去检查代码,先看dataloader输出的数据对不对,再看模型每一步的size是否符合自己期待。
- 看train/eval的loss曲线,正常的情况应该是train loss呈log状一直下降最后趋于稳定,eval loss开始时一直下降到某一个epoch之后开始趋于稳定或开始上升,这时候可以用early stopping保存eval loss最低的那个模型。如果loss曲线非常不正常,很有可能是数据处理出了问题,比如label对应错了,回去检查代码。
- 不要一开始就用大数据集,先在一个大概2w训练集,2k测试集的小数据集上调参。
- 尽量不要自己从头搭架子(新手和半新手)。找一个已经明确没有bug能跑通的其它任务的架子,在它的基础上修改。否则debug过程非常艰难,因为有时候是版本迭代产生的问题,修改起来很麻烦。
- 优化器优先用adam,学习率设1e-3或1e-4,再试Radam(LiyuanLucasLiu/RAdam)。不推荐sgdm,因为很慢。
- lrscheduler用torch.optim.lr_scheduler.CosineAnnealingLR,T_max设32或64,几个任务上试效果都不错。(用这个lr_scheduler加上adam系的optimizer基本就不用怎么调学习率了)
- 有一些任务(尤其是有RNN的)要做梯度裁剪,torch.nn.utils.clip_grad_norm。
- 参数初始化,lstm的h用orthogonal,其它用he或xavier。
- 激活函数用relu一般就够了,也可以试试leaky relu。
- batchnorm和dropout可以试,放的位置很重要。优先尝试放在最后输出层之前,以及embedding层之后。RNN可以试layer_norm。有些任务上加了这些层可能会有负作用。
- metric learning中先试标label的分类方法。然后可以用triplet loss,margin这个参数的设置很重要。
- batchsize设置小一点通常会有一些提升,某些任务batchsize设成1有奇效。
- embedding层的embedsize可以小一些(64 or 128),之后LSTM或CNN的hiddensize要稍微大一些(256 or 512)。(ALBERT论文里面大概也是这个意思)
- 模型方面,可以先用2或3层LSTM试一下,通常效果都不错。
- weight decay可以试一下,我一般用1e-4。
- 有CNN的地方就用shortcut。CNN层数加到某一个值之后对结果影响就不大了,这个值作为参数可以调一下。
- GRU和LSTM在大部分任务上效果差不多。
- 看论文时候不要全信,能复现的尽量复现一下,许多论文都会做低baseline,但实际使用时很多baseline效果很不错。
- 对于大多数任务,数据比模型重要。面对新任务时先分析数据,再根据数据设计模型,并决定各个参数。例如nlp有些任务中的padding长度,通常需要达到数据集的90%以上,可用pandas的describe函数进行分析。
优化不足
optimization
通过H essian判断是local minima、global minima、saddle point((马)鞍点)
对比模型
从小的模型开始训练(容易优化的模型)
欠拟合
欠拟合原因:
1,训练样本数量少
2,模型复杂度过低
3,参数还未收敛就停止循环
欠拟合的解决办法:
1,增加样本数量
2,增加模型参数,提高模型复杂度
3,增加循环次数
4,查看是否是学习率过高导致模型无法收敛
过拟合处理
过拟合原因:
1,数据噪声太大
2,特征太多
3,模型太复杂
特征增加
- 增加训练集
- 数据增加(augmentation):左右翻转、放大、色调改变
模型减少弹性
- 减少或公用模型参数(减少神经元,相同的参数),降低模型复杂度
- 减少特征(三天到两天)
- early stopping后面讲
- regularization正则化
- dropout
梯度消失和爆炸:
层数较多的神经网络模型在训练时有时会出现梯度消失和梯度爆炸问题, 本质上是由梯度反向传播过程中的连乘效应导致网络权值更新不稳定造成的