对ReLU、GELU、SwiGLU的Python实现和可视化

神经网络里面的重要部分就是激活函数,它决定了神经网络中每层的输出。

激活函数的作用是引入非线性因素,使得神经网络能够逼近任意复杂的非线性函数。

从简单分段线性(ReLU)到平滑概率型(GELU)再到门控非线性(SwiGLU)的演进,反映了深度学习模型,尤其是大语言模型,演化上的一个趋势,更强表达能力和更好优化特性。

本文简单介绍 ReLU、GELU 和 SwiGLU 三种激活函数,并给出 Python 实现和可视化(基于 matplotlib)。


激活函数简介

1. ReLU(Rectified Linear Unit)

ReLU 是最广泛使用的激活函数之一,其定义简单且计算高效:

优点包括:

  • 计算简单,加速训练;
  • 缓解梯度消失问题(对正输入梯度恒为 1)。

缺点:

  • 存在“死神经元”问题(负输入梯度为 0,无法更新)。

2. GELU(Gaussian Error Linear Unit)

GELU 是一种平滑、非单调的激活函数,被广泛用于 Transformer 架构(如 BERT、GPT)。其定义基于标准正态分布的累积分布函数(CDF):

其中  是标准正态分布的 CDF, 是误差函数。

近似形式(常用于实现):

GELU 的优势在于:

  • 平滑可导,有利于优化;
  • 融合了 dropout 与非线性的思想(通过概率加权)。

3. SwiGLU(Swish-Gated Linear Unit)

SwiGLU 是一种门控激活函数,结合了 Swish 激活与 GLU(Gated Linear Unit) 结构,在现代大语言模型(如 Qwen、PaLM、LLaMA-2)中表现优异。

首先定义 Swish 函数:

其中  是 Sigmoid 函数, 通常设为 1。

SwiGLU 将输入  分成两部分(或使用两个线性投影  和 ),然后应用门控机制:

若仅考虑标量输入(用于可视化),可简化为:

注:严格来说,SwiGLU 需要两个独立的线性变换,但为了可视化目的,这里采用上述简化形式以展示其非线性特性。

SwiGLU 的优势:

  • 引入门控机制,增强表达能力;
  • 实验表明在语言建模任务中优于 ReLU 和 GELU。

可视化代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import erf

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

def gelu(x):
    return 0.5 * x * (1 + erf(x / np.sqrt(2)))

def swish(x, beta=1.0):
    return x / (1 + np.exp(-beta * x))

def swiglu_simplified(x):
    # 简化版SwiGLU(x)  Swish(x) * x
    return swish(x) * x

# 生成 x 
x = np.linspace(-4, 4, 400)

# 计算 y 
y_relu = relu(x)
y_gelu = gelu(x)
y_swiglu = swiglu_simplified(x)

# 绘图
plt.figure(figsize=(10, 6))
plt.plot(x, y_relu, label=r'$\text{ReLU}(x)$', linewidth=2)
plt.plot(x, y_gelu, label=r'$\text{GELU}(x)$', linewidth=2)
plt.plot(x, y_swiglu, label=r'$\text{SwiGLU}_{\text{simplified}}(x) = x \cdot \sigma(x) \cdot x$', linewidth=2)

plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(True, linestyle='--', alpha=0.6)
plt.xlim(-4, 4)
plt.ylim(-1, 4)
plt.xlabel(r'$x$', fontsize=14)
plt.ylabel(r'$f(x)$', fontsize=14)
plt.title('Comparison of ReLU, GELU, and SwiGLU Activation Functions', fontsize=16)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()

上面的代码可视化效果如下所示:Image

可视化说明

  • ReLU:在  时为线性, 时恒为 0。
  • GELU:平滑曲线,在负区有微小输出,正区近似线性但带轻微弯曲。
  • SwiGLU(简化):在正区增长快于线性(因含  项),负区趋近于 0 但非完全截断。实际 SwiGLU 使用两个不同的线性投影,因此其形状依赖于权重。此处简化仅为展示函数形态。

预览时标签不可点

Close

更多

Name cleared

赞赏二维码微信扫一扫赞赏作者

Like the AuthorOther Amount

赞赏后展示我的头像

作品

暂无作品

Like the Author

Other Amount

¥

最低赞赏 ¥0

OK

Back

Other Amount

更多

赞赏金额

¥

最低赞赏 ¥0

1

2

3

4

5

6

7

8

9

0

.

Python语言程序设计 · 目录

Python语言程序设计

上一篇Python NLP 利器:分词与词性标注库总结与实战下一篇打造绿色便携 Python:初步理解嵌入式 Python 与路径机制

Close

更多

搜索「」网络结果

Close

调整当前正文文字大小

更多

100%