授课语音

激活函数及常见激活函数的优缺点

激活函数是神经网络中用于引入非线性因素的函数。通过激活函数,神经网络能够学习和拟合更复杂的数据模式。没有激活函数,神经网络即使有多层,也只能模拟线性关系,无法有效解决实际问题。


1. 激活函数的作用

在神经网络中,激活函数的作用是决定每个神经元的输出值。激活函数通常位于每一层的神经元输出和下一层的输入之间,通过对输入的加权和应用激活函数,决定是否激活某个神经元。

神经元的计算公式为:

z = w * x + b

其中:

  • w 是权重
  • x 是输入
  • b 是偏置

激活函数通常是对 z 进行处理,产生神经元的输出 a

a = activation_function(z)

2. 常见激活函数及其优缺点

2.1 Sigmoid 激活函数

Sigmoid函数的输出范围是(0, 1),适用于输出为概率值的任务(如二分类)。

sigmoid(x) = 1 / (1 + exp(-x))

优点

  • 输出在(0, 1)之间,适合用于概率输出。
  • 导数简单,便于计算。

缺点

  • 梯度消失问题:当输入较大或较小时,导数接近零,导致梯度消失,训练变慢。
  • 输出不以零为中心,可能导致梯度下降时更新缓慢。

2.2 Tanh 激活函数

Tanh函数是Sigmoid函数的改进版,输出范围是(-1, 1)

tanh(x) = (2 / (1 + exp(-2x))) - 1

优点

  • 输出范围(-1, 1),使得数据居中,减轻了梯度消失问题。
  • 相比Sigmoid,收敛速度更快。

缺点

  • 同样存在梯度消失问题,特别是当x的值过大或过小时。

2.3 ReLU 激活函数

ReLU(Rectified Linear Unit)是最常用的激活函数,输出为max(0, x)

relu(x) = max(0, x)

优点

  • 计算效率高:计算非常简单,适合深度网络的训练。
  • 缓解梯度消失问题:正区间的梯度恒为1,有助于快速收敛。

缺点

  • 死神经元问题:当输入为负值时,输出恒为零,导致神经元“死亡”,无法更新。
  • 对小于零的输入没有梯度,可能导致训练过程中部分神经元不更新。

2.4 Leaky ReLU 激活函数

Leaky ReLU是对ReLU的改进版本,允许在x < 0时有一个小的负斜率。

leaky_relu(x) = max(α * x, x)

其中α是一个小的常数,通常设置为0.01

优点

  • 解决了ReLU的死神经元问题,允许负输入也能有一个小的梯度。

缺点

  • 即便是负斜率,也不能完全消除死神经元问题,仍然可能存在部分神经元不更新。

2.5 Softmax 激活函数

Softmax通常用于多分类任务,将输出转化为概率分布,输出值范围在(0, 1)之间,并且总和为1。

softmax(x_i) = exp(x_i) / Σ(exp(x_j))

优点

  • 输出为概率分布,适合用于多分类任务。
  • 通过最大化概率来分类。

缺点

  • 计算复杂度较高,尤其是在类别数较多时。

3. 代码实现:常见激活函数的应用

以下是使用PythonNumPy实现常见激活函数的代码示例。

3.1 安装必要的库

pip install numpy

3.2 代码实现

import numpy as np
import matplotlib.pyplot as plt

# Sigmoid 激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Tanh 激活函数
def tanh(x):
    return np.tanh(x)

# ReLU 激活函数
def relu(x):
    return np.maximum(0, x)

# Leaky ReLU 激活函数
def leaky_relu(x, alpha=0.01):
    return np.maximum(alpha * x, x)

# Softmax 激活函数
def softmax(x):
    exp_x = np.exp(x - np.max(x))  # 减去最大值以避免溢出
    return exp_x / np.sum(exp_x, axis=0, keepdims=True)

# 绘制不同激活函数的图形
x = np.linspace(-10, 10, 100)

# 绘制各激活函数的图形
plt.figure(figsize=(10, 6))

plt.subplot(231)
plt.plot(x, sigmoid(x), label='Sigmoid')
plt.title('Sigmoid')
plt.grid(True)

plt.subplot(232)
plt.plot(x, tanh(x), label='Tanh')
plt.title('Tanh')
plt.grid(True)

plt.subplot(233)
plt.plot(x, relu(x), label='ReLU')
plt.title('ReLU')
plt.grid(True)

plt.subplot(234)
plt.plot(x, leaky_relu(x), label='Leaky ReLU')
plt.title('Leaky ReLU')
plt.grid(True)

plt.subplot(235)
plt.plot(x, softmax(x), label='Softmax')
plt.title('Softmax')
plt.grid(True)

plt.tight_layout()
plt.show()

3.3 输出示例

  • 每个激活函数都会绘制一张图,展示其不同输入下的输出变化。

4. 总结

激活函数是神经网络中至关重要的组件,它们为神经网络模型引入了非线性因素,使得神经网络可以拟合复杂的数据模式。常见的激活函数如Sigmoid、Tanh、ReLU等各有优缺点,需要根据具体任务选择合适的激活函数。在深度学习中,ReLU及其变种(如Leaky ReLU)因其简单且高效,常常成为默认选择。

去1:1私密咨询

系列课程: