关于调参

https://blog.csdn.net/angnuan123/article/details/81604727
1.关于优化器
self.optimizer = torch.optim.RMSprop( self.model.parameters(), lr=learning_rate, weight_decay=reg_par)
2.关于学习率的调整
(1)首先在一开始的时候我们可以给我们的网络赋一个“经验性”的学习率
lr=1e-3
(2)给不同层给予不同的学习率

# 直接对不同的网络模块制定不同学习率 classifiter的学习率设置为1e-2,所有的momentum=0.9

optimizer = optim.SGD([{‘params’: net.features.parameters()}, # 默认lr是1e-5
{‘params’: net.classifiter.parameters(), ‘lr’: 1e-2}], lr=1e-5,momentum=0.9)

##=======================以层为单位,为不同层指定不同的学习率 #

提取指定层对象为classifiter模块的第0个和第3个

special_layers = t.nn.ModuleList([net.classifiter[0], net.classifiter[3]])

## 获取指定层参数id

special_layers_params = list(map(id, special_layers.parameters()))print(special_layers_params)

## 获取非指定层的参数id

base_params = filter(lambda p: id§ not in special_layers_params, net.parameters())

optimizer = t.optim.SGD([{‘params’: base_params},
{‘params’: special_layers.parameters(), ‘lr’: 0.01}], lr=0.001)

(3)动态调整学习率
网络性能越好,学习率要越小
当你发现你的loss在训练过程中居然还上升了,那么一般来讲,是你此时的学习率设置过大了。这时候我们需要动态调整我们的学习率:
def adjust_learning_rate(optimizer, epoch, t=10):
“”“Sets the learning rate to the initial LR decayed by 10 every t epochs,default=10"”"
new_lr = lr * (0.1 ** (epoch // t))
for param_group in optimizer.param_groups:
param_group[‘lr’] = new_lr

官方文档中还给出用
torch.optim.lr_scheduler 基于循环的次数提供了一些方法来调节学习率.
torch.optim.lr_scheduler.ReduceLROnPlateau 基于验证测量结果来设置不同的学习率.

(4)可以加一个learningrate随着loss下降速度自动降低,也是万金油。

3.正则化防止过拟合
(1)weight decay(权值衰减),其最终目的是防止过拟合。
在机器学习或者模式识别中,会出现overfitting,而当网络逐渐overfitting时网络权值逐渐变大。
为了避免出现overfitting,会给误差函数添加一个惩罚项,常用的惩罚项是所有权重的平方乘以一个衰减常量之和。其用来惩罚大的权值。
在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度。
所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。

(2)这个在定义优化器的时候可以通过参数 【weight_decay,一般建议0.0005】来设置:

opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99), eps=1e-06, weight_decay=0.0005)

4.batch_normalization
https://blog.csdn.net/hjimce/article/details/50866313
batch normalization的是指在神经网络中激活函数的前面,将按照特征进行normalization,这样做的好处有三点:
(1)提高梯度在网络中的流动。Normalization能够使特征全部缩放到[0,1],这样在反向传播时候的梯度都是在1左右,避免了梯度消失现象。
(2)提升学习速率。归一化后的数据能够快速的达到收敛。
(3)减少模型训练对初始化的依赖。
(4)减少参数选择的依赖

5.加入dropout层:dropout一般设置为0.5
分类问题用dropout,只需要最后一层softmax前面基本就可以了,能够防止过拟合,可能对accuracy提高不大,但是dropout前面那层如果是之后要用的feature的话,性能会大大提升

6.随时存档,要有validation。把每个epoch和对用的validation结果存下来,分析出开始overfitting的时间点,方便下次加载fine-tuning

7.batchsize的影响通常没有那么大,塞满卡进行,除了特殊的算法需要batch大一点。

others :
关于loss的一些说明:
1 train loss 不断下降,test loss 不断下降,说明网络正在学习

2 train loss 不断下降,test loss 趋于不变,说明网络过拟合

3 train loss 趋于不变,test loss 趋于不变,说明学习遇到瓶颈,需要减小学习率或者批处理大小

4 train loss 趋于不变,test loss 不断下降,说明数据集100%有问题

5 train loss 不断上升,test loss 不断上升(最终变为NaN),可能是网络结构设计不当,训练超参数设置不当,程序bug等某个问题引起

6 train loss 不断上下跳动,可能引起的原因:学习率过大,或者批处理大小太小

归一化说明:
在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?
原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
另外一方面,一旦每批训练数据的分布各不相同(batch
梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。

Dropout:Dropout大多数论文上设置都是0.5,据说0.5的效果很好,能够防止过拟合问题,但是在不同的task中,还需要适当的调整dropout的大小,出来要调整dropout值之外,dropout在model中的位置也是很关键的,可以尝试不同的dropout位置,或许会收到惊人的效果。
迭代次数:根据自己的task、model、收敛速度、拟合效果设置不同的值
pytorch中实现了L2正则化,也叫做权重衰减,具体实现是在优化器中,参数是 weight_decay(pytorch中的L1正则已经被遗弃了,可以自己实现),一般设置1e-8

调参经验:
https://yifdu.github.io/2018/11/18/pytorch调参经验%EF%BC%88一%EF%BC%89/#more

6.自动调参方法:
(1)Grid Search:网格搜索,在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。
(2)Random Search:经验上,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。另外Random Search往往会和由粗到细的调参策略结合使用,即在效果比较好的参数附近进行更加精细的搜索。
(3)Bayesian Optimization:贝叶斯优化,考虑到了不同参数对应的 实验结果值,因此更节省时间,贝叶斯调参比Grid Search迭代次数少, 速度快;而且其针对非凸问题依然稳健。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值