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

文章目录

  • 一、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,门控线性单元)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-menu 保持展开点击不收缩 默认选择第一个菜单

<el-menu:default-openeds"[/system]" 数组 默认展开第一个:collapse"isCollapse"close"handleClose" 点击关闭的时候 让菜单打开 就可以实现保持展开效果ref"menus":unique-opened"true":active-text-color"se…

C++入门指南(中)

目录 ​编辑 一、C关键字(C98) 二、命名空间 2.1 域 2.2 命名空间域 2.1 命名空间定义 2.2 命名空间使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling)…

解决”Failed to connect to raw.githubusercontent.com“报错

目录 错误现象如下&#xff1a; ​编辑解决办法如下&#xff1a; 错误现象如下&#xff1a; 在安装和配置ROS的过程中&#xff0c;经常会遇到类似这样的报错&#xff1a; curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 16 ms: Connection refus…

社交媒体数据恢复:陌陌

确保你的手机已经进行了备份。备份可以提高数据恢复的成功率。 在电脑上下载并安装数据恢复软件。在使用软件进行恢复之前&#xff0c;请确保你的安卓手机已经在开发者选项中开启了USB调试模式。 使用USB数据线将手机连接至电脑。打开数据恢复软件&#xff0c;选择“陌陌聊天…

【unity小技巧】减少Unity中的构建打包大小

文章目录 正常默认打包查看编辑器打包日志压缩图片压缩网格模型压缩贴图压缩音频文件只打64位包最终大小完结 正常默认打包 这里以安卓为例。先什么都不干&#xff0c;直接打包安卓apk&#xff0c;查看包大小 查看编辑器打包日志 搜索build report构建报告。构建报告我们应该…

VS小知识----qDebug打印中文时乱码

问题&#xff1a;vs在打印中文时乱码 分析解决&#xff1a;编码问题&#xff0c;改为UTF-8试试

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…

数据挖掘实战-基于决策树算法构建银行贷款审批预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

STM32_HAL_TIM_1介绍

1.F1的定时器类型&#xff08;高的拥有低级的全部功能&#xff09; 高级定时器&#xff08;TIM1和TIM8&#xff09;&#xff1a; 16位自动重装载计数器。支持多种工作模式&#xff0c;包括中心对齐模式、边沿对齐模式等。可以产生7个独立的通道&#xff0c;用于PWM、输出比较、…

内网工具之Admod的使用

Admod是使用 C写的活动目录修改工具&#xff0c;它允许有权限的用户轻松地修改各种活动目录信息。它不需要安装&#xff0c;因为它是基于命令行的。它提供了许多选项&#xff0c;可以细化搜索并返回相关细节。 下载地址&#xff1a;https://github.com/mai-lang-chai/AD-Penetr…

【Linux】轻量级应用服务器如何开放端口 -- 详解

一、测试端口是否开放 1、测试程序 TCP demo 程序&#xff08;可参考&#xff1a;【Linux 网络】网络编程套接字 -- 详解-CSDN博客&#xff09; 2、测试工具 Windows - cmd 窗口 输入命令&#xff1a;telnet [云服务器的公网ip] [port] 二、腾讯云安全组开放端口 1、安全组设…

如何用opencv去掉单元格的边框线,以提高Tesseract识别率?

在OpenCV中处理从表格切割下来的图片&#xff0c;并去掉单元格的边框线&#xff0c;以提升Tesseract的识别准确率&#xff0c;确实是一个具有挑战性的任务。在这种情况下&#xff0c;我们需要采取一种策略来预处理图像&#xff0c;使得数字与背景之间的对比度增强&#xff0c;同…

易图讯科技数字武装三维电子沙盘

深圳易图讯科技(www.3dgis.top)集成了高清卫星影像、地形数据、实景三维模型、基干民兵、普通民兵、重要目标、兵要地志、企业潜力 、行业潜力 、社会组织潜力 、特种装备器材潜力、敌情数据、现场环境数据、物联感知信息&#xff0c;构建一体化的数字孪生空间&#xff0c;实现…

Kubernetes + Prometheus监控体系之 - Exporter源码初探(以RedisExporter为例)

Kubernetes集群监控之Prometheus监控方案 如果说Kubernetes是事实上的容器平台标准&#xff0c;那么Prometheus就是云原生监控领域事实上的标准了。Kubernetes Prometheus的组合自然就成了云原生基础设施的标准搭配。 下图是Kubernetes Prometheus的通用监控方案 方案简介…

Python版Spark core详解

文章目录 第一章 SparkCore1.1. Spark环境部署1.1.1. Spark介绍1.1.1.1. 什么是Spark1.1.1.2. Spark与MapReduce的对比框架对比运行流程对比 1.1.1.3. Spark的组件1.1.1.4. Spark的特点 1.1.2. Spark的安装部署1.1.2.1. Spark安装包下载1.1.2.2. Spark部署模式介绍1.1.2.3. Loc…

Excel 同一分类下进行跨行计算

例题描述 Excel 文件记录不同用户的事件发生时间&#xff0c;数据已按 USER ID 和 DATE 列排序&#xff0c;部分数据如下&#xff1a; ABC1USER IDEVENT IDDATE2142020-01-013152020-01-054162020-01-135272020-01-036282020-01-057292020-01-06 现在要计算事件真假列isTrue&…

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…

极度内卷,消费下行,AIGC如何成为普通人易变现好上手的新机会,这几种方法一定要尝试!

最近看到一个麦肯锡报告&#xff0c;说到2030年&#xff0c;AI会替代1亿多中国人的岗位。 暂且不说这个预测是否准确&#xff0c;但自从AI横空出世&#xff0c;确实给我们的生活带来了翻天覆地的变化&#xff0c;有人顺势起飞&#xff0c;有人被时代淘汰… 李开复也曾不止一次…

无人售货机零售项目ECharts展现(最全!!,文档放最后哦!)

目录 背景 数据表 框架分析 可视化展示销售情况总分析 1、绘制仪表盘展示各特征及其环比增长率&#xff08;仪表盘&#xff09; 1. 销售金额及其环比增长率 2. 订单量及其环比增长率 3. 毛利率及其环比增长率 4.售货机数量及其环比增长率 2、绘制簇状柱状-折线图展示…

视频创作提效绘唐3漫剪使用教程

只需要提取视频内容&#xff0c;自动帮您修改对应文案&#xff0c;修改率高达70%&#xff0c;语句流畅度高达80%&#xff0c;只需稍微进行修稿&#xff0c;马上完成原创作品工具入口 原文&#xff1a;这个世界的鬼&#xff0c;成年后都要来人间找工作 改文&#xff1a;这个世界…