使用MindSpore调试调优中的算法问题

在模型训练过程的算法问题中,主要从:API使用问题、计算图结构问题、权重初始化问题分析。

  1. API使用问题

    常见API使用问题如下:

    使用MindSpore调试调优中的算法问题_第1张图片

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

    构图未遵循construct约束,是指图模式下的网络未遵循静态图语法支持中声明的约束。例如,MindSpore目前不支持对带键值对参数的函数求反向。

  3. 计算图结构问题

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

    使用MindSpore调试调优中的算法问题_第2张图片

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

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

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

    节点模式不正确,是指部分区分训练、推理模式的算子,需要按照实际情况设置模式。典型的包括:

    (1)BatchNorm算子,训练时应打开BatchNorm的训练模式,此开关在调用 net.set_train(True)的时候会自动打开

    (2)DropOut算子,推理时不应使用DropOut算子。

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

  5. 权重初始化问题

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

    使用MindSpore调试调优中的算法问题_第3张图片

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

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

  7. 完整checklist

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

    使用MindSpore调试调优中的算法问题_第4张图片

    使用MindSpore调试调优中的算法问题_第5张图片

你可能感兴趣的:(python,机器学习,深度学习,人工智能,算法)