Skip to content
约 0 字 · 预计阅读 0 分钟

激活函数详解

阅读时长:约 15 分钟 难度等级:入门 读完你将学会:理解各类激活函数的原理与选择、掌握导数推导、理解 Softmax + Cross-Entropy 的梯度简化

要点速览

  • 激活函数引入非线性,是神经网络能拟合复杂函数的关键
  • ReLU 是隐藏层的默认选择,计算快且缓解梯度消失
  • Softmax + Cross-Entropy 组合的梯度简化为 py

前置知识

阅读本文前,你需要了解:

  • 线性层 - 理解为什么需要非线性
  • 基本的微积分概念

本文不假设你了解:

  • 任何深度学习框架
  • 复杂的数学推导

为什么需要激活函数?

如果只有线性层,无论叠加多少层,最终仍然是线性变换:

W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2)

激活函数引入非线性,使神经网络能够拟合任意复杂的函数。

激活函数可视化

Sigmoid 函数

定义

σ(x)=11+ex=exex+1

导数推导

σ(x)=ddx(11+ex)=ex(1+ex)2=11+exex1+ex=σ(x)(1σ(x))

特点

  • 输出范围:(0, 1)
  • 将任意实数映射到概率区间
  • 导数最大值为 0.25(在 x=0 处)
python
# 片段:Sigmoid 实现
import numpy as np

def sigmoid(x):
    """Sigmoid 激活函数"""
    return 1 / (1 + np.exp(-np.clip(x, -500, 500)))

def sigmoid_derivative(x):
    """Sigmoid 导数"""
    s = sigmoid(x)
    return s * (1 - s)

优缺点

优点缺点
输出有界,适合概率输出梯度消失问题严重(导数最大 0.25)
处处可导输出非零中心,影响收敛
平滑连续计算指数函数较慢

适用场景

  • 二分类输出层
  • 注意力权重计算

Tanh 函数

定义

tanh(x)=exexex+ex=21+e2x1

导数推导

tanh(x)=1tanh2(x)

推导过程:

t=tanh(x),则:

tanh(x)=(ex+ex)(ex+ex)(exex)(exex)(ex+ex)2=(ex+ex)2(exex)2(ex+ex)2=1tanh2(x)
python
# 片段:Tanh 实现
def tanh(x):
    """Tanh 激活函数"""
    return np.tanh(x)

def tanh_derivative(x):
    """Tanh 导数"""
    return 1 - np.tanh(x) ** 2

特点

  • 输出范围:(-1, 1)
  • 零中心化,收敛更快
  • 导数最大值为 1(在 x=0 处)

适用场景

  • RNN 隐藏层
  • 需要零中心的场景

ReLU 函数

定义

ReLU(x)=max(0,x)={xif x>00if x0

导数

ReLU(x)={1if x>00if x0
python
# 片段:ReLU 实现
def relu(x):
    """ReLU 激活函数"""
    return np.maximum(0, x)

def relu_derivative(x):
    """ReLU 导数"""
    return (x > 0).astype(float)

优缺点

优点缺点
计算极快(只需比较)"死亡 ReLU"问题:负值区域梯度为 0
缓解梯度消失输出非零中心
稀疏激活特性在 x=0 处不可导(实际中无影响)

适用场景

  • 隐藏层的默认选择
  • 深层网络

Leaky ReLU

定义

LeakyReLU(x)={xif x>0αxif x0

其中 α 是一个小常数,通常取 0.01。

导数

LeakyReLU(x)={1if x>0αif x0
python
# 片段:Leaky ReLU 实现
def leaky_relu(x, alpha=0.01):
    """Leaky ReLU 激活函数"""
    return np.where(x > 0, x, alpha * x)

def leaky_relu_derivative(x, alpha=0.01):
    """Leaky ReLU 导数"""
    return np.where(x > 0, 1, alpha)

优点

解决"死亡 ReLU"问题,负值区域仍有梯度。

适用场景

  • 深层网络
  • 需要避免死亡神经元的场景

Softmax 函数

定义

Softmax(xi)=exij=1nexj

特点

  • 将向量转换为概率分布
  • 所有输出和为 1
  • 最大值被放大,最小值被抑制

数值稳定性

为避免指数溢出,通常减去最大值:

Softmax(xi)=eximax(x)j=1nexjmax(x)
python
# 片段:Softmax 实现
def softmax(x):
    """
    Softmax 激活函数
    
    参数:
        x: 输入向量 (n,) 或批次 (batch_size, n)
    """
    # 数值稳定性:减去最大值
    x_shifted = x - np.max(x, axis=-1, keepdims=True)
    exp_x = np.exp(x_shifted)
    return exp_x / np.sum(exp_x, axis=-1, keepdims=True)

Softmax + Cross-Entropy 的梯度简化

p=Softmax(z)y 为 one-hot 标签,交叉熵损失为:

L=iyilogpi

梯度推导:

Lzi=jLpjpjzi=piyi

这个优美的结果使得 Softmax + Cross-Entropy 的梯度计算非常简洁。

python
# 片段:Softmax + Cross-Entropy 梯度
def softmax_cross_entropy_gradient(y_pred, y_true):
    """
    Softmax + Cross-Entropy 的组合梯度
    
    参数:
        y_pred: Softmax 输出概率
        y_true: 真实标签的 one-hot 编码
    
    返回:
        梯度 = y_pred - y_true
    """
    return y_pred - y_true

适用场景

  • 多分类问题的输出层

激活函数对比

激活函数输出范围导数范围主要优点主要缺点推荐场景
Sigmoid(0, 1)(0, 0.25]输出有界梯度消失二分类输出
Tanh(-1, 1)(0, 1]零中心梯度消失RNN 隐藏层
ReLU[0, +∞)计算快死亡 ReLU隐藏层默认
Leaky ReLU(-∞, +∞)无死亡需调参深层网络
Softmax(0, 1)-概率分布-多分类输出

选择建议

  1. 隐藏层:默认使用 ReLU,如果出现死亡神经元则尝试 Leaky ReLU
  2. 二分类输出层:Sigmoid
  3. 多分类输出层:Softmax
  4. RNN 隐藏层:Tanh

本节要点

记住这三点:

  1. 激活函数引入非线性,是神经网络能拟合复杂函数的关键
  2. ReLU 是隐藏层的默认选择,计算快且缓解梯度消失
  3. Softmax + Cross-Entropy 组合的梯度简化为 py

更新日志

日期内容
2026-03-28初稿发布

相关主题

基于 VitePress 构建