算法工程师的Bug与Debug

今天总结一下算法工程师在遇到问题时的解决方法。

比如,在训练的时候梯度是在变化,损失也在下降,看似一切正常,但是预测的结果却全部值为零,或全是正样本,生成的全是重复的无意义的字符:“啊啊啊啊啊啊啊啊”。

检查流程

  1. 复杂的模型换成简单的模型(Tramsformer -> LSTM)。
  2. 暂时去掉不必要的数据预处理环节(正则化,数据增强模块)。
  3. 验证输入数据的正确性(数据大小,padding,index)。
  4. 较小的数据集,故意让它过拟合,利用训练样本进行测试,看其预测结果与golden standard是不是完全一样。【当充分训练后再测试,一定是完全一样;非充分训练时可能不是】
  5. 加入之前忽略的项(正则等)

数据集

  1. 再次检查输入数据。例如混淆了batch,length的维度,打印或显示一批,确保正确。
  2. 随机输入维度相同的数据,看产生错误的方式是否一样。如果是,说明网络把数据变成了垃圾。可尝试逐层调试,并查看出错的地方。
  3. 确保输入样本与输出的匹配性。
  4. 确认是否太多噪声(样本标注错误)。噪声太多很难用DL模型。
  5. 打乱数据集。鲁棒性
  6. 是否类别失衡
  7. 确保数据集不是单一的标签。
  8. 减少训练的batch_size到合适的大小(8、32、64)

数据归一化

  1. 归一化特征
  2. 数据是否足够(是否一致欠拟合)。现象:Loss下不去。

实现的问题

  1. 试着解决问题的更简单的版本(baseline)
  2. 检查损失函数(自己实现的损失函数,增加测试单元)
  3. 核实损失函数输入
  4. 更换其他指标监控模型。
  5. 检查是否在一些层无意中阻止了梯度的更新。
  6. 扩大网络规模
  7. 探索维度误差

训练的问题

  1. 使用一个小的数据集,确保模型能work
  2. 检查权重的初始化,使用Xavier或者其他初始化
  3. 改变超参(length norm)
  4. 减小正则化
  5. 尝试使用不同的优化器(Adam -> SGD)
  6. 梯度消失或爆炸(同时进行梯度阶段)
  7. 增加减小学习率

Pycharm在debug时:

  • 打断点,结合step over、step into等控制流程。

  • 有小计算器形状的图标,可以对变量进行计算。

  • 有condition step的方法,debug到符合条件的地方。在断点处右键。

Tensorboard可视化(可选,有经验的可以不用)

原文地址:https://www.cnblogs.com/elisha/p/14024763.html