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

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

激活函数大汇总(十二)(GLU & ReGLU附代码和详细公式)

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

一、引言

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

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

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

二、GLU

GLU (Gated Linear Unit) 激活函数是一种通过学习门控机制来动态调节信息流的方法。它在许多深度学习架构中被用来增强模型的表达能力,特别是在序列处理和语言模型中表现出色。

1. 数学定义

GLU激活函数定义为:

GLU ⁡ ( a , b ) = a ⊙ σ ( b ) \operatorname{GLU}(a, b)=a \odot \sigma(b) GLU(a,b)=aσ(b)
其中:

  • a a a b b b是相同维度的输入向量。
  • ⊙ \odot 表示元素乘法。
  • σ ( b ) \sigma(b) σ(b)是对输入 b b b应用Sigmoid激活函数,得到的值在0和1之间,用作门控信号。
    在这里插入图片描述

2. 函数特性

  • 动态门控机制:GLU通过学习 b b b的门控信号来动态地调节 a a a中每个元素的激活强度,这种机制允许模型根据上下文信息自适应地过滤或强化特定的信息流。
  • 自适应性强:GLU能够让模型自适应地选择它需要强化或忽略的信息,这有助于模型捕获数据中的复杂依赖关系。
  • 非饱和性:由于GLU的输出部分取决于Sigmoid函数,它避免了像ReLU那样的饱和问题,有助于减轻梯度消失问题。

3. 导数

GLU函数关于 a a a b b b的导数分别为:

  • 对于 a a a ∂ G L U ∂ a = σ ( b ) \frac{\partial \mathrm{GLU}}{\partial a}=\sigma(b) aGLU=σ(b)
  • 对于 b b b ∂ G L U ∂ b = a ⋅ σ ( b ) ⋅ ( 1 − σ ( b ) ) \frac{\partial \mathrm{GLU}}{\partial b}=a \cdot \sigma(b) \cdot(1-\sigma(b)) bGLU=aσ(b)(1σ(b))

这意味着, a a a的梯度受到门控信号 σ ( b ) \sigma(b) σ(b)的调节,而 b b b的梯度则与 a a a的值和门控信号的导数 σ ( b ) ⋅ ( 1 − σ ( b ) ) \sigma(b) \cdot(1-\sigma(b)) σ(b)(1σ(b))有关。

4. 使用场景与局限性

使用场景

  • 语言模型和序列处理:GLU在处理序列数据,尤其是在构建复杂的语言模型和序列到序列的模型时,能够有效地增强模型的性能。
  • 特征选择:在需要模型从大量特征中选择相关信息的任务中,GLU的门控机制可以自适应地过滤掉不重要的特征。

局限性

  • 参数增加:由于GLU对于每个输入都需要一对参数 a a a b b b,这可能导致模型参数数量的增加。
  • 计算复杂性:相比于一些简单的激活函数,GLU的计算更加复杂,特别是在门控信号需要通过Sigmoid函数计算时。

5.代码实现

import numpy as npdef glu(a, b):"""计算GLU激活函数的值。参数:a -- 输入值,可以是数值、NumPy数组或者多维数组。b -- 门控信号,维度应与a相同。返回:经过GLU激活的结果。"""sigmoid_b = 1 / (1 + np.exp(-b))  # 应用Sigmoid函数到breturn a * sigmoid_b  # 返回a和Sigmoid(b)的元素乘结果

解读

  • Sigmoid门控1 / (1 + np.exp(-b))这行代码对输入b应用Sigmoid函数,将其转换为一个位于(0, 1)区间内的门控信号。这个信号决定了另一输入a的每个元素应该被强化还是被抑制。
  • 元素乘法:通过a * sigmoid_b计算a和Sigmoid处理后的b的元素级乘法,实现GLU的核心功能。这一步骤允许a中的每个元素根据对应的门控信号被按比例调整,实现动态门控。
  • 向量化操作:该实现通过使用NumPy,自然地支持向量化操作,使得glu函数可以直接作用于整个数组,无需显式循环。这对于高效处理大量数据非常关键。

示例使用

# 示例输入
a = np.array([0.5, -1, 2, -2])
b = np.array([1, -1, 0, 2])# 应用GLU激活函数
glu_output = glu(a, b)print("GLU Output:", glu_output)

这个例子展示了如何对两个具有相同维度的输入数组ab应用GLU激活函数。

三、ReGLU

ReGLU(Rectified GLU)激活函数是一个相对较新的概念,融合了GLU(Gated Linear Unit)的思想与ReLU(Rectified Linear Unit)的特性。GLU是一种通过学习到的门控机制来控制信息流的激活函数,而ReGLU则在此基础上添加了ReLU的非线性特性。

1. 数学定义

假设有两个相同维度的输入向量 a a a b b b,ReGLU激活函数定义为:

ReGLU ⁡ ( a , b ) = ReLU ⁡ ( a ) ⊙ σ ( b ) \operatorname{ReGLU}(a, b)=\operatorname{ReLU}(a) \odot \sigma(b) ReGLU(a,b)=ReLU(a)σ(b)
其中, ⊙ \odot 表示元素乘法, ReLU ⁡ ( a ) = max ⁡ ( 0 , a ) \operatorname{ReLU}(a)=\max (0, a) ReLU(a)=max(0,a)是标准的ReLU函数, σ ( b ) = 1 1 + e − b \sigma(b)=\frac{1}{1+e^{-b}} σ(b)=1+eb1是Sigmoid函数。

2. 函数特性

  • 门控机制:ReGLU通过Sigmoid函数 σ ( b ) \sigma(b) σ(b)作用于 b b b来学习一个门控信号,这个门控信号决定了 a a a的激活强度。
  • 非线性激活:通过将ReLU应用于 a a a,ReGLU引入了非线性,有助于增加模型的表达能力。
  • 自适应特性:ReGLU的门控机制允许模型自适应地调整信息的流动,这可以根据任务的需求学习到最有效的表示。

3. 导数

ReGLU激活函数的导数相对复杂,因为它涉及到两个不同函数的导数。导数可以通过链式法则计算,分别对 a a a b b b进行求导。

4. 使用场景与局限性

使用场景

  • 复杂特征提取:在需要模型学习复杂特征表示的任务中,如深度学习中的图像识别、自然语言处理等领域。
  • 动态信息流控制:在模型需要根据数据动态调整信息流的场景中,ReGLU提供了一种有效的机制。

局限性

  • 计算复杂度:由于涉及到Sigmoid和ReLU两个不同的函数,ReGLU的计算复杂度高于单一的激活函数,这可能增加训练和推理的计算成本。
  • 参数调优:ReGLU的有效性可能依赖于正确的参数设置和模型架构设计,需要进行细致的调优才能达到最佳性能。

5.代码实现

import numpy as npdef reglu(a, b):"""计算ReGLU激活函数的值。参数:a, b -- 输入值,可以是数值、NumPy数组或者多维数组,维度必须相同。返回:ReGLU激活后的结果。"""relu_a = np.maximum(0, a)  # 应用ReLU到asigmoid_b = 1 / (1 + np.exp(-b))  # 应用Sigmoid到breturn relu_a * sigmoid_b  # 返回元素乘的结果

解读

  • ReLU应用np.maximum(0, a)对输入a应用ReLU函数,即对于a中的每个元素,如果元素值大于0,则保持不变;否则,将其设置为0。
  • Sigmoid应用1 / (1 + np.exp(-b))对输入b应用Sigmoid函数,将b中的每个元素映射到(0, 1)区间内,代表门控信号的强度。
  • 元素乘法:最后,通过relu_a * sigmoid_b计算两个数组的元素级乘法,输出ReGLU激活函数的结果。这个操作实现了一个按元素门控的机制,其中a的激活强度由b学习到的门控信号调节。

示例使用

# 示例输入
a = np.array([1, -2, 3, -4])
b = np.array([5, -1, 2, 3])# 应用ReGLU激活函数
output = reglu(a, b)print("ReGLU Output:", output)

这个例子展示了如何对两个具有相同维度的输入数组ab应用ReGLU激活函数。

四、参考文献

  • 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 (ICML). 这篇论文是GLU在深度学习中应用的重要文献之一,作者展示了在语言模型中使用门控卷积网络(使用GLU)如何有效地提高模型性能。
  • Shazeer N. Glu variants improve transformer[J]. arXiv preprint arXiv:2002.05202, 2020.

相关文章:

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

激活函数大汇总(十二)(GLU & ReGLU附代码和详细公式) 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或…...

【C++】string类初步介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 为什么学习string类1.1 C语言中的字符串1.2 推荐学习网站 2. 标准库中的string类2.1 string类2.2 string类的常用接口说明2.2.1 constructor2.2.2 遍历string2.2.2.1 下标加[]遍历2.2.2.2 迭代器(itera…...

HCIP --- BGP 综合实验

目录 实验拓扑图: 实验要求: 实验步骤: 1.划分IP地址 R1的配置 R2的配置 R3的配置 R4的配置 R5的配置 R6的配置 R7的配置 R8的配置 2.检测查询IP地址 3.OSPF 建邻 4.查询OSPF 建邻是否成功 5.AS 2 内部BGP 建邻 a. AS 2 内部 IBG…...

【优选算法】专题1 -- 双指针 -- 移动零

前言: 📚为了提高算法思维,我会时常更新这个优选算法的系列,这个专题是关于双指针的练习 🎯个人主页:Dream_Chaser~-CSDN博客 一.移动零(easy) 描述: 「数组分两块」是⾮…...

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)1. 各种变换的关系2. 变换公式3. 2D变换的层次4. python实现 一、向量和矩阵的基本运算 【计算机视觉】二、图像形成:1、向量和矩阵…...

蓝桥杯---棋盘(典型的二维差分问题)

题目链接:棋盘 这道题真的是非常典型的二维差分问题了(在我个人看来),题目中的0和1,我们直接让差分数组,偶数就是0,奇数就是1.初始化是0,是白子(偶数)&#x…...

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。 例如:"2 * Math.PI /…...

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决:写在scope外面 uniapp设置底部导航 引用:https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…...

oppo前端开发一面

提问: 1. 谈谈你怎么实现响应式布局 2. 谈谈你对weback的了解,vite和webpack的区别,webpack loader 3. 你项目怎么用CI/CD(不懂,只知道自动化部署了😭) 4. ts中type和interface区别 5. axi…...

案例分析篇09:Web架构设计相关20个考点(7~11)(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…...

为什么“玄学”与营销联系?媒介盒子分析

在去年有年轻人在上班与上进之中,选择上香,而今年有咖啡品牌买咖啡送木鱼,还有香飘飘在普陀山吸好运,望山楂直接覆盖香火最旺的寺庙,玄学营销的势头甚至盖过了联名营销,呈现节点化的趋势。为什么会这样&…...

C++常用容器总结

容器分为三类,顺序容器,关联容器和适配器。顺序容器又分为连续的容器(vector,array),顺序容器中的离散容器(list,slist,forward_list),离连形的de…...

C# Onnx C2PNet 图像去雾 室外场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室外场景 介绍 github地址:https://github.com/YuZheng9/C2PNet [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing 效果 模型信息 Model P…...

【English Learning】Day13

2024/03/14 和小录打卡的第13天 目录 Words & phrases Words & phrases incrredibly incredibly busy 超级忙merely not merely 不仅仅tragedy a terible tregedy 可怕的悲剧a personal tragedy 个人遭遇strive strive to be best 努力做最好的strive for peace 为和平…...

智障版本GPT3实现

背景,实现GPT3,采用python代码。调库hf及tf2.0+基础。 由于完全实现GPT模型及其预训练过程涉及大量的代码和计算资源,以下是一个基于TensorFlow 2.x的简化版GPT模型构建和调用的示例。请注意,这仅展示了模型的基本结构,实际运行需替换为真实数据集和预处理步骤,且无法直…...

【ubuntu】安装 Anaconda3

目录 一、Anaconda 说明 二、操作记录 2.1 下载安装包 2.1.1 官网下载 2.1.2 镜像下载 2.2 安装 2.2.1 安装必要的依赖包 2.2.2 正式安装 shell 和 base 的切换 2.2.3 检测是否安装成功 方法一 方法二 方法三 2.3 其他 三、参考资料 3.1 安装资料 3.2 验证是否…...

代码随想录|Day20|二叉树09|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 思路&#xff1a;利用二叉搜索树的性质&#xff0c;对于每个节点&#xff0c;判断其是否在区间内&#xff1a; 如果节点值 < low&#xff0c;则此节点和其左子树都不在范围内如果节点值 > high&#xff0c;则此节点和其右子树都不在范围内如果 low &…...

开源的java 代码分析库介绍

本文将为您详细讲解开源的 Java 代码分析库&#xff0c;以及如何安装这些库、它们的特性、区别和应用场景。Java 社区提供了多种代码分析工具&#xff0c;这些工具可以帮助您在 Java 应用程序中进行代码质量评估、性能分析、安全检查等功能。 1. CheckStyle 安装 - 通过…...

基于udp协议的网络通信(windows客户端版+简易聊天室版),重定向到终端

目录 和windows通信 引入 思路 WSADATA 代码 运行情况 简单的聊天室 思路 重定向 代码 terminal.hpp -- 重定向函数 服务端 客户端 运行情况 和windows通信 引入 linux和windows都需要联网,虽然他们系统设计不同,但网络部分一定是相同的,所以套接字也是一样的 这…...

Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频

在上一节Qt+FFmpeg+opengl从零制作视频播放器-6.视频解码中,我们学到了如何将视频数据解码成YUV原始数据,并且保存到本地,最后使用工具来播放YUV文件。 本节使用QOpenGLWidget来渲染解码后的YUV视频数据。 首先简单介绍QOpenGLWidget的使用。 QOpenGLWidget类是用于渲染O…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...