zoukankan      html  css  js  c++  java
  • 算法工程师的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可视化(可选,有经验的可以不用)

  • 相关阅读:
    poj 最长公共子序列 1458 记忆式搜索
    选择排序
    直接 插入排序
    直接插入排序
    洛谷-P3389-高斯消元
    经济中的哪些概念
    uva-622-dp
    UVA-607-DP
    转转---面试题
    Linux事件驱动IO中select vs epoll
  • 原文地址:https://www.cnblogs.com/elisha/p/14024763.html
Copyright © 2011-2022 走看看