当前位置: 首页 > article >正文

【DL经典回顾】激活函数大汇总(二十五)(GEGLU附代码和详细公式)

激活函数大汇总(二十五)(GEGLU附代码和详细公式)

更多激活函数见激活函数大汇总列表

一、引言

欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过几篇文章的形式,本篇详细介绍两种激活函数,旨在帮助读者深入了解各种激活函数的特点、应用场景及其对模型性能的影响。

在接下来的文章中,我们将逐一探讨各种激活函数,从经典到最新的研究成果。

限于笔者水平,对于本博客存在的纰漏和错误,欢迎大家留言指正,我将不断更新。

二、GEGLU

GEGLU (Gated Exponential Linear Unit) 是一个结合了GELU (Gaussian Error Linear Unit) 和GLU (Gated Linear Unit) 特性的激活函数。它利用了GELU提供的非线性以及GLU的门控机制,旨在通过动态调节神经元的激活程度来提高模型的表现力和灵活性。虽然GEGLU的直接文献可能较少,但可以通过分析GELU和GLU的结合来理解其特性。

1. 数学定义

假设我们有两个输入 a a a b b b,则GEGLU的数学表达式可以定义为:

GEGLU ⁡ ( a , b ) = a ⊗ GELU ⁡ ( b ) \operatorname{GEGLU}(a, b)=a \otimes \operatorname{GELU}(b) GEGLU(a,b)=aGELU(b)
这里, a a a b b b是同形状的输入向量或张量, ⊗ \otimes 表示逐元素乘法,而 GELU ⁡ ( b ) \operatorname{GELU}(b) GELU(b)是应用在 b b b上的GELU函数。
在这里插入图片描述

2. 函数特性

  • 门控机制:类似于GLU,GEGLU使用一个输入 b b b来控制另一个输入 a a a的激活强度,提供了动态的激活能力。
  • 非线性:通过GELU部分,GEGLU引入了基于Gaussian分布的非线性,有助于模型捕获更复杂的数据模式。
  • 自适应激活:GEGLU能够根据 b b b的值自适应地调整 a a a的激活程度,这种自适应能力使得模型可以根据数据特征动态调整其行为。

3. 导数

GEGLU的导数涉及到GELU函数的导数,具体形式依赖于GELU的定义。GELU的导数本身涉及到标准正态分布的累积分布函数和概率密度函数,因而GEGLU的导数计算较为复杂。

4. 使用场景与局限性

使用场景

  • 自然语言处理和图像处理:GEGLU的动态激活特性特别适合于处理序列数据和高维度特征的任务,如自然语言处理和图像处理领域。
  • 深层网络:在深层网络中,GEGLU的自适应激活能力有助于改善信息流和梯度传播,可能减少梯度消失或梯度爆炸问题。

局限性

  • 计算复杂度:由于GELU函数的计算相对复杂,GEGLU可能增加模型的计算负担。
  • 优化难度:GEGLU引入的动态激活机制可能使得模型训练的优化过程更加复杂,需要更细致的调参。

GEGLU通过结合GELU的高级非线性和GLU的门控机制,为深度学习模型提供了一种强大的激活函数选项。然而,其使用需要在模型设计和训练策略上进行仔细考虑,以充分利用其特性并应对其挑战。

5.代码实现

代码

这段代码定义了GEGLU (Gated Exponential Gaussian Linear Unit) 激活函数,并提供了一个示例应用:

import numpy as np

def gelu(x):
    """
    实现Gaussian Error Linear Unit (GELU) 激活函数。
    """
    return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))

def geglu(a, b):
    """
    实现Gated Exponential Gaussian Linear Unit (GEGLU) 激活函数。
    
    参数:
    a, b -- 输入的数值或NumPy数组,形状相同。
    
    返回:
    GEGLU激活后的输出。
    """
    # 计算GELU激活
    gelu_b = gelu(b)
    # 应用门控机制
    output = a * gelu_b
    
    return output

# 示例输入
a = np.array([1, -1, 0.5, -0.5])
b = np.array([0.5, -0.5, 1, -1])

# 应用GEGLU激活函数
output = geglu(a, b)

print("GEGLU Output:", output)
解释
  • GELU激活函数:首先,定义了GELU激活函数gelu(x),这是GEGLU的核心部分之一。GELU使用了一个基于高斯分布的公式,为输入x提供非线性变换。

  • GEGLU激活函数:随后,定义了GEGLU激活函数geglu(a, b),它接受两个输入abb输入经过GELU激活,然后该激活结果与a逐元素相乘,实现了门控机制。

  • 示例应用:在示例中,ab是两个形状相同的NumPy数组。它们分别通过GEGLU函数处理,展示了如何在实践中应用GEGLU激活函数。

  • 输出:示例输出展示了GEGLU激活后的结果。通过GELU门控的方式,a的每个元素根据b的相应元素经过GELU处理的结果进行调整。

  • 优化挑战:引入门控机制可能增加模型训练过程中的优化挑战,需要精细的参数调整和优化策略。

三、参考文献

  • Shazeer N. Glu variants improve transformer[J]. arXiv preprint arXiv:2002.05202, 2020.
  • GELU激活函数的原始文献Hendrycks, D., & Gimpel, K. (2016). “Gaussian Error Linear Units (GELUs)”. arXiv preprint arXiv:1606.08415. 这篇论文首次提出了GELU激活函数,提供了关于它是如何被设计出来的详细信息,以及为何它在某些情况下优于其他激活函数。
  • 门控线性单元(GLU)相关文献Dauphin, Y. N., Fan, A., Auli, M., & Grangier, D. (2017). “Language Modeling with Gated Convolutional Networks”. In Proceedings of the 34th International Conference on Machine Learning-Volume 70 (pp. 933-941). GLU激活函数在这篇论文中被提出,用于构建更复杂的神经网络结构。

http://www.kler.cn/a/274325.html

相关文章:

  • 【NLP 16、实践 ③ 找出特定字符在字符串中的位置】
  • 图形学笔记 - 5. 光线追踪2 - 加速结构
  • 代码加入SFTP JAVA ---(小白篇3)
  • 免费GIS工具箱:轻松将glb文件转换成3DTiles文件
  • 多屏幕编程时用pygame指定窗口出现在第二块显示器上的方法
  • 游戏渠道假量解决方案
  • 金蝶云星空——插件dll重新发布报错:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�
  • tesseract ocr 安装/调用/训练
  • 使用Java JDBC连接数据库
  • c语言指针(二)
  • 概率统计在AI中的作用
  • Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀
  • 在线教育平台帮助教培机构打造线上
  • 代码随想录算法训练营第二十八天 | 93.复原IP地址 78.子集 90.子集II
  • IText5填充PDF表单使用自定义字体中文生效而英文和数字不生效?
  • Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)
  • 构建Helm chart和chart使用管道与函数简介
  • (008)Unity StateMachineBehaviour的坑
  • 自动驾驶决策 - 规划 - 控制 (持续更新!!!)
  • 移除元素(leetcode)
  • 人外周血单核细胞来源树突状细胞(MoDC)的制备(一)
  • 下拉树级带搜索功能
  • 分布式锁的详细解释
  • Linux Shell中的循环控制语句
  • 代码随想录算法训练营第二十四天|leetcode78、90、93题
  • 软件测试:C++ Google Test单元测试框架GTest