GLU(Gated Linear Unit) 门控线性单元

news2024/10/3 23:12:07

文章目录

  • 一、RNN
  • 二、GLU
    • 2.1 整体结构
    • 2.2 输入层(Input Sentence+Lookup Table)
    • 2.3 中间层(Convolution+Gate)
    • 2.4 输出层(Softmax)
    • 2.5 实验结果
    • 2.6 实现代码
  • 三、RNN与GLU的对比
  • 参考资料

GLU可以理解为能够并行处理时序数据的CNN网络架构,即利用CNN及门控机制实现了RNN的功能。优点在进行时序数据处理时严格按时序位置保留信息从而提升了性能,并且通过并行处理结构加快了的运算速度。

一、RNN

可以通过之前的博客回顾一下RNN的典型代表LSTM:RNN神经网络-LSTM模型结构
在这里插入图片描述

在这里插入图片描述

二、GLU

GLU是2016年由Yann N. Dauphin在论文《Language Modeling with Gated Convolutional Networks》中提出。

论文地址:https://arxiv.org/abs/1612.08083

2.1 整体结构

GLU在语言模型的建模方法上相比于循环神经网络更具有竞争力,它提出了一种简单的线性门控单元来堆叠卷积层从而使得文本中的 Token 可以并行化处理来获得上下文的语义特征。而且与循环神经网络相比,其复杂度从 O ( N ) O(N) O(N) 降低到 O(N/k) ,其中的 k k k 为卷积核的宽度, N N N 为文本的上下文集合。论文中整个模型的结构如下图所示:
在这里插入图片描述

从上图可以清晰的看到整个模型的结构,主要也就分为三个部分:输入层(Input Sentence+Lookup Table)、中间层(Convolution+Gate)以及输出层(Softmax),很明显的三层式结构。

2.2 输入层(Input Sentence+Lookup Table)

对于模型的输入的每个文本我们可以表示为 W = [ w 1 , w 2 , . . . , w n ] W = [w_1, w_2,..., w_n] W=[w1,w2,...,wn] ,其中的 w 1 , w 2 , . . . , w n w_1, w_2,..., w_n w1,w2,...,wn 为文本中的每个 Token ,这些 Token 在输入到模型的 embedding layer 时通过查表获取相应的向量,可表示为 E = [ e w 1 , e w 2 , . . . , e w n ] E = [e_{w1}, e_{w2},..., e_{wn}] E=[ew1,ew2,...,ewn] ,其中 E E E 作为该条文本的向量集合。

2.3 中间层(Convolution+Gate)

对于输入层获取的文本向量 E = [ e w 1 , e w 2 , . . . , e w n ] E = [e_{w1}, e_{w2},..., e_{wn}] E=[ew1,ew2,...,ewn] 来说,首先输入到两个卷积层 Conv1Conv2,得到两个输出 C c o n v 1 C_{conv1} Cconv1 C c o n v 2 C_{conv2} Cconv2 ,然后将 C c o n v 2 C_{conv2} Cconv2 输入到激活函数 Sigmoid 中,然后通过Hadamard积逐位相乘得到相应的隐层向量 h h h ,更一般的可表示为:

在这里插入图片描述

在这里插入图片描述

到这里可以看出,门控线性单元与LSTM的门控本质上是一样的,只不过在计算隐层向量时不需要依赖上一个时间步。通过堆叠多层卷积就可以得到文本的上下文信息。

作者还提出了一种GTU的门控机制,其实也就是将GLU的前一项利用 tanh 函数进行激活,但多引入一个激活函数就代表梯度在反向传播过程中就多了一项衰减项,因此,作者认为GLU优于GTU。GTU表示为:
在这里插入图片描述

2.4 输出层(Softmax)

输出层采用了 softmax 函数,将神经元的输出映射到 [ 0 , 1 ] [0, 1] [0,1] 的区间,并且满足所有输出的和为1。对于语言模型建模而言,其词表为 V V V v i v_i vi则表示词表中的第 i i i 个词语,那么语言模型在预测到这个词语的概率经过 softmax 归一化就为:
在这里插入图片描述

2.5 实验结果

在这里插入图片描述

从图上可以看出,在相同的计算资源的条件下,GCNN-13的困惑度小于2层神经元数为2048的LSTM模型,由此可以看出GCNN的优越性,并且GCNN是可以并行计算的。

在这里插入图片描述
将门控线性单元GLU与其他机制以及没有门控的模型进行比较,可以明显看出GLU在模型收敛时更快,并且困惑度是比较低的。

2.6 实现代码

import torch
import torch.nn as nn

class GateLinearUnit(nn.Module):
    def __init__(self, embedding_size, num_filers, kernel_size, vocab_size, bias=True, batch_norm=True, activation=nn.Tanh()):
        super(GateLinearUnit, self).__init__()
        self.batch_norm = batch_norm
        self.activation = activation
        self.embedding = nn.Embedding(vocab_size, embedding_size)
        self.conv_layer1 = nn.Conv2d(1, num_filers, (kernel_size, embedding_size), bias=bias)
        self.conv_layer2 = nn.Conv2d(1, num_filers, (kernel_size, embedding_size), bias=bias)
        self.batch_norm = nn.BatchNorm2d(num_filers)
        self.sigmoid = nn.Sigmoid()

        nn.init.kaiming_uniform_(self.conv_layer1.weight)
        nn.init.kaiming_uniform_(self.conv_layer2.weight)

    def gate(self, inputs):
        """门控机制"""
        return self.sigmoid(inputs)

    def forward(self, inputs):
        embed = self.embedding(inputs)
        embed = embed.unsqueeze(1)
        output = self.conv_layer1(embed)
        gate_output = self.conv_layer2(embed)
        # Gate Operation
        if self.activation is not None:
            # GTU
            output = self.activation(output) * self.gate(gate_output)
        else:
            # GLU
            output = output * self.gate(gate_output)
        if self.batch_norm:
            output = self.batch_norm(output)
            output = output.squeeze()
            return output
        else:
            return output.squeeze()

if __name__=="__main__":
    x = torch.randint(1,100,[32, 128])
    glu = GateLinearUnit(embedding_size=300, num_filers=256, kernel_size=3, vocab_size=1000)
    out = glu(x)

三、RNN与GLU的对比

GLU是能够并行处理时序数据的CNN网络架构,即利用CNN及门控机制实现了RNN的功能。优点在进行时序数据处理时严格按时序位置保留信息从而提升了性能,并且通过并行处理结构加快了的运算速度。

GLU与RNN的结构不同才实现了功能不同,主要有两个区别,一个相同点:

  • 在是否使用时间窗口上不同。RNN与LSTM并不存在时间窗口概念,直接对时序数据进行迭代式处理,至序列结束;而GLU使用了时间窗口,与Transformer类似,只能处理定长的时序数据。

  • 在是否使用了卷积运算上不同。RNN不存在卷积运算,对于时序数据的处理机制是不断将当前时刻的信息加工处理,逐个添加至隐藏层中信息;而GLU使用了卷积运算,主要目标是将时间窗口内当前时刻之前的所有信息进行压缩,由于信息时序位置与实际内容均未发生变化,因而使可以用CNN直接并行处理各时刻的信息数据。

  • 在是否使用了门结构上相同。GLU与LSTM均使用了输出门的结构,但略去了LSTM中的遗忘门与写入门,通过输出门实现了基于时序信息位置对内容输出的控制,达到了理想地输出效果。

参考资料

  • FLASH:高效Transformer解析(1)—GLU(Gated Linear Unit,门控线性单元)

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

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

相关文章

UKP3d,修改管道长度或标高的方法

南京用户问,请问这个起末点标高可以修改么?如图: 上述起末点的标高是不可以修改,用户没有详细阐述自已想要的结果。可能是以下几种场景,希望能帮助到用户: 1.修改管道长度: 1.1.(管道在模型的…

各种类型的背景音频音效,不同风格的背景音乐素材

一、素材描述 本套背景音乐素材,大小1.76G,58个压缩文件。 二、素材目录 8支简短精致的企业标志片头音乐.zip Avril 伴奏收藏 Wish you were here.zip 《带我回家》带给人温暖感动的男声歌曲 .zip 《光荣时刻》震撼激烈的英雄史诗电影音乐素材.zip…

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…

分享一个适用于 Vue3.x 非常好用的组件库【Naive UI】

一、Naive UI 介绍 Naive UI 是一种简单易用、不太复杂的用户界面(UI)框架,主要用于Web应用程序的开发。它提供了超过80个组件,覆盖了表格、表单、弹窗、图表等多个方面,这些组件不仅功能强大,而且高度可定…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录: /tomcat/bin/catalina.sh 添加设置参数: JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

C++可变参数模板类通过递归和特化方式展开

可变参数模版类有2种方式展开参数包:通过继承和通过递归特化。在此只举例一个后着的例子以阐述展开的方式和过程。这些内容其实书上都有,我只是在看《深入C11 代码优化与工程应用》一书中遇到了些困惑,可能书中的写法与我的理解不对版&#x…

【C++历练之路】哈希思想的应用——位图、布隆过滤器

W...Y的主页 😊 代码仓库分享💕 前言:我们使用hash思想学习了哈希表,进行了模拟实现unordered_set与unordered_map。这些都是用hash思想实现出来的数据结构,今天我们来学习一下hash的应用——位图、布隆过滤器。 目…

课题组里有一个卷王是什么体验?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

Ansys ACT的一个例子

由XML和IronPython文件组成&#xff0c;文件结构如下&#xff1a; ExtSample.xml <extension version"1" name"ExtSample1"><guid shortid"ExtSample1">2cc739d5-9011-400f-ab31-a59e36e5c595</guid><script src"sam…

【全开源】废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

介绍 一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序 功能特性 1、会员注册 支持小程序授权注册和手机号注册 2、回收品类 可设置回收品类&#xff0c;废纸、废金属、废玻璃、旧衣服等 3、今日指导价…

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到第五个模块&#xff0c;文件批量复制模块&#xff08;快捷键&#xff1a;Ctrl5&#xff09; 点击右边的“搜索添加”按钮&#…

[muduo网络库]——muduo库三大核心组件之Channel类(剖析muduo网络库核心部分、设计思想)

接着上文[muduo网络库]——muduo库的Reactor模型&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;接下来详细介绍一下这三大核心组件中的Channel类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 Channel Channel类封装了一个 fd 、fd感兴…

onnx模型截取部分

这个是有需求的&#xff0c;比如有多个输入节点&#xff0c;我只用其中几个&#xff0c;或有多个输出节点&#xff0c;我只用其中几个。 比如这个输入&#xff0c;我们可以直接把transpose去掉&#xff0c;用类pytorch的N,C,H,W的格式输入。 还有如下输出&#xff1a; tran…

灵活QinQ

拓扑图 配置 sysname AR1 # interface GigabitEthernet0/0/0.10dot1q termination vid 10ip address 12.1.1.1 255.255.255.0 arp broadcast enable # interface GigabitEthernet0/0/0.20dot1q termination vid 20ip address 21.1.1.1 255.255.255.0 arp broadcast enable # …

LeetCode 题目 120:三角形最小路径和

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…

《QT实用小工具·六十三》QT实现微动背景,界面看似静态实则动态

1、概述 源码放在文章末尾 该项目实现了微动背景&#xff0c;界面看似静态实则动态&#xff0c;风动&#xff0c;幡动&#xff0c;仁者心动&#xff0c;所以到底是什么在动&#xff1f;哈哈~ 界面会偷偷一点一点改动文字颜色的颜色填充。 虽然是动态&#xff0c;但是慢到难以…

羊大师解析,如何遵守《节约用水条例》

羊大师解析&#xff0c;如何遵守《节约用水条例》 《节约用水条例》的实施旨在倡导和推动全社会形成节约用水的良好风尚&#xff0c;以应对日益严峻的水资源短缺问题。羊大师发现随着这一条例的深入实施&#xff0c;越来越多的人开始意识到节约用水的重要性&#xff0c;并积极…

HTML5实现简洁好看的个人主页,个人小站(多种风格附源码)

文章目录 1.烟灰主题个人主页1.1 个人主页界面1.2 个人信息界面1.3 兴趣爱好界面1.4 个人作品界面 2.紫霞主题个人主页2.1 个人主页界面2.2 个人信息界面2.3 兴趣爱好界面2.4 个人作品界面 3.墨夜主题个人主页3.1 个人主页界面3.2 个人信息界面3.3 兴趣爱好界面3.4 个人作品界面…

《小猫咪大城市》 48小时销量破40万套,一匹休闲游戏黑马诞生

易采游戏网5月13日消息&#xff0c;近日一款名为《小猫咪大城市》的游戏在Steam、Switch和Xbox平台上正式发售&#xff0c;凭借其独特的游戏设定和可爱的猫咪角色&#xff0c;迅速赢得了玩家们的喜爱。据官方宣布&#xff0c;游戏在发售后的短短48小时内&#xff0c;销量已经突…