调参不收敛?翻开机器学习笔记找这3个坑
对着终端里那条死活不下降的loss曲线,你是不是也想过直接Ctrl+C?别急,这份机器学习笔记里记着几个要命的问题,我替你踩过了。
先别急着调参,这3个常见错误我替你踩了
第一个坑:学习率调了又调,模型就是不收敛。你看到loss像过山车一样上蹿下跳,那很可能是学习率设得太大了。反过来,loss下降得比蜗牛还慢,则多半是学习率太小。怎么办?翻翻你的机器学习笔记,看看有没有记录学习率调多大的调试策略——从0.1开始指数衰减,或者用循环学习率,总比瞎蒙强。另外,试试学习率预热策略:先从小学习率开始,逐渐增大到目标值,能稳定训练。比如使用cosine annealing调度器,能自动调整学习率。
第二个坑:loss卡在某个数值半个月不动,你怀疑人生了。这大概率是梯度消失怎么判断的问题。检查网络靠前几层的权重,如果更新量级比后面层小好几个数量级,就中招了。笔记里应该记着:用ReLU替代sigmoid,或者加Batch Normalization,能缓解这个问题。别忘了在初始化时试试He初始化,也能减少梯度消失。或者尝试梯度裁剪,防止梯度爆炸。
第三个坑:模型收敛到奇怪的值,测试集上表现差得要命。原因可能是特征缩放做对了吗?比如特征A的取值范围是0.0001到0.001,特征B是几千到几万,梯度更新时就会歪到天上去,导致模型花好几个epoch才能找到正确的下降方向。标准化不是可选项,是必选项。你不做,模型就给你颜色看。除了z-score,也可以考虑min-max缩放,但要小心异常值。另外,检查输出层的激活函数是否匹配任务,比如回归用线性,分类用softmax。
记住了。
先做数据标准化。
再检查梯度流。
最后调学习率。
它们经常抱团。
你如果都改完,模型大概率能正常收敛。
改完这些还不收敛?检查数据预处理
有的朋友可能遇到过:明明把上面三个坑都填了,loss还是降不下去。这时候,请回到数据预处理环节。数据中是否有异常值?标签是否做了归一化?样本量够不够?数据分布是否均衡?类别不平衡也会导致收敛困难。同时确保训练集和测试集分布一致,否则模型会学到错误模式。如果你的机器学习笔记上没有记录这些,现在就去补上。数据干净了,模型才肯听话。
简单说:先做数据标准化,再检查梯度流,最后调学习率。这个顺序倒过来只会浪费时间。
问题解决了就去泡杯茶,别在这耗着。笔记记得越详细,下次少流一滴汗。如果还不行,换个损失函数试试。




