在做二分类任务(如垃圾邮件识别)时,为什么我们不能像线性回归那样直接用 MSE 均方误差作为损失函数?当计算 或 时,代码为什么会抛出 NaN 或上溢/下溢崩溃?
答案在于概率损失函数选择与浮点数值稳定性。这一章我们将推导二元交叉熵损失(BCE),揭示 Log-Sum-Exp 数值稳定技巧的数学精髓,并从零手写一个完整的 Logistic 回归分类器。
把损失函数想象成足球比赛中裁判对犯错者的惩罚金:
点击放大查看图:MSE 均方误差与二元交叉熵 BCE 惩罚金 Loss 曲线对比图对于分类输出 ,若使用 MSE 损失 :
当预测极其错误(如 但 )时,,导致 !梯度几乎为 0,模型陷入“死机”无法更新。
基于最大似然估计(Maximum Likelihood Estimation),定义 BCE 损失:
计算其梯度,消去 成功解决了梯度消失:
在计算机浮点数表示中(如 float64):
Inf)。-Inf),在表达式中产生 NaN。为了安全计算 ,使用 Log-Sum-Exp 恒等式:
点击放大查看图:Log-Sum-Exp 提公因式最大值 x_max 防止浮点数上溢与下溢示意图
减去最大值 后,括号内所有指数的最大值为 ,绝对不会发生浮点上溢!
给定单个样本特征 ,真实标签 。 初始权重 ,无截距:
若学习率 ,则新权重更新为:
下面的代码从零实现包含了 Log-Sum-Exp 和 np.clip 数值保护的 CustomLogisticRegression 类,并与 Scikit-Learn 进行对照:
| 现象 | 先问什么 | 处理方式 |
|---|---|---|
代码抛出 RuntimeWarning: divide by zero encountered in log | 是否直接计算了 np.log(y_pred) | 使用 np.clip(y_pred, 1e-15, 1 - 1e-15) 保护或使用稳定 LSE 公式 |
预测输出概率全为 0.5 | 权重是否初始化过大 | 初始化权重设为全 0 或小随机数 0.01 * randn,避免初始处于饱和区 |
| 不知道如何评估二分类模型 | 是否仅看 Accuracy 准确率 | 在类别不平衡时必须同时查看 Precision(精确率)、Recall(召回率)与 F1-Score |
fit 和 predict 的 Logistic 回归类。predict 方法中使用 (self.predict_proba(X) >= 0.5).astype(int) 来决定分类类别?Inf)。🎉 恭喜你成功完成微积分与优化(第 6-10 周)的全部课程!
你已经完整掌握了偏导数、链式法则、计算图、梯度与 Hessian 曲率、BGD/SGD/Mini-batch、Momentum/RMSProp/Adam 优化器以及 Log-Sum-Exp 稳定 Logistic 回归。请准备迈入下一个实战大作业 12. 综合实战:鸢尾花分类小项目!