激活函数
理解 Sigmoid 激活函数:公式、特点与应用
基本概念
代码调用
1 什么是Sigmoid?
一个形状像是躺平的S的平滑函数:
$$
\sigma(x) = \frac{1}{1 + e^{-x}}
$$
输出范围(0,1)
常用于将值映射为概率
1.1 常见场景(与Softmax对比)
🔍 Sigmoid vs Softmax:本质区别
特性
Sigmoid
Softmax
输出范围
每个神经元输出范围是 (0, 1)
所有输出加起来为 1
激活方式
对每个输出神经元 单独 使用 Sigmoid
对整组输出向量使用 Softmax
标签之间的关系
互相独立,不排斥
互斥,只能属于一个类别
应用场景
多标签分类(multi-label classification)
多类别分类(multi-class classification)
损失函数
Binary Cross Entropy
Categorical Cross Entropy
输出解读
每个标签为“是/否”的概率
所有类别中选择概率最大的一个作为预测类别
Sigmoid会将每个标签的raw结果独立转化为概率,所以能得到多个标签的值。
BCE:多标签分类,常与Sigmoid一同使用,对每个标签独立做的二分类损失。nn.BCELoss() + Sigmoid()
CE: 多个类别中 只能选一个,常配合 Softmax 使用。Pytorch 中CE的包含了softmax
2 sigmoid的代码以及可视化
Numpy实现
123456789101112# 可选Python绘图代码示例(可在Jupyter中运行)import numpy as npimport matplotlib.pyplot as pltx = np.linspace(-10, 10, 100)y = 1 / (1 + np.exp(-x))plt.plot(x, y)plt.title("Sigmoid Function")plt.xlabel("x")plt.ylabel("σ(x)")plt.grid()plt.show()
Pytorch调用
12345678910import torchimport torch.nn as nn# 假设 batch_size = 2,有 3 个标签logits = torch.tensor([[0.2, -1.5, 3.0], [0.8, 0.4, -2.0]]) # 模型输出的 raw logits# ✅ 使用 sigmoid 将每个标签输出转为概率(独立计算)sigmoid = nn.Sigmoid()probs = sigmoid(logits)print("Sigmoid 概率输出:\n", probs)
3 多标签任务,但是使用softmax
或许大家在看代码的时候,一些多目标分割任务会看见代码使用softmax的情况。
但通常情况下,multi-label不是使用sigmoid么?
这里,结合各种资料和论坛[1],将这么做的原因进行一个解析说明。
首先回顾一下两种激活函数的用途:
Softmax是表示这个样本只有两种分类可能
Sigmoid表示这个样本可能有多个标签
而在分割的情境下,就是这个像素,是否同时既属于类别1,又属于类别2。
如果是该像素可能属于多种目标类别,则使用sigmoid,反之使用softmax。
Reddit: sigmoid vs softmax in 3D medical image segmentation ↩︎