Loss 相关问题
大约 3 分钟
Loss 相关问题
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 不常用 使用适当的优化器和学习率
未进行归一化导致尺度不平衡,误差增大
人工构造少量数据反复训练,看是否下降。若不下降,则可能脚本有问题,若下降,则超参可能有问题
梯度检查
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步长大于核尺寸
loss 为负
- https://blog.csdn.net/qq_43733107/article/details/128915638