【深度学习】GELU激活函数是什么?

news2024/12/24 8:19:58

torch.nn.GELU 模块在 PyTorch 中实现了高斯误差线性单元(GELU)激活函数。GELU 被用于许多深度学习模型中,包括Transformer,因为它相比传统的 ReLU(整流线性单元)函数能够更好地近似神经元的真实激活行为。

概述

  • 功能: 应用 GELU 激活函数。
  • 公式: GELU 激活函数可以表示为:
    GELU ( x ) = x ⋅ Φ ( x ) \text{GELU}(x) = x \cdot \Phi(x) GELU(x)=xΦ(x)
    其中 Φ ( x ) \Phi(x) Φ(x) 是标准正态分布的累积分布函数。

使用方法

要在神经网络中使用 torch.nn.GELU 模块,你可以简单地导入它并将其添加到模型的层中。以下是一个示例:

import torch
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.layer1 = nn.Linear(10, 20)
        self.gelu = nn.GELU()
        self.layer2 = nn.Linear(20, 10)

    def forward(self, x):
        x = self.layer1(x)
        x = self.gelu(x)
        x = self.layer2(x)
        return x

# 创建模型实例
model = MyModel()

# 创建一个随机输入张量
input_tensor = torch.randn(5, 10)

# 前向传播
output_tensor = model(input_tensor)
print(output_tensor)

解释

  • nn.Linear(10, 20): 一个线性层,输入大小为 10,输出大小为 20。
  • nn.GELU(): GELU 激活函数,应用于第一个线性层的输出。
  • nn.Linear(20, 10): 另一个线性层,输入大小为 20,输出大小为 10。

GELU 激活函数用于在模型中引入非线性,这有助于模型学习更复杂的模式。

GELU 的优点

  • 平滑近似: GELU 提供了一种比 ReLU 更平滑的神经元激活近似,这可以帮助训练的稳定性和收敛性。
  • 概率解释: 通过结合累积分布函数,GELU 以更有原则的方式考虑激活的概率,这可能在某些模型(尤其是自然语言处理 (NLP) 和计算机视觉 (CV) 中)带来更好的性能。

通过在你的 PyTorch 模型中使用 torch.nn.GELU,你可以利用这些优点来提高神经网络的性能和训练动态。

GELU(Gaussian Error Linear Unit)激活函数是在论文《Gaussian Error Linear Units (GELUs)》中提出的。这篇论文由 Dan Hendrycks 和 Kevin Gimpel 于 2016 年发表。

以下是使用 Python 和 Matplotlib 绘制 GELU 激活函数的函数曲线的代码:

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

# 定义 GELU 激活函数
def gelu(x):
    return 0.5 * x * (1 + erf(x / np.sqrt(2)))

# 生成 x 轴数据
x = np.linspace(-3, 3, 400)
# 计算 y 轴数据
y = gelu(x)

# 绘制 GELU 激活函数曲线
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='GELU', color='blue')
plt.title('GELU Activation Function')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend()
plt.grid(True)
plt.show()

运行上述代码将生成一个展示 GELU 激活函数的曲线图:

在这里插入图片描述
优点:

  • 平滑的近似:

GELU 提供了比 ReLU 更平滑的激活函数,这有助于神经网络更稳定地训练并提高收敛性。ReLU 在负数区间完全关闭,而 GELU 会根据输入值的大小逐渐激活神经元。

  • 概率解释:

GELU 将标准正态分布的累积分布函数(CDF)结合到激活函数中,以一种更有原则的方式处理激活的概率。这种方法考虑了输入值的分布,使得神经网络可以更有效地处理不同范围的输入。

  • 更好的性能:

由于 GELU 函数的平滑性和概率解释,它在处理某些任务时(尤其是在自然语言处理 (NLP) 和计算机视觉 (CV) 任务中)表现出色。在这些任务中,GELU 激活函数可以提高模型的性能。

  • 渐进式变化:

相对于 ReLU 的硬边界(即大于零输出本身,小于零输出零),GELU 提供了一种更加渐进式的激活方式,使得小负值输入仍然能够产生一定的激活效果,这在某些情况下可以提高模型的表现。

GELU 反向传播的公式

GELU 激活函数的公式

GELU 激活函数定义为:
GELU ( x ) = x ⋅ Φ ( x ) \text{GELU}(x) = x \cdot \Phi(x) GELU(x)=xΦ(x)
其中 Φ ( x ) \Phi(x) Φ(x) 是标准正态分布的累积分布函数。 Φ ( x ) \Phi(x) Φ(x) 的表达式为:
Φ ( x ) = 1 2 ( 1 + erf ( x 2 ) ) \Phi(x) = \frac{1}{2} \left( 1 + \text{erf}\left( \frac{x}{\sqrt{2}} \right) \right) Φ(x)=21(1+erf(2 x))

GELU 的梯度公式

为了求 GELU 的梯度,我们需要对其进行求导。这里 erf ( x ) \text{erf}(x) erf(x) 是误差函数,定义为:
erf ( x ) = 2 π ∫ 0 x e − t 2   d t \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} \, dt erf(x)=π 20xet2dt

求导过程

GELU 的导数可以表示为:
d d x GELU ( x ) = d d x ( x ⋅ Φ ( x ) ) \frac{d}{dx} \text{GELU}(x) = \frac{d}{dx} \left( x \cdot \Phi(x) \right) dxdGELU(x)=dxd(xΦ(x))

根据乘积法则:
d d x ( x ⋅ Φ ( x ) ) = Φ ( x ) + x ⋅ d d x Φ ( x ) \frac{d}{dx} \left( x \cdot \Phi(x) \right) = \Phi(x) + x \cdot \frac{d}{dx} \Phi(x) dxd(xΦ(x))=Φ(x)+xdxdΦ(x)

我们需要对 Φ ( x ) \Phi(x) Φ(x) 进行求导:
d d x Φ ( x ) = d d x ( 1 2 ( 1 + erf ( x 2 ) ) ) \frac{d}{dx} \Phi(x) = \frac{d}{dx} \left( \frac{1}{2} \left( 1 + \text{erf}\left( \frac{x}{\sqrt{2}} \right) \right) \right) dxdΦ(x)=dxd(21(1+erf(2 x)))

由于常数部分导数为零,我们仅对 erf ( x 2 ) \text{erf}\left( \frac{x}{\sqrt{2}} \right) erf(2 x) 进行求导:
d d x erf ( x 2 ) = 2 π e − ( x 2 ) 2 ⋅ 1 2 = e − x 2 / 2 2 π \frac{d}{dx} \text{erf}\left( \frac{x}{\sqrt{2}} \right) = \frac{2}{\sqrt{\pi}} e^{-\left( \frac{x}{\sqrt{2}} \right)^2} \cdot \frac{1}{\sqrt{2}} = \frac{e^{-x^2/2}}{\sqrt{2\pi}} dxderf(2 x)=π 2e(2 x)22 1=2π ex2/2

所以:
d d x Φ ( x ) = 1 2 π e − x 2 / 2 \frac{d}{dx} \Phi(x) = \frac{1}{\sqrt{2\pi}} e^{-x^2/2} dxdΦ(x)=2π 1ex2/2

将其代入前面的公式,我们得到:
d d x GELU ( x ) = Φ ( x ) + x ⋅ 1 2 π e − x 2 / 2 \frac{d}{dx} \text{GELU}(x) = \Phi(x) + x \cdot \frac{1}{\sqrt{2\pi}} e^{-x^2/2} dxdGELU(x)=Φ(x)+x2π 1ex2/2

因此,GELU 的梯度为:
d d x GELU ( x ) = 1 2 ( 1 + erf ( x 2 ) ) + x ⋅ 1 2 π e − x 2 / 2 \frac{d}{dx} \text{GELU}(x) = \frac{1}{2} \left( 1 + \text{erf}\left( \frac{x}{\sqrt{2}} \right) \right) + x \cdot \frac{1}{\sqrt{2\pi}} e^{-x^2/2} dxdGELU(x)=21(1+erf(2 x))+x2π 1ex2/2

Python 代码绘制 GELU 梯度曲线

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

# 定义 GELU 激活函数
def gelu(x):
    return 0.5 * x * (1 + erf(x / np.sqrt(2)))

# 定义 GELU 激活函数的导数
def gelu_derivative(x):
    return 0.5 * (1 + erf(x / np.sqrt(2))) + (x * np.exp(-x**2 / 2)) / np.sqrt(2 * np.pi)

# 生成 x 轴数据
x = np.linspace(-3, 3, 400)
# 计算 y 轴数据
y = gelu(x)
# 计算 y' 轴数据
dy = gelu_derivative(x)

# 绘制 GELU 激活函数和梯度曲线
plt.figure(figsize=(8, 6))
plt.plot(x, y, label='GELU', color='blue')
plt.plot(x, dy, label='GELU Derivative', color='red', linestyle='dashed')
plt.title('GELU Activation Function and Its Derivative')
plt.xlabel('Input')
plt.ylabel('Output')
plt.legend()
plt.grid(True)
plt.show()

运行这段代码将生成一个展示 GELU 激活函数及其梯度的曲线图,有助于直观地理解 GELU 在反向传播中的行为:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HardFault Err,无法调试,错误定位

一、简介 在平时开发的时候,经常会遇到程序报错的情况。对于裸机来说,可以通过在线调试的方式进行定位问题。但是对于RTOS系统来时,很多MCU/SOC是不支持在线调试的,此时,如果系统报错,我们就需要根据系统的…

节假日零售数据分析:节假日销售的得力助手

在奥威BI零售数据分析方案预设了一张BI节假日分析报表(BI数据可视化报表),它能够帮助零售企业深入理解节假日期间的销售动态,从而做出更精准的市场策略调整。以下是利用该报表进行数据分析的具体步骤和要点: 一、数据…

burp靶场xss漏洞(中级篇)上

靶场地址 http://portswigger.net/web-security/all-labs#cross-site-scripting 第一关:DOM型(使用document.write函数) 1.点击随机商品后找到搜索框,后在URL中添加storeId查询参数,并输入一个随机字母数字字符串作为…

从入门到精通:一步步打造稳定可靠的API服务

引言 在当今的软件开发周期中,API服务已经成为重要的组成部分,它们允许不同的应用程序和服务之间进行通信和数据交换。打造一个稳定可靠的API服务对于任何商业应用来说都是至关重要的。本文将作为指南,从基础知识到高级技术,一步…

知乎号开始运营了,宣传一波

知乎号开始发布一些小说、散文还有诗歌了,欢迎大家多来关注 知乎链接:姜亚轲 每篇小说都改编成网易云音乐,文章中也有链接,我做的词,Suno编曲和演唱,欢迎大家来听听

访问jlesage/firefox镜像创建的容器中文乱码问题

目录 介绍总结 介绍 最近在使用jlesage/firefox镜像创建容器的时候,发现远程管理家里网络的时候中文会出现乱码,导致整个体验非常的不好,网上查找资料说只要设置环境变量ENABLE_CJK_FONT1 就可以解决问题,抱着试一试的态度还真的成…

如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法

🛠️ 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法 摘要: 本文将带领大家深入学习如何解决 Xshell 使用 SSH 连接 Linux 服务器时报错“找不到匹配的 host key 算法”的问题。通过详细的操作步骤和代码案…

deepin学习-设置自己窗口为最高层级

deepin-设置自己窗口为最高层级 一、概述1. kwin 中的窗口层级定义2. dde-session-ui 中的消息弹窗3. k-win的调试器 一、概述 窗口协议:wayland 在wayland的窗口下,有时候使用qt开发接口并不能满足我们的要求,就需要看窗管的写法。 setWi…

详解|访问学者申请被拒原因有哪些?

访问学者项目为全球科研人员提供了一个难得的机会,让他们能够跨越国界,深入不同的学术环境,进行学术交流和合作。然而,并非所有申请者都能如愿以偿地获得这一机会。本文将对访问学者申请中常见的被拒原因进行详细解析,…

计算机游戏因为d3dcompiler_47.dll丢失无法启动怎么办?解决只要d3dcompiler_47.dll丢失无法启动游戏软件的方法

d3dcompiler_47.dll 是一个动态链接库文件,属于 Microsoft DirectX 的一部分,主要负责编译和运行 3D 图形程序。它是支持 Direct3D 功能的核心组件,Direct3D 是一种用于编程 3D 图形的 API,广泛应用于游戏和图形密集型应用程序中。…

如何设置天锐绿盾的数据防泄密系统

设置天锐绿盾的数据防泄密系统,可以按照以下步骤进行: 一、系统安装与初始化 在线或离线安装天锐绿盾数据防泄密系统,确保以管理员身份运行安装包,并按照安装向导的提示完成安装。输入序列号进行注册,激活系统。 二…

Vuex遇到浏览器刷新,store里存的数据还在吗?

我们在做Vue前端项目的时候,很可能会使用Vuex来做一些状态或者数据管理,希望在一定程度上,不发送网络请求,不经过密集的组件数据传输,也可以达到数据共享的目的。但如果浏览器页面刷新了,Vuex中store里存的…

摩根大通研究论文:大型语言模型+自动规划器用来作有保障的旅行规划

【摘要】旅行规划是一项复杂的任务,涉及生成一系列与访问地点相关的动作序列,需要满足约束条件并最大化某些用户满意度标准。传统方法依赖于以给定形式语言表示问题,从网络来源中提取相关的旅行信息,并使用适当的问题求解器生成有效解决方案。作为替代方案,最近基于大型语言模型…

Guitar Pro 8软件安装包下载

简介: Guitar Pro吉他软件为帮助所有吉他爱好者学习、绘谱、创作而设计——包含吉他的现有指法及音色, Guitar Pro能了解各类线谱,看谱练吉他,对谱听示范,记录初创声音。 在做弹拨乐器的滑音、倚音、推弦、揉弦、泛…

准备好迎接3D世界的AI革新了吗:Direct3D,让3D创作触手可及

DreamTech 推出原生 3D-DiT 大模型 Direct3D 前言 3D-DiT大模型Direct3D 就目前的AI市场而言,将文本和图像转化为高质量的3D资产一直很难实现,主要目前缺乏一种能够捕捉复杂几何结构而且还能够扩展的3D的方法。但 DreamTech 发布了一种名为Direct3D的新型…

麻了,5年Java竟然不知道幂等......

在分布式系统中,接口幂等性是确保操作一致性的关键特性。 啥是幂等性 幂等性 指的是在给定的条件下,无论操作执行多少次,其结果都保持不变。在接口设计中,幂等性意味着使用相同的参数多次调用接口,应产生与单次调用相…

reverse-android-淘最热点so

资源 1. com.maihan.tredian 2021版 淘最热点 2. 该 app 没有加壳 ,也没混淆。 登录抓包 POST: https://api.taozuiredian.com/api/v1/auth/login/sms POST /api/v1/auth/login/sms HTTP/1.1 Content-Type: application/json Connection: close Charset: UTF-8 User-Agen…

充电学习—5、healthed 电池服务

1、healthed服务监听接收内核kernel的电池事件,然后上传数据给framware层的batterysevice,BatteryService计算电池的电量,显示,绘制动画等 android电池系统框架: 2、healthd服务入口:android/system/cor…

普通人如何入门AI人工智能?最短学习路线分享

学AI能干什么? 首先说一下我个人的观点,我认为未来一定会有很多很多人工的重复工作会被AI替代,并且这个趋势无法逆转,不管是你想象得到的行业还是想象不到的行业,从实体到互联网,从工业到家用,…

【Linux】进程_7

文章目录 五、进程8. 进程地址空间9. 进程终止10. 进程等待 未完待续 五、进程 8. 进程地址空间 我们上节知道了进程地址空间是根据页表来使虚拟地址转换成内存中的物理地址,那这种 地址空间 页表 的机制有什么好处呢?①这种机制可以将物理内存从无序…