PyTorch 深度学习笔记(十一):二分类任务中 Sigmoid 激活函数的场景适配

在二分类任务中,Sigmoid 激活函数是核心组件之一,其作用是将模型输出映射到概率空间 $( [0,1] )$。以下从原理、适配场景及实现细节展开说明:


1. Sigmoid 函数原理

定义:
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$
特性:

  • 输出范围 $( (0,1) )$,可直接解释为概率
  • 导数 $\sigma'(x) = \sigma(x) \cdot (1 - \sigma(x))$,便于梯度计算
  • 单调性保证概率预测的一致性

2. 适配场景分析

适用场景:

  • 输出层激活:将线性层输出 $( z \in \mathbb{R} )$ 转换为概率值 $( \hat{y} = P(y=1) )$
  • 概率建模:例如用户点击预测 $( \hat{y}>0.5 \text{ 为点击} )$
  • 损失函数配合:需与 二元交叉熵损失 (BCE Loss) 联用: $$ \mathcal{L} = -\frac{1}{N} \sum_{i=1}^N \left[ y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i) \right] $$

不适用场景:

  • 多分类任务(应使用 Softmax)
  • 回归任务(输出需连续值)
  • 深层网络中间层(易导致梯度消失)

3. PyTorch 实现要点

网络层设计:

import torch.nn as nn

class BinaryClassifier(nn.Module):
    def __init__(self, input_dim):
        super().__init__()
        self.fc = nn.Linear(input_dim, 1)  # 输出单节点
        self.sigmoid = nn.Sigmoid()         # 输出层激活

    def forward(self, x):
        x = self.fc(x)
        return self.sigmoid(x)  # 输出概率值

损失函数选择:

# 方案1:显式 Sigmoid + BCELoss
model = BinaryClassifier(input_dim=10)
criterion = nn.BCELoss()  # 需手动添加 Sigmoid

# 方案2:隐式 Sigmoid(推荐)
criterion = nn.BCEWithLogitsLoss()  # 自动合并 Sigmoid 与 BCE


4. 数值稳定性优化

问题:
$( \log(\sigma(x)) )$ 在 $( x \to -\infty )$ 时出现下溢。

解决方案:

  • 使用 BCEWithLogitsLoss 替代手动实现
  • 该函数内置数值稳定版本: $$ \mathcal{L} = \max(x, 0) - x \cdot y + \log(1 + e^{-|x|}) $$

5. 决策边界分析

Sigmoid 隐含的决策边界为线性超平面: $$ w^T x + b = 0 $$
可通过调整阈值 $( \tau )$ 平衡精度与召回率:

  • 默认阈值 $( \tau=0.5 )$
  • 高召回场景:降低 $( \tau )$(如 $( \tau=0.3 )$)

总结

Sigmoid 在二分类任务中的核心价值是 概率映射,需注意:

  1. 严格限定于输出层
  2. 优先使用 BCEWithLogitsLoss 保证稳定性
  3. 决策阈值需根据业务需求调整

注:多任务场景中若包含二分类分支,仍适用此方案。

更多推荐