Framework : Pytorch
问题一:SoftmaxLoss+CenterLoss,SoftmaxLoss不收敛。
解决: 1.调整SoftmaxLoss学习率
2.(关键)自定义的CenterLoss.backward()出错
文档中所计算的梯度是 sum_batchsize, 计算delta c时切记 /batch_size!
问题二:过拟合
解决:1.保证train 和 val 除了dataloader之外其他函数相同。
2.dropout
3.weight_decay
4.看验证集精度 出现波动的时刻
问题三:学习率
学习率一般取保证收敛范围内最大的那一个——保证充分训练
问题四:optimizer的选取
Adam 与 SGD 要慎重选择
问题五:一些小tips(来自知乎专栏 https://zhuanlan.zhihu.com/p/32338983 )
- 首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑****SGD+Nesterov Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam)
- 选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。
- 充分了解你的数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
- 根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。
- 先用小数据集进行实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
- 考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。切换策略可以参考本文介绍的方法。
- 数据集一定要充分的打散(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。
- 训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。
- 制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。