使用MindSpore训练模型的检查loss曲线

有的模型训练的精度问题要到动态的训练过程中才会发现,这是就需要检查输入数据和loss曲线。

  1. 检查loss曲线

    很多精度问题会在网络训练过程中发现,常见的问题或现象有:

    ·权重初始化不合理(例如初始值为0,初始值范围不合理等);

    ·权重中存在过大、过小值;

    ·权重变化过大;

    ·权重冻结不正确;

    ·权重共享不正确;

    ·激活值饱和或过弱(例如Sigmoid的输出接近1,Relu的输出全为0);

    ·梯度爆炸、消失;

    ·训练epoch不足;

    ·算子计算结果存在NAN、INF;

    ·算子计算过程溢出(计算过程中的溢出不一定都是有害的)等。

  2. 上述这些问题或现象,有的可以通过loss表现出来,有的则难以观察。MindInsight提供了针对性的功能,可以观察上述现象、自动检查问题,帮助更快定位问题根因。例如:

    ·MindInsight的参数分布图模块可以展示模型权重随训练过程的变化趋势;

    ·MindInsight的张量可视模块可以展示张量的具体取值,对不同张量进行对比;

    ·MindInsight调试器内置了种类丰富,功能强大的检查能力,可以检查权重问题(例如权重不更新、权重更新过大、权重值过大/过小)、梯度问题(例如梯度消失、梯度爆炸)、激活值问题(例如激活值饱和或过弱)、张量全为0、NAN/INF、算子计算过程溢出等问题。

    使用MindSpore训练模型的检查loss曲线_第1张图片

  3. 通过MindInsight训练看板中的标量可视模块查看loss曲线

    大多数情况下,SummaryCollector会自动记录模型的loss曲线,可以通过MindInsight的标量可视模块查看。loss曲线能够反映网络训练的动态趋势,通过观察loss曲线,可以得到模型是否收敛、是否过拟合等信息。

    使用MindSpore训练模型的检查loss曲线_第2张图片

  4. 通过MindInsight参数分布图可以查看训练过程中的权重变化情况

    大多数情况下,SummaryCollector会自动记录模型参数变化情况(默认记录5个参数),可以通过MindInsight的参数分布图模块查看。

    使用MindSpore训练模型的检查loss曲线_第3张图片

  5. 通过MindInsight训练看板中的张量可视模块查看特定张量的具体取值

    张量不会被自动记录,如果想要通过MindInsight查看张量的具体取值,请使用TensorSummary算子。

    下面结合loss曲线的常见现象介绍使用MindInsight进行精度问题定位的思路。

  6. loss跑飞

    loss跑飞是指loss中出现了NAN、+/-INF或者特别大的值。loss跑飞一般意味着算法设计或实现存在问题。定位思路如下:

    回顾脚本、模型结构和数据,

    检查超参是否有不合理的特别大/特别小的取值,

    检查模型结构是否实现正确,特别是检查loss函数是否实现正确,

    检查输入数据中是否有缺失值、是否有特别大/特别小的取值。

    观察训练看板中的参数分布图,检查参数更新是否有明显的异常。若发现参数更新异常,可以结合调试器定位参数更新异常的原因。

    使用调试器模块对训练现场进行检查。

    若loss值出现NAN、+/-INF,可使用“检查张量溢出”条件添加全局监测点,定位首先出现NAN、+/-INF的算子节点,检查算子的输入数据是否会导致计算异常(例如除零)。若是算子输入数据的问题,则可以针对性地加入小数值epsilon避免计算异常。

    若loss值出现特别大的值,可使用“检查过大张量”条件添加全局监测点,定位首先出现大值的算子节点,检查算子的输入数据是否会导致计算异常。若输入数据本身存在异常,则可以继续向上追踪产生该输入数据的算子,直到定位出具体原因。

    若怀疑参数更新、梯度等方面存在异常,可使用“检查权重变化过大”、“检查梯度消失”、“检查梯度过大”等条件设置监测点,定位到异常的权重或梯度,然后结合张量检查视图,逐层向上对可疑的正向算子、反向算子、优化器算子等进行检查。

  7. loss收敛慢

    loss收敛慢是指loss震荡、收敛速度慢,经过很长时间才能达到预期值,或者最终也无法收敛到预期值。相较于loss跑飞,loss收敛慢的数值特征不明显,更难定位。定位思路如下:

    回顾脚本、模型结构和数据,

    检查超参是否有不合理的特别大/特别小的取值,特别是检查学习率是否设置过小或过大,学习率设置过小会导致收敛速度慢,学习率设置过大会导致loss震荡、不下降;

    检查模型结构是否实现正确,特别是检查loss函数、优化器是否实现正确;

    检查输入数据的范围是否正常,特别是输入数据的值是否过小

    观察训练看板中的参数分布图,检查参数更新是否有明显的异常。若发现参数更新异常,可以结合调试器定位参数更新异常的原因。

    使用调试器模块对训练现场进程检查。

    可使用“检查权重变化过小”、“检查未变化权重”条件对可训练(未固定)的权重进行监测,检查权重是否变化过小。若发现权重变化过小,可进一步检查学习率取值是否过小、优化器算法是否正确实现、梯度是否消失,并做针对性的修复。

    可使用“检查梯度消失”条件对梯度进行监测,检查是否存在梯度消失的现象。若发现梯度消失,可进一步向上检查导致梯度消失的原因。例如,可以通过“检查激活值范围”条件检查是否出现了激活值饱和、Relu输出为0等问题。

  8. 其它loss现象

    若训练集上loss为0,一般说明模型出现了过拟合,请尝试增大训练集大小。

你可能感兴趣的:(自然语言处理,深度学习)