跳至主要內容

Loss 相关问题

BradZhone大约 3 分钟DeepLearningLoss

Loss 相关问题

  1. loss 不收敛

    • 欠拟合

      • 特征:训练集上loss始终和初始大小相当,accuracy很低

      • 网络拟合能力不足

        • 每一个batch使用相同的数据训练,检查loss和acc是否有变化来判断
        • 改进:增加网络深度(层数),宽度(神经元数量)
      • 网络配置问题

        • 权重初始化是否合理

        • 初始化方式备注
          全零初始化 Zeros造成网络对称,所有神经元进行相同参数更新
          全1初始化 Ones造成网络对称,所有神经元进行相同参数更新
          初始化为固定值value Constant造成网络对称,所有神经元进行相同参数更新
          随机正态分布初始化 RandomNormal
          随机均匀分布初始化 RandomUniform
          截尾高斯分布初始化 TruncatedNormal
          VarianceScaling
          用随机正交矩阵初始化Orthogonal
          使用单位矩阵初始化 Identiy
          LeCun均匀分布初始化方法 lecun_uniform
          LeCun正态分布初始化方法 lecun_normal
          Glorot正态分布初始化方法 glorot_normal
          Glorot均匀分布初始化 glorot_uniform一种均值为0,以0为中心的对称区间均匀分布的随机数;接近于0的均匀分布会导致梯度消失
          He正态分布初始化 he_normal
          He均匀分布初始化 he_uniform
        • 使用适当的激活函数

        • 激活函数备注
          ReLU一般用于卷积层、全连接层
          tanh一般用于循环层
          softmax一般用于全连接层做输出层
          sigmoid不常用
        • 使用适当的优化器和学习率

        • 未进行归一化导致尺度不平衡,误差增大

      • 人工构造少量数据反复训练,看是否下降。若不下降,则可能脚本有问题,若下降,则超参可能有问题

      • 梯度检查

  2. loss 为nan,inf

    • 100个iter内出现可能是学习率过高
    • 若为rnn之类的网络,可能是梯度爆炸,可增加梯度截断(gradient clipping)
    • 梯度消失:导数特别小,导致连乘接近无穷小(输入数据太小,或输出数据落在激活函数饱和区),使loss不下降,但不会出现nan和inf
    • 梯度爆炸:导数特别大,导致连乘特别大,超出表示范围(输入数据未归一化(减均值,除方差,加入BN,L2等normalization方法)),可能出现inf
    • batchNorm层很多时,检查tensor输入该层后是否变为nan(可能因为训练集和验证集是不同的分布,使移动均值和移动方差为nan,可设置track_runing_stats=False禁用)
    • 每个batch前梯度要清零optimizer.zero_grad
    • 0做除数,0或负数做对数(loss正常下降,突然出现nan。可对预测数据增加最小值偏移,避免小于等于0),根号下要大于0,同时要加个Epsilon,因为开根号的导数,变量在分母上,不加Epsilon导数就成了nan
    • 计算loss的数组越界
    • 涉及指数计算时算得无穷:$\frac{e{x}}{e{y}}=\frac{INF}{INF}=NAN$ ,可减去最大值处理
    • label缺失
    • 输入数据就含有NAN(使用简单的网络读取输入进行检查)
    • 使用不同精度数据,loss超过精度类型最大范围
    • pooling步长大于核尺寸
  3. loss 为负

    • https://blog.csdn.net/qq_43733107/article/details/128915638