深度学习-激活函数详解

165 阅读5分钟

激活函数详解

目录

  1. 名词解释
  2. 背景历史
  3. 作用意义
  4. 常见激活函数详解
  5. 激活函数对比
  6. 总结

名词解释

激活函数(Activation Function):激活函数是神经网络中一个重要的组成部分,它决定了神经元是否应该被激活以及激活的程度。激活函数给神经网络引入了非线性因素,使得神经网络可以学习和表示复杂的非线性关系。

非线性:如果一个函数不是线性的,就称为非线性函数。在神经网络中,非线性激活函数使得网络能够学习和表示复杂的模式。

梯度消失(Vanishing Gradient):在深度神经网络中,当使用某些激活函数(如Sigmoid)时,反向传播过程中梯度会逐渐变小,最终接近于零,导致网络参数无法有效更新。

梯度爆炸(Exploding Gradient):与梯度消失相反,梯度爆炸是指在反向传播过程中梯度变得非常大,导致网络参数更新不稳定。

背景历史

激活函数的发展经历了几个重要阶段:

  1. 早期阶段(1940s-1950s):McCulloch和Pitts在1943年提出了人工神经元的概念,但当时没有实用的学习算法。

  2. 感知机时代(1950s-1960s):Rosenblatt在1958年开发了感知机,它对输入进行线性组合并进行阈值处理以做出是/否的决策。

  3. Sigmoid时代(1980s):随着反向传播算法的提出,Sigmoid函数成为主流激活函数。1986年,David Rumelhart、Geoffrey Hinton和Ronald Williams在提出多层感知器(MLP)和反向传播算法时,Sigmoid函数被广泛使用。

  4. Tanh改进(1990s):Tanh函数作为Sigmoid的改进版本,解决了Sigmoid函数非零中心化的问题。

  5. ReLU革命(2010s):ReLU函数的提出是激活函数发展的一个重要里程碑,它解决了梯度消失问题,并且计算简单,大大提高了深度网络的训练效率。

  6. 现代发展(2010s至今):Leaky ReLU、Parametric ReLU、ELU、GELU、Swish等新型激活函数不断涌现。

作用意义

激活函数在神经网络中发挥着至关重要的作用:

  1. 引入非线性:如果没有激活函数,无论神经网络有多少层,输出都只是输入的线性组合。激活函数的引入使得神经网络能够学习和表示复杂的非线性关系。

  2. 决定神经元激活:激活函数决定了神经元是否应该被激活以及激活的程度,模拟了生物神经元的工作机制。

  3. 特征提取:通过多层非线性变换的组合,网络可以学习到数据中复杂的层次化特征表示。

  4. 输出归一化:某些激活函数(如Sigmoid、Softmax)可以将输出压缩到特定范围,便于解释和使用。

常见激活函数详解

Sigmoid函数

数学表达式f(x)=11+exf(x) = \frac{1}{1 + e^{-x}}

导数f(x)=f(x)(1f(x))f'(x) = f(x)(1 - f(x))

特点

  • 输出范围:(0, 1)
  • 平滑、可微
  • 常用于二分类问题的输出层

优点

  • 输出有概率意义,可以将值压缩到0~1之间
  • 平滑、处处可导

缺点

  • 容易出现梯度消失问题
  • 输出不是零中心化的,影响收敛速度
  • 计算复杂度高(涉及指数运算)

Tanh函数

数学表达式f(x)=exexex+exf(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

导数f(x)=1(f(x))2f'(x) = 1 - (f(x))^2

特点

  • 输出范围:(-1, 1)
  • 零中心化
  • 是Sigmoid函数的改进版本

优点

  • 输出是零中心化的,收敛速度比Sigmoid快
  • 梯度比Sigmoid更大,缓解梯度消失问题

缺点

  • 仍存在梯度消失问题
  • 计算复杂度高(涉及指数运算)

ReLU函数

数学表达式f(x)=max(0,x)f(x) = \max(0, x)

导数f(x)={1if x>0 0if x0f'(x) = \begin{cases} 1 & \text{if } x > 0 \ 0 & \text{if } x \leq 0 \end{cases}

特点

  • 输出范围:[0, +∞)
  • 计算简单高效
  • 现代神经网络中最常用的激活函数

优点

  • 计算简单,效率高
  • 有效缓解梯度消失问题
  • 收敛速度快

缺点

  • 存在"死亡ReLU"问题(某些神经元可能永远不会被激活)
  • 输出不是零中心化的

Softmax函数

数学表达式f(xi)=exij=1nexjf(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}

导数(雅可比矩阵): f(xi)xj={f(xi)(1f(xi))if i=j f(xi)f(xj)if ij\frac{\partial f(x_i)}{\partial x_j} = \begin{cases} f(x_i)(1 - f(x_i)) & \text{if } i = j \ -f(x_i)f(x_j) & \text{if } i \neq j \end{cases}

特点

  • 输出范围:(0, 1)
  • 所有输出之和为1
  • 常用于多分类问题的输出层

优点

  • 将输出转换为概率分布
  • 适用于多分类问题

缺点

  • 计算复杂度相对较高
  • 可能出现数值不稳定问题

激活函数对比

激活函数输出范围是否零中心化计算复杂度梯度问题常用场景
Sigmoid(0, 1)梯度消失二分类输出层
Tanh(-1, 1)梯度消失浅层网络隐藏层
ReLU[0, +∞)死亡ReLU深层网络隐藏层
Softmax(0, 1)且和为1数值不稳定多分类输出层

总结

激活函数是神经网络的重要组成部分,它赋予了网络非线性表达能力,使网络能够学习复杂的模式。从早期的Sigmoid到现代的ReLU及其变体,激活函数的发展经历了不断优化的过程。

在实际应用中,应根据具体任务和模型架构来选择合适的激活函数:

  • 对于二分类问题,输出层通常使用Sigmoid函数
  • 对于多分类问题,输出层通常使用Softmax函数
  • 对于隐藏层,现代深度网络通常使用ReLU或其变体
  • 需要注意梯度消失等潜在问题,选择合适的激活函数有助于提高训练效率和模型性能

理解激活函数的原理和特性,有助于更高效地构建和训练神经网络。