一些常用的激活函数及绘图

深度网络的一些常用激活函数,并通过matplot绘制出来:

python 复制代码
import matplotlib.pyplot as plt
import numpy as np


def relu(x):
    return np.maximum(0, x)


def leaky_relu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)


def gelu(x):
    return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x ** 3)))


def swish(x):
    return x / (1 + np.exp(-x))


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def sigmoid_diff(x):
    return np.exp(-x) / ((1 + np.exp(-x)) ** 2)


def plot_func():
    x = np.linspace(-10, 10, 500)

    plt.figure(figsize=(6, 4))
    plt.plot(x, gelu(x), label='gelu')
    plt.plot(x, relu(x), label='relu')
    plt.plot(x, leaky_relu(x), label='leaky_relu', linestyle='--')

    plt.plot(x, sigmoid(x), label='sigmoid')
    plt.plot(x, swish(x), label='swish')
    plt.plot(x, sigmoid_diff(x), label='sigmoid_diff')

    plt.plot(x, np.tanh(x), label='tanh', linestyle='--')
    plt.axhline(0, color='k', linewidth=0.5)
    plt.axvline(0, color='k', linewidth=0.5)
    plt.title('all trigger functions')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid(True)
    plt.legend()
    plt.show()


plot_func()

sigmoid和tanh的缺点是梯度饱和(梯度易消失)。relu则改进了这一点(正半区梯度为1),且很容易计算。leaky_relu和gelu则解决了relu负半区梯度消失的问题,它俩在负半区仍有微小梯度,确保训练可进行下去。gelu还解决了relu函数在原点处的硬转折,使得梯度更平滑,避免震荡,训练更稳定。

相关推荐
Jmayday1 分钟前
Pytorch:RNN理论基础
pytorch·rnn·深度学习
AI周红伟2 小时前
周红伟:GPT-Image-2深度解析:从技术原理到实战教程,为什么它能让整个AI圈炸锅?
人工智能·gpt·深度学习·机器学习·语言模型·openclaw
端平入洛3 小时前
梯度是什么:PyTorch 自动求导详解
人工智能·深度学习
Uopiasd1234oo3 小时前
上下文引导模块改进YOLOv26局部与全局特征融合能力双重提升
深度学习·yolo·机器学习
动物园猫5 小时前
工业织物缺陷目标检测数据集分享(适用于YOLO系列深度学习分类检测任务)
深度学习·yolo·目标检测
ACCELERATOR_LLC5 小时前
【DataWhale组队学习】DIY-LLM Task6 评估与基准测试
人工智能·深度学习·大模型·模型评估
狮子座明仔5 小时前
ThinkTwice: 让模型学会“做完题再检查一遍“,推理+自纠错联合训练只加3%开销
大数据·人工智能·深度学习
隔壁大炮6 小时前
Day07-RNN层(循环网络层)
人工智能·pytorch·python·rnn·深度学习·神经网络·计算机视觉
用AI赚一点7 小时前
AI落地不是造大模型:从概念到落地的核心差异
人工智能·深度学习·机器学习
小超同学你好7 小时前
Transformer 30. MoCo:用「动量编码器 + 队列字典」把对比学习做成可扩展的“字典查找”
深度学习·学习·transformer