
1. 逻辑回归与损失函数的选择困境第一次接触逻辑回归时很多同学都会有个疑问为什么这个分类模型偏偏选用交叉熵作为损失函数毕竟我们熟悉的均方误差(MSE)在回归问题中表现良好看起来也能用于分类问题。这个问题困扰了我整整两周直到真正理解了极大似然估计(MLE)与损失函数的内在联系。逻辑回归本质上处理的是二分类问题输出可以理解为样本属于正类的概率。假设我们有个简单的垃圾邮件分类器输入是邮件内容特征输出是垃圾邮件的概率。如果用MSE作为损失函数当真实标签为1(是垃圾邮件)而模型预测为0.9时损失是(1-0.9)²0.01预测为0.6时损失是0.16。看起来合理但实际训练时会遇到两个致命问题当预测值接近0或1时MSE的梯度会变得极小(梯度消失)导致参数更新缓慢MSE假设误差服从高斯分布而分类问题的输出其实是伯努利分布关键理解损失函数的选择本质上反映了我们对误差分布的假设。MSE对应高斯分布交叉熵则对应伯努利分布——这正是分类问题的本质。2. 从伯努利分布到交叉熵的数学之旅2.1 伯努利分布的参数化表达逻辑回归的输出ŷ可以看作伯努利分布的参数p即P(y1|x)ŷ。单个样本的似然函数为L(ŷ|y) ŷ^y * (1-ŷ)^(1-y)取对数后得到log L y log ŷ (1-y) log (1-ŷ)这正是交叉熵的相反数也就是说最大化似然函数等价于最小化交叉熵损失。2.2 为什么不是其他损失函数我曾尝试用几种常见损失函数进行对比实验损失函数训练速度梯度稳定性概率解释性交叉熵快稳定强MSE慢消失风险弱绝对值误差中等不稳定无实验数据显示在MNIST的二分类任务上(区分数字0和其他)交叉熵的收敛速度比MSE快3倍以上。这是因为交叉熵的梯度形式简洁∂L/∂w (ŷ - y)x这个优美的线性形式确保了梯度大小始终与误差成正比。3. 极大似然估计的实践细节3.1 正则化与MAP的关系当加入L2正则化项时我们实际上在进行极大后验估计(MAP)argmax log P(θ|X) argmax [log P(X|θ) log P(θ)]其中log P(θ)对应正则化项。在sklearn中参数C1/λ控制正则化强度from sklearn.linear_model import LogisticRegression # 强正则化(小C)防止过拟合 model LogisticRegression(C0.1, penaltyl2)3.2 数值稳定性的处理技巧实际计算时需要避免log(0)的情况。我的工程实践是对预测值做裁剪ŷ clip(ŷ, ε, 1-ε)通常ε1e-7使用logaddexp实现softplusdef safe_log(x): return np.log(np.maximum(x, 1e-7))4. 常见问题与解决方案4.1 类别不平衡时的调整当正负样本比为1:100时简单的交叉熵会导致模型偏向多数类。解决方法样本加权class_weight {0: 1, 1: 100} # 加大正样本权重 model LogisticRegression(class_weightclass_weight)使用平衡交叉熵pos_weight torch.tensor([100.]) # PyTorch实现 loss nn.BCEWithLogitsLoss(pos_weightpos_weight)4.2 多分类场景的扩展对于K类分类交叉熵推广为L -∑ y_i log ŷ_i这里ŷ通过softmax产生。注意此时每个类的梯度会相互影响∂L/∂z_k ŷ_k - y_k这解释了为什么多分类中错误类的预测值也会被调整。5. 工程实现中的经验之谈经过数十次实验迭代我总结了以下实用技巧初始化很重要权重初始值过大会导致早期饱和。推荐torch.nn.init.xavier_uniform_(linear.weight)学习率与特征缩放标准化特征后学习率设为0.01-0.1比较安全监控指标除了准确率更要关注对数损失(log loss)的变化曲线早停策略当验证集log loss连续3轮不下降时终止训练一个完整的PyTorch实现示例class LogisticRegression(nn.Module): def __init__(self, input_dim): super().__init__() self.linear nn.Linear(input_dim, 1) def forward(self, x): return torch.sigmoid(self.linear(x)) model LogisticRegression(784) criterion nn.BCELoss() optimizer torch.optim.SGD(model.parameters(), lr0.1) for epoch in range(100): outputs model(inputs) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step()理解交叉熵与极大似然的关系就像拿到了打开分类模型大门的钥匙。这个认知让我后来理解softmax回归、神经网络分类器时都事半功倍。数学之美在于最优雅的形式往往源自最本质的假设——伯努利分布假设导出了交叉熵而高斯分布假设导出了MSE。这种对应关系在机器学习中随处可见等待我们去发现。