【机器学习深度学习】常见激活函数
目录
一、激活函数的作用是什么?
二、常见激活函数分类总览
三、核心激活函数详解
1. Sigmoid 函数
2. Tanh(双曲正切)函数
3. ReLU(Rectified Linear Unit)
4. Leaky ReLU
5. GELU(Gaussian Error Linear Unit)
6. Softmax(用于分类)
四、激活函数选择建议
五、代码示例(图像比较)
六、总结
在深度学习中,激活函数(Activation Function)起着至关重要的作用。它们赋予神经网络非线性能力,使得模型能够学习复杂的模式。本文将系统介绍几种常见的激活函数,包括它们的定义、图像特性、优缺点以及典型应用场景。
一、激活函数的作用是什么?
神经网络的每一层都在进行类似线性变换的操作(例如 y = Wx + b)。如果每一层都是线性的,那么无论堆叠多少层,整个网络仍然是一个线性模型,无法拟合非线性问题。
引入激活函数,就像在神经元中注入“生命”,让模型能更好地捕捉图像、语音、文本等数据中的复杂非线性结构。
二、常见激活函数分类总览
名称 | 数学表达 | 是否线性 | 是否有梯度饱和 | 是否稀疏激活 | 是否单边抑制 |
---|---|---|---|---|---|
Sigmoid | ![]() | 否 | 是 | 否 | 是 |
Tanh | ![]() | 否 | 是 | 否 | 否 |
ReLU | ![]() | 否 | 否 | 是 | 是 |
Leaky ReLU | ![]() | 否 | 否 | 是 | 否 |
GELU | 其中: | 否 | 否 | 否 | 否 |
Softmax | ![]() | 否 | 否 | 否 | 否(用于输出层) |
三、核心激活函数详解
1. Sigmoid 函数
✅ 定义:
✅ 特性:
-
输出范围:(0, 1)
-
曲线呈S型,适合输出概率
-
梯度在两端接近0,容易梯度消失
-
不是零中心,可能导致学习效率下降
✅ 应用场景:
-
二分类输出层
-
生物神经模型的启发
【直观例子】
🎯比喻:
像一个 旧式收音机上的音量旋钮,你不断拧,它从“关”慢慢变“开”,但无论怎么拧也拧不到 0 或 1(永远接近但不等于)。
🎯特性直观解释:
你输入越大(正数),它输出越接近 1;
你输入越小(负数),它输出越接近 0;
中间(比如0)时输出是 0.5。
🎯应用直觉:
“你是不是开心?”输出一个概率:开心概率 87%?那就是 sigmoid(输入) = 0.87。
2. Tanh(双曲正切)函数
✅ 定义:
✅ 特性:
-
输出范围:(-1, 1),零中心
-
比Sigmoid在训练初期表现更好
-
同样存在梯度消失问题
✅ 应用场景:
-
中间隐藏层(老式 RNN 中常见)
【直观例子】
🎯比喻:
Tanh 和 Sigmoid 类似,但它输出的是正负情绪,“开心度”从 -1 到 1。
🎯 举例:
如果你有个“情绪神经元”,输入 -2 表示“悲伤”,+2 表示“开心”:
输入 -2,输出 ≈ -0.96(很悲伤)
输入 0,输出 0(中性)
输入 2,输出 ≈ +0.96(很开心)
🎯特点:
比 Sigmoid 更对称、居中,负面信息也能被表达。
3. ReLU(Rectified Linear Unit)
✅ 定义:
✅ 特性:
-
输出非负,激活稀疏,效率高
-
收敛速度快,不易梯度消失
-
缺点:可能“死亡神经元”(永远为0)
✅ 应用场景:
-
当前最主流的激活函数
-
深度CNN、Transformer 等几乎都用它
【直观例子】
🎯 比喻:
它就像一个 只测正电压的电压计,负电压一律显示为 0。
🎯 举例:
输入 -3 → 输出 0(负电压测不到)
输入 0 → 输出 0
输入 2 → 输出 2(原样输出)
🎯直觉:
只关心“积极”的信息,负面的就直接“忽略”。
4. Leaky ReLU
✅ 定义:
其中 alpha 通常取 0.01
✅ 特性:
-
解决 ReLU 的“死亡神经元”问题
-
保留一定负数梯度,信息不完全丢失
✅ 应用场景:
-
深层网络,如 GAN 中的判别器
【直观例子】
🎯比喻:
像 ReLU,但 对负数不是完全置零,而是象征性保留一点点信息,像“耳边风”但还是听进了一点。
🎯 举例:
假设 α = 0.01:
输入 -3 → 输出 -0.03(不是完全0,保留微弱信号)
输入 2 → 输出 2(正数正常输出)
🎯 优势:
防止“神经元死亡”——ReLU 一旦输出 0,梯度就是 0,学不动了;Leaky ReLU 还能继续学习。
5. GELU(Gaussian Error Linear Unit)
✅ 定义:
其中 $\Phi(x)$ 为标准正态分布的累积分布函数。
✅ 特性:
-
更平滑的非线性
-
结合概率与线性,有统计学基础
-
训练效果优于 ReLU(尤其在Transformer中)
✅ 应用场景:
-
BERT、GPT 等大型预训练语言模型
【直观例子】
🎯比喻:
像是一个 聪明的门卫:不是简单的“过或不过”,而是:
“这个输入我有70%的把握是有用的,那我就通过70%的量。”
🎯 举例:
输入 -2 → 输出 ≈ -0.04(觉得没啥用,几乎不给过)
输入 0 → 输出 0(中立)
输入 2 → 输出 ≈ 1.5(很有用,几乎全放行)
🎯为什么高端:
比 ReLU 更平滑,不那么暴躁;
大模型(如 BERT、GPT)都爱用它。
6. Softmax(用于分类)
✅ 定义(用于输出层):
✅ 特性:
-
将输出映射为概率分布(总和为1)
-
多分类问题中的首选
✅ 应用场景:
-
神经网络最后一层的多分类任务
【直观例子】
🎯比喻:
比如你看到一张动物照片,你内心评分如下:
狗:3分
猫:1分
鸟:0分
Softmax 会把它转换成概率:
狗 84%
猫 11%
鸟 5%
🎯 你就会选“狗”这个类作为输出。
函数 | 图像形状 | 特征 |
---|---|---|
Sigmoid | S形 | 上限 1,下限 0,斜率中间最大 |
Tanh | S形(对称) | 上限 1,下限 -1,更“均衡” |
ReLU | 折线(0 开始,斜向上) | 负数为0,正数直线 |
Leaky ReLU | 折线(负斜率微小) | 类似 ReLU,但负半轴有微斜 |
GELU | 更柔和的 S形 | 平滑版 ReLU,有概率感 |
Softmax | 输出多个条形概率图 | 多分类的概率分布 |
四、激活函数选择建议
场景 | 推荐激活函数 |
---|---|
二分类输出层 | Sigmoid |
多分类输出层 | Softmax |
一般隐藏层 | ReLU 或 GELU |
避免 ReLU 死亡神经元 | Leaky ReLU |
需要更平滑拟合 | Tanh / GELU |
语言模型/Transformer | GELU 是默认选择 |
五、代码示例(图像比较)
说明:该代码主要对比6前面所讲的6种常见激活函数进行图示对比。
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np# 定义输入区间
x = torch.linspace(-5, 5, 200)
x_np = x.numpy()# 定义激活函数列表(名称,函数)
activation_funcs = [("Sigmoid", torch.sigmoid),("Tanh", torch.tanh),("ReLU", F.relu),("Leaky ReLU", F.leaky_relu),("GELU", F.gelu),("Softmax", lambda x: F.softmax(x, dim=0)) # 注意:Softmax 需要设置 dim
]# 画图
plt.figure(figsize=(12, 8))
for i, (name, func) in enumerate(activation_funcs, 1):plt.subplot(2, 3, i)y = func(x)plt.plot(x_np, y.detach().numpy(), label=name, color='royalblue')plt.title(name)plt.grid(True)plt.axhline(0, color='gray', linestyle='--', linewidth=0.5)plt.axvline(0, color='gray', linestyle='--', linewidth=0.5)plt.legend()plt.tight_layout()
plt.suptitle("常见激活函数曲线", fontsize=16, y=1.02)
plt.show()
【运行结果】
解读分析
【代码解读】
▲代码核心逻辑
x = torch.linspace(-5, 5, 200)
这行表示:我们创建了一个从 -5 到 5 的连续输入,一共 200 个点,作用是给激活函数提供输入值。
然后每个函数都会计算这些输入对应的输出,最终画在图上。
【逐个解释图像含义和为何长这样】
① Sigmoid
torch.sigmoid(x)
曲线呈 S 型;
左边趋近于 0,右边趋近于 1;
中间(x = 0)值为 0.5。
💡 原因解释:
Sigmoid 就是概率输出函数:输入越大输出越接近 1,越小越接近 0,中间是 0.5。② Tanh
torch.tanh(x)
📈 图像形状:
仍然是 S 型,但是对称的;
左边趋近于 -1,右边趋近于 +1;
中间是 0。
💡 对比 Sigmoid:
Sigmoid 输出范围 [0, 1],Tanh 输出 [-1, 1],所以 Tanh 的图像居中对称,更适合表示“正负情绪”或“中性”。③ ReLU
F.relu(x)
📈 图像形状:
x < 0 时输出为 0(水平线);
x ≥ 0 时,输出等于 x(45°对角线上升)。
💡 解释:
ReLU 的意思就是 “不理负数,只传递正数”,所以负数全部变成 0。④ Leaky ReLU
F.leaky_relu(x)
📈 图像形状:
x < 0 区域不是水平线,而是轻微向下斜;
x ≥ 0 区域仍是直线上升。
💡 解释:
Leaky ReLU 在负值区域也留一点“梯度”,例如让 x=-3 输出 -0.03(而不是 ReLU 的 0),可以防止神经元“死掉”。⑤ GELU
F.gelu(x)
📈 图像形状:
看起来像 ReLU + S型平滑过渡;
x 越大,输出越接近 x;
x 越小,输出越接近 0,但比 ReLU 更平滑。
💡 解释:
GELU 用概率方式决定信息是否通过,结果像一个“柔软的 ReLU”,是 Transformer 默认激活函数。⑥ Softmax
F.softmax(x, dim=0)
📈 图像解释:
会像一座高高的“波峰”,其余值低;
因为 Softmax 是对所有输入整体归一化为概率。
💡 例子:
如果输入是[2, 1, 0]
,Softmax 会输出[0.71, 0.26, 0.03]
—— 最大值被高亮,其他抑制。所以 Softmax 的图像并不像单独函数那样“逐点曲线”,而是一个全体归一化的概率分布。
【输出结果】
这段代码会生成一个包含以下六个子图的图像:
Sigmoid:S 型曲线,范围 [0, 1]
Tanh:双曲正切,对称的 S 形,范围 [-1, 1]
ReLU:负值为0,正值线性
Leaky ReLU:负值保留一点微弱斜率(例如 α=0.01)
GELU:像平滑的 ReLU,带概率因素
Softmax:由于是对整段 x 进行归一化,形状会像“波峰型分布”
函数名 | 输出范围 | 样式 | 直觉解释 |
---|---|---|---|
Sigmoid | (0, 1) | S型 | 概率 |
Tanh | (-1, 1) | S型(对称) | 情绪值 |
ReLU | [0, ∞) | 折线(负0正斜) | 忽略负数 |
Leaky ReLU | (-∞, ∞) | 折线(负微斜) | 保留负梯度 |
GELU | 类似 [0, x] | 平滑曲线 | 概率控制信息通过 |
Softmax | (0, 1), 总和=1 | 波峰分布 | 多分类选择概率 |
六、各激活函数的应用领域与原因详解
6.1 Sigmoid:二分类输出(如医学诊断、垃圾邮件识别)
应用场景:
-
二分类问题的输出层(例如:是否患病?是否为垃圾邮件?)
-
简单神经网络的早期结构
为什么?
-
输出在 (0, 1) 范围内,很容易解释为“概率”;
-
适合表示“是/否”“好/坏”“真/假”类型决策;
-
缺点:梯度容易消失,不适合深层网络。
6.2 Tanh:情绪建模、信号处理(如语音识别)
应用场景:
-
早期 RNN(循环神经网络)中的隐藏层
-
需要表达正负信号(如正负情感、涨跌趋势)
为什么?
-
输出在 (-1, 1),是对称的,更自然地表达正负信号;
-
零中心有利于梯度传播;
-
但在深层网络中也有梯度消失问题。
6.3 ReLU:图像处理、卷积神经网络(CNN)
应用场景:
-
计算机视觉(图像分类、目标检测)
-
卷积神经网络(CNN)中的隐藏层
为什么?
-
简单、计算快;
-
输出稀疏(大量为0),利于提取关键特征;
-
不容易梯度消失 → 有助于深层网络训练;
-
缺点:容易“死亡神经元”(一直为0)。
6.4 Leaky ReLU:GAN、对抗样本处理
应用场景:
-
对抗生成网络(GAN)的判别器
-
深层神经网络中对抗 ReLU 死亡问题
为什么?
-
和 ReLU 相比,它对负数留了一点梯度(不过于激进);
-
更稳定、更“灵活”,适合噪声丰富或梯度敏感的任务;
-
在训练不稳定的场景中表现更好。
6.5 GELU:自然语言处理、预训练大模型(如 BERT, GPT)
应用场景:
-
Transformer 网络中的默认激活函数;
-
BERT、GPT、T5 等预训练语言模型;
-
文本生成、问答、翻译等任务
为什么?
-
比 ReLU 更平滑(带概率性),更适合表达复杂语言上下文;
-
收敛更稳定、泛化能力强;
-
兼具 ReLU 的稀疏性和 Sigmoid 的平滑性。
6.6 Softmax:多分类问题(如图像识别、文本分类)
应用场景:
-
多分类输出层(猫/狗/鸟、情绪正负中性、话题分类等)
-
所有类别互斥的任务中
为什么?
-
把多个输出转换成概率分布(总和为1);
-
适合模型做“唯一选择”的决策场景;
-
输出结果易解释、利于后续评估。
总结表格
激活函数 | 典型应用领域 | 原因说明 |
---|---|---|
Sigmoid | 二分类输出层 | 映射到 (0,1),表达概率 |
Tanh | RNN、语音识别 | 零中心对称,适合情绪等正负值任务 |
ReLU | CNN、图像识别 | 简单、快、不饱和、特征稀疏 |
Leaky ReLU | GAN 判别器 | 防止神经元死亡,训练稳定 |
GELU | NLP 预训练模型 | 平滑、高级、泛化能力强 |
Softmax | 多分类输出层 | 归一化概率,表达唯一选择 |
💬 小结:怎么选?
-
图像任务?→ ReLU / Leaky ReLU
-
文本任务?→ GELU
-
二分类?→ Sigmoid
-
多分类?→ Softmax(输出层)
-
情绪/涨跌?→ Tanh
七、总结
激活函数是深度学习的核心“非线性引擎”。
不同的函数适用于不同的网络结构和任务目标。随着模型的不断演化,像 GELU 等新型激活函数也正在替代传统函数,成为工业界的默认选择。
✅ 学术研究中,需要理解激活函数的数学性质
✅ 工程应用中,建议以 GELU(Transformer)或 ReLU(CNN)为主