博客
关于我
2.6.3 GELU激活函数原理及代码
阅读量:798 次
发布时间:2023-04-03

本文共 1165 字,大约阅读时间需要 3 分钟。

GELU激活函数:原理与实现

GELU(Gaussian Error Linear Unit)是一种新的激活函数,近年来在深度学习领域中备受关注。它通过引入高斯分布的变换,解决了传统激活函数中梯度消失问题,同时提升了模型的训练效率。本文将从原理、优点以及代码实现三个方面,详细解析GELU激活函数。

GELU的数学原理

GELU激活函数的定义公式为:

$$ GELU(x) = x \cdot \Phi(x) $$

其中,$\Phi(x)$ 是标准正态分布的累积分布函数(CDF),表示为:

$$ \Phi(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} e^{-t^2/2} dt $$

这个公式虽然精确,但计算复杂,难以在实时推理中使用。因此,研究者提出了一个近似公式:

$$ GELU(x) \approx 0.5 \cdot x \cdot \left(1 + \tanh\left(\sqrt{\frac{\pi}{2}} \cdot (x + 0.047715 x^3)\right)\right) $$

这个近似公式不仅简化了计算,还保持了与原公式的很高一致性。

GELU与RELU的对比

相比RELU激活函数,GELU具有以下显著优点:

  • 无梯度消失问题

    RELU在输入为负值时,激活输出恒为0,导致导数为0,导致梯度消失。GELU激活函数在输入为负值时,输出并不会完全为零,从而避免了梯度消失问题。

  • 更好的平滑性

    在输入为0时,RELU激活函数不可导,而GELU激活函数在该点处具有光滑的曲线,保证了导数的连续性,使得模型更容易训练。

  • 更广的输出范围

    GELU激活函数的输出范围比RELU更广,输出值可以在-1到1之间变化,这有助于加速模型的收敛速度。

  • GELU激活函数的代码实现

    以下是PyTorch框架中GELU激活函数的实现代码:

    class GELU(nn.Module):
    def __init__(self):
    super(GELU, self).__init__()
    def forward(self, x):
    return 0.5 * x * (1 + torch.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * torch.pow(x, 3))))

    这个代码实现了GELU激活函数的近似公式,能够在实际应用中快速计算出激活值。

    总结

    GELU激活函数凭借其独特的数学特性和优点,逐渐成为深度学习模型中的重要组成部分。相比传统的激活函数如RELU,GELU不仅解决了梯度消失问题,还提升了模型的训练效率。如果你正在寻找一种更高效的激活函数,GELU绝对值得一试。

    转载地址:http://lzrfk.baihongyu.com/

    你可能感兴趣的文章
    oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)
    查看>>
    Oracle11G基本操作
    查看>>
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    查看>>
    Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
    查看>>
    oracle12安装软件后安装数据库,然后需要自己配置监听
    查看>>
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    Oracle——distinct的用法
    查看>>
    Oracle、MySQL、SQL Server架构大对比
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
    查看>>
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    Oracle中序列的操作以及使用前对序列的初始化
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>