MindSpore模型精度调优实战(三)常见精度问题简介

转载地址:https://bbs.huaweicloud.com/forum/thread-119271-1-1.html

作者: archimekai

MindSpore模型精度调优实战(三):

常见精度问题简介

MindSpore团队

引子:在模型的开发过程中,精度达不到预期常常让人头疼。为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight。我们还梳理了针对常见精度问题的调试调优指南,将以“MindSpore模型精度调优实战”系列文章的形式分享出来,希望能帮助用户轻松定位精度问题,快速优化模型精度。

本文是系列分享的第三篇,将简单介绍常见精度问题,使得读者能够根据精度问题现象,判断出可能的原因。本系列分享假设您的脚本已经能够运行并算出loss值。如果脚本还不能运行,请先参考相关报错提示进行修改。

在精度调优实践中,经常有发现异常现象,但是对异常现象不够敏感,不会解释,导致同精度问题根因失之交臂。本文对常见精度问题进行了解释,希望能帮你提高定位精度问题的能力。

1      数据问题

  1.1 数据集问题

数据集的质量决定了算法效果的上限,如果数据质量差,再好的算法也难以得到很好的效果。常见数据集问题如下:

常见数据集问题

数据集中缺失值过多

数据集中存在异常值

数据的标签错误

数据集每个类别的样本数目不均衡

训练样本不足

数据集中存在缺失值、异常值,会导致模型学习到错误的数据关系。一般来说,应该从训练集中删除存在缺失值或异常值的数据,或者设置合理的默认值。数据标签错误是异常值的一种特殊情况,但是这种情况对训练的破坏性较大,应通过抽查输入模型的数据等方式提前识别这类问题。

数据集中每个类别的样本数目不均衡,是指数据集中每个类别中的样本数目有较大差距。例如,图像分类数据集(训练集)中,大部分类别都有1000个样本,但是“猫”这一类别只有100个样本,就可以认为出现了样本数目不均衡的情况。样本数目不均衡会导致模型在样本数目少的类别上预测效果差。如果出现了样本数目不均衡,应该酌情增加样本量小的类别的样本。作为参考,一般来说,有监督深度学习算法在每类5000个标注样本的情况下将达到可以接受的性能,当数据集中有1000万个以上的已标注样本时,模型的表现将会超过人类。

训练样本不足则是指训练集相对于模型容量太小。训练样本不足会导致训练不稳定,且容易出现过拟合。如果模型的参数量同训练样本数量不成比例,应该考虑增加训练样本或者降低模型复杂度。

 1.2 数据处理问题

常见数据处理问题如下:

常见数据处理算法问题

未对数据进行归一化或标准化

数据处理方式和训练集不一致

没有对数据集进行shuffle

未对数据进行归一化或标准化,是指输入模型的数据,各个维度不在一个尺度上。一般来说,模型要求各个维度的数据在-1到1之间,均值为0。如果某两个维度的尺度存在数量级的差异,可能会影响模型的训练效果,此时需要对数据进行归一化或标准化。

数据处理方式和训练集不一致是指在使用模型进行推理时,处理方式和训练集不一致。例如对图片的缩放、裁切、归一化参数和训练集不同,会导致推理时的数据分布和训练时的数据分布产生差异,可能会降低模型的推理精度。备注:一些数据增强操作(如随机旋转,随机裁切等)一般只应用在训练集,推理时无需进行数据增强。

没有对数据集进行shuffle,是指训练时未对数据集进行混洗。未进行shuffle,或者混洗不充分,会导致总是以相同的数据顺序更新模型,严重限制了梯度优化方向的可选择性,导致收敛点的选择空间变少,容易过拟合。

2      超参问题

超参是模型和数据之间的润滑剂,超参的选择直接影响了模型对数据拟合效果的优劣。超参方面常见的问题如下:

常见超参问题

学习率过大

学习率过小

epoch过大

epoch过小

batch size过大

学习率过大或过小。学习率可以说是模型训练中最重要的超参了。学习率过大,会导致loss震荡,不能收敛到预期值。学习率过小,会导致loss收敛慢。应根据理论和经验合理选择学习率策略。

epoch过大或过小。epoch数目直接影响模型是欠拟合还是过拟合。epoch过小,模型未训练到最优解就停止了训练,容易欠拟合;epoch过大,模型训练时间过长,容易在训练集上过拟合,在测试集上达不到最优的效果。应根据训练过程中验证集上模型效果的变化情况,合理选择epoch数目。

batch size过大。batch size过大时,模型可能不能收敛到较优的极小值上,从而降低模型的泛化能力。

3      算法问题

3.1      API使用问题

常见API使用问题如下:

常见API使用问题

使用API没有遵循MindSpore约束

构图时未遵循MindSpore construct约束

使用API未遵循MindSpore约束,是指使用的API和真实应用的场景不匹配。例如,在除数中可能含有零的场景,应该考虑使用DivNoNan而非Div以避免产生除零问题。又例如,MindSpore中,DropOut第一个参数为保留的概率,和其它框架正好相反(其它框架为丢掉的概率),使用时需要注意。

构图未遵循MindSpore construct约束,是指图模式下的网络未遵循MindSpore静态图语法支持中声明的约束。例如,MindSpore目前不支持对带键值对参数的函数求反向。完整约束请见 https://mindspore.cn/doc/note/zh-CN/master/static_graph_syntax_support.html 。

3.2      计算图结构问题

计算图结构是模型计算的载体,计算图结构错误一般是实现算法时代码写错了。计算图结构方面常见的问题有:

常见计算图结构问题

权重共享错误

权重冻结错误

节点连接错误

节点模式不正确

loss函数有误

权重共享错误,是指应该共享的权重未共享,或者不应该共享的权重共享了。通过MindInsight计算图可视,可以检查这一类问题。

权重冻结错误,是指应该冻结的权重未冻结,或者不应该冻结的权重冻结了。在MindSpore中,冻结权重可以通过控制传入优化器的params参数来实现。未传入优化器的Parameter将不会被更新。可以通过检查脚本,或者查看MindInsight中的参数分布图确认权重冻结情况。

节点连接错误,是指计算图中各block的连接和设计不一致。如果发现节点连接错误,应该仔细检查脚本是否编写出错。

节点模式不正确,是指部分区分训练、推理模式的算子,需要按照实际情况设置模式。典型的包括:(1)BatchNorm算子,训练时应打开BatchNorm的训练模式,此开关在调用 net.set_train(True)的时候会自动打开(2)DropOut算子,推理时不应使用DropOut算子。

loss函数有误,是指loss函数算法实现错误,或者未选择合理的loss函数。例如,BCELoss和BCEWithLogitsLoss是不同的,应根据是否需要sigmoid函数合理选择。

3.3      权重初始化问题

权重初始值是模型训练的起点,不合理的初始值将会影响模型训练的速度和效果。权重初始化方面常见问题如下:

常见权重初始化问题

权重初始值全部为0

分布式场景不同节点的权重初始值不同

权重初始值全为0,是指初始化后,权重值为0。这一般会导致权重更新问题,应使用随机值初始化权重。

分布式场景不同节点的权重初始值不同,是指初始化后,不同节点上的同名权重初始值不同。正常来说,MindSpore会对梯度做全局AllReduce。确保每个step结尾,权重更新量是相同的,从而保证每个step中,各个节点上的权重一致。如果初始化时各节点的权重不同,就会导致不同节点的权重在接下来的训练中处于不同的状态,会直接影响模型精度。分布式场景应通过固定相同的随机数种子等方式,确保权重的初始值一致。

4      完整checklist

最后,我们将常见的精度问题汇总到一起,以方便大家查阅:

常见数据集问题

数据集中缺失值过多

数据集中存在异常值

数据的标签错误

数据集每个类别的样本数目不均衡

训练样本不足

常见数据处理算法问题

未对数据进行归一化或标准化

数据处理方式和训练集不一致

没有对数据集进行shuffle

常见超参问题

学习率过大

学习率过小

epoch过大

epoch过小

batch_size过大

常见API使用问题

使用API没有遵循MindSpore约束

构图时未遵循MindSpore construct约束

常见计算图结构问题

权重共享错误

权重冻结错误

节点连接错误

节点模式不正确

loss函数有误

常见权重初始化问题

权重初始值全部为0

分布式场景不同节点的权重初始值不同

  5 欢迎关注我们

MindSpore官网: https://www.mindspore.cn/

MindSpore代码仓库: https://gitee.com/mindspore/mindspore

MindInsight代码仓库: https://gitee.com/mindspore/mindinsight

MindInsight使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/visualization_tutorials.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值