[深度学习] - 通用网络模型训练过程的 loss 变化分析方法 (loss / val_loss / test_loss)
·
目录
二、分析 loss 和 val_loss (test_loss) 变化情况
一、train set 和 test set 基础知识
- train set:训练集是用来训练网络模型的数据集。
- test set:测试集用来评估网络性能的数据集。默认测试集是不参与网络训练,仅用来测试网络性能。
- 附:development set(也可称为 validation set),主要用来二次微调整、选择特征以及对学习算法作出其他优化的数据集。常规的训练集和测试集的比例为 0.7 : 0.3,引入验证集后常采用 0.6 : 0.2 : 0.2(现在使用较少)。在保证算法稳定的情况下,训练集和测试集的选取会对输出结果的指标造成不同层次的影响(主要还是数据集的分布特性影响)。
二、分析 loss 和 val_loss (test_loss) 变化情况
- 通常回调显示的 loss 有很多种,如一个总 total_loss 多个子 sub_loss 。但本文主要分析最基础的训练情况(只有一个训练 loss,和一个验证 loss)。下文用 loss 代表训练集的损失值(墨守成规不写成 train_loss);val_loss 代表验证集的损失值(也写成 test_loss)。
- 一般训练规律:
loss | val_loss | 网络情况 |
下降↓ | 下降↓ |
|
下降↓ | 稳定/上升↑ |
|
稳定 | 下降↓ |
|
快速稳定 | 快速稳定 |
|
上升↑ | 上升↑ |
|
注意:上面提到的“下降”、“稳定”和“上升”是指整体训练趋势。 |
第一次补充:
- 一系列的损失值能反应网络在训练过程的“健康程度”(当某一刻损失发生突变,并且一直没恢复,那就说明不健康了)。
- 权重文件可以每轮都保存,但是个人推荐选择最优评价指标保存。
- 上面总结仅是广义规律,是用于辅助学习而总结,不保证适用于所有网络。
- 当网络训练跑偏了后,先检查自己写的网络是否存在小错误。然后检查数据集是否有问题(如果是开源数据集,可以先分个小样本训练来检测网络是否设计问题。如果是自定义数据集,可用一些能处理通用任务的网络(如 Unet 或 ResNet)跑一下来检测)
第二次补充:
- 为什么说现在有些网络不怎么使用“训练集(0.6)、验证集(0.2)、测试集(0.2)”的划分:其实在大规模的数据集中尤其是开源数据集,很多图像相关特征或者语义分布是集中的。理论上,验证集能一定程度的提高网络学习的全局最优,用来调整网络的学习率优化。但是当训练集和验证的特征分布充分接近时,验证的调整效果就会越来越不明显,所以甚至大家会在开源代码中发现还有使用“训练集(0.9)、测试集(0.1)”的划分。当然不是说验证集就没什么用,个人经验表示:可以向验证集添加多种 data augmentation 来优化训练(如:训练的 size:256x256,验证的 size:512*512。亦或者训练集的 data augmentation 和验证集不一样)。当然这些东西还需要大家去“炼丹”对比。
第三次补充:
- 很多朋友都在问各种 loss 不正常的原由,其实在正文里面就写了:loss的变化情况只能得出一般规律。光凭 loss 变化没法得出一个确切的问题结论。文中提出的规律是方便大家网络调参。一旦网络跑飞了需要结合 loss、评价指标、输出信息(或图像)等一系列结果综合分析。而本文不是提供错误分析的,对应的错误分析需要大家在互联网上搜索、找相关领域的专业人员提问。同时第二次补充的策略虽然有提高网络泛化的作用,但是在高性能网络中需要合理调参,要避免过拟合现象(吐槽:当网络规模远大于数据集规模时,是很容易过拟合的)。
更多推荐
已为社区贡献3条内容
所有评论(0)