今天总结一下算法工程师在遇到问题时的解决方法。
比如,在训练的时候梯度是在变化,损失也在下降,看似一切正常,但是预测的结果却全部值为零,或全是正样本,生成的全是重复的无意义的字符:“啊啊啊啊啊啊啊啊”。
检查流程
- 复杂的模型换成简单的模型(Tramsformer -> LSTM)。
- 暂时去掉不必要的数据预处理环节(正则化,数据增强模块)。
- 验证输入数据的正确性(数据大小,padding,index)。
- 取较小的数据集,故意让它过拟合,利用训练样本进行测试,看其预测结果与golden standard是不是完全一样。【当充分训练后再测试,一定是完全一样;非充分训练时可能不是】
- 加入之前忽略的项(正则等)
数据集
- 再次检查输入数据。例如混淆了batch,length的维度,打印或显示一批,确保正确。
- 随机输入维度相同的数据,看产生错误的方式是否一样。如果是,说明网络把数据变成了垃圾。可尝试逐层调试,并查看出错的地方。
- 确保输入样本与输出的匹配性。
- 确认是否太多噪声(样本标注错误)。噪声太多很难用DL模型。
- 打乱数据集。鲁棒性
- 是否类别失衡
- 确保数据集不是单一的标签。
- 减少训练的batch_size到合适的大小(8、32、64)
数据归一化
- 归一化特征
- 数据是否足够(是否一致欠拟合)。现象:Loss下不去。
实现的问题
- 试着解决问题的更简单的版本(baseline)
- 检查损失函数(自己实现的损失函数,增加测试单元)
- 核实损失函数输入
- 更换其他指标监控模型。
- 检查是否在一些层无意中阻止了梯度的更新。
- 扩大网络规模
- 探索维度误差
训练的问题
- 使用一个小的数据集,确保模型能work
- 检查权重的初始化,使用Xavier或者其他初始化
- 改变超参(length norm)
- 减小正则化
- 尝试使用不同的优化器(Adam -> SGD)
- 梯度消失或爆炸(同时进行梯度阶段)
- 增加减小学习率
Pycharm在debug时:
-
打断点,结合step over、step into等控制流程。
-
有小计算器形状的图标,可以对变量进行计算。
-
有condition step的方法,debug到符合条件的地方。在断点处右键。
Tensorboard可视化(可选,有经验的可以不用)