1 GLU

GLU的起源是2016年由Yann N. Dauphin在
论文:Language Modeling with Gated Convolutional Networks

在语言模型的建模方法上相比于循环神经网络更具有竞争力,提出了一种简单的线性门控单元来堆叠卷积层从而使得文本中的token可以并行化处理来获得上下文的语义特征。
而且与循环神经网络相比,其复杂度从O(N)降低到O(N/k),其中的k为卷积核的宽度,N为文本的上下文集合。这里的循环神经网络不单指RNN,还有其变种LSTM、GRU等等。论文中整个模型的结构如下图所示:输入层(Input Sentence+Lookup Table)、中间层(Convolution+Gate)以及输出层(Softmax)

输入层(Input Sentence+Lookup Table)
W=[w1,w2,……,wn],wn代表输入token,通过lookuptable得到embedding
E=[ew1,ew2,……,ewn]

中间层(Convolution+Gate)
首先输入到两个卷积层Conv1和Conv2 ,得到两个输出Ccon1和Ccon2,然后将Ccon2利用sigmoid函数进行激活得到h(Ccon2),然后通过Hadamard积逐位相乘得到相应的隐层向量h,更一般的可表示为:

X表示输入的向量,N表示输入文本中token的集合长度,m表示向量的维度,k表示卷积核的宽度,n表示输出的特征图大小(输出维度),V,W是可训练的参数矩阵,b,c表示对应的偏置项。
可以看出,门控线性单元与LSTM的门控本质上是一样的,只不过在计算隐层向量时不需要依赖上一个时间步。通过堆叠多层卷积就可以得到文本的上下文信息

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

对于采用sigmoid可能导致的梯度弥散问题,作者还在网络加入了残差。并且由于sigmoid在中间部分(近0端)表现近似于线性,所以整个模型的复杂度基本近似于线性。

输出层(Softmax),

由于在语言模型建模过程中的词表V是相当大的,也就是在进行一次预测时会撸一遍词表,其复杂度就为O(V),会严重影响模型的效率。所以作者采用了AdaptiveSoftmax作为归一化函数,将词表中的词分为高频词和低频词两组,将不同词频区间的词分为不同的clusters,按照词频高的cluster优先访问的原则,对cluster中的每个词进行softmax来预测,所以也要求词表需要按照频率从大到小进行排列。以此来加快模型训练时的效率。

门控线性单元(Gated Linear Unit, GLU),它是门控增强的改进版 MLP 变体
GLU 已被证实在很多情况下都有效,并在 SOTA Transformer 中使用;
GLU Variants Improve Transformer

标准FFN

GLU

一般情况下的GLU是U不加激活函数而V加Sigmoid

GAU

论文《Transformer Quality in Linear Time》

其核心思路是将注意力和 GLU 作为一个统一层,并尽可能多地共享它们的计算,具体如下图所示。这样做不仅实现了更高的参数和计算效率,而且自然地赋能一个强大的注意力门控机制。

结合GLU。将Attention和GLU结合

在式(3)中,如果A等于单位阵I,那么它就是GLU式的FFN;而如果A是全1矩阵,那么它就是普通的注意力机制。所以说,(3)是Attention和FFN的一个简单而自然的融合,我们期望它能同时替换掉Attention和FFN,甚至有更好的表现。

Z是共享表示 (s<<d), 论文中s =128
当GAU只有一个头时,Wz的参数量就很少了,主要参数量在Wu,Wv,Wo上,所以GAU的参数量大约为3de;
而在标准的Transformer中,Attention的参数量为4d2,FFN的参数量为8d2(标准FFN中一般是e=4d),所以总参数量为12d2
因此,从参数量看,当e=2d时,两层GAU大致上就等于原来的Attention+FFN。
“n层Attention+n层FFN”的标准Transformer模型,对应的就是“2n层GAU”的新模型,我们记为FLASH-Quad,其中Quad是“Quadratic”的简写,表明复杂度依然是二次的。

降低复杂度的方法
(1)将注意力计算稀疏化、即人为根据先验知识规定哪些token可以进行注意力计算(典型代表: Longformer、BigBird等)
(2)将注意力计算线性化。提出另外的方法,去逼近标准注意力的效果(典型代表: Linformer、Performer等),如下公式所示:


假设Q , K , V 的维度都为:( m , d )
右边是正常计算:m∗d∗m + m∗d∗m = 2dm2,跟序列长度m成平方正比.
左边:先计算KTV, d∗m∗d+d∗m∗d,即:2md2.

第二种方法随着序列的边长,效率会远高于第一种方法

分块注意力的计算
假设序列长度为n,每个块的维度为c,则可分成n/c个块(默认可整除)。

块内注意力
每个块的token内部自行交互,本质上也算是“稀疏化”的一种,其复杂度大致是

FFN -> GLU -> GAU相关推荐

  1. 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  2. 用 powershell 脚本 .ps1 写一个自动化的「编译->链接->运行C++文件」脚本

    │ abc.cpp │ main.cpp │ test.ps1 │ └─.vscodec_cpp_properties.jsonsettings.json 我这人有个毛病:一定要用 VS Code 写 ...

  3. Observability:Data pipeline:Beats => Redis => Logstash => Elasticsearch

    在 Elastic Stack 的架构中,我们通常使用如下的一个图来表示: 如上图所示,我们通常会使用 Kafka 或者 Redis 作为一种 Message Queue(消息队列)来作为一种数据的缓 ...

  4. 运算符“||”与“|”,“”和“”的区别 (附带各类位运算符号详解(、|、^、~、<<、>>、>>>)

    区别一: 定义不同: || 和 | 都是表示"或",区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断. 区别二: 与操作和或操作的区别 (1)在Jav ...

  5. Linux中>>和>,>和<的区别? 以及“|”是什么意思?

    Linux中>>和>, >和<的区别?    以及"|"是什么意思? 一.Linux 中>>和>的区别 ? 1.>>和& ...

  6. 【数据结构与算法】->算法-> A* 搜索算法->如何实现游戏中的寻路功能?

    A* 搜索算法 Ⅰ 前言 Ⅱ 算法解析 Ⅲ 如何实现游戏寻路问题 Ⅳ 总结 Ⅰ 前言 你可能玩过魔兽世界,仙剑奇侠和英雄联盟这类 MMRPG 游戏,在这些游戏中,有一个非常重要的功能,就是人物角色自动 ...

  7. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

  8. 关于学习Python的一点学习总结(16->popitem()->sedefault()->update()->values())

    37popitem():随机的弹出字典中的一个字典项 >>> array={'first':'one','second':'two','third':'three'}>> ...

  9. R语言赋值操作符:<−、<<-、=、->、->>、:、%in%、%*%

    R语言赋值操作符:<−.<<-.=.->.->>.:.%in%.%*% 赋值操作符 赋值操作符用于把值传递给向量: 算子 描述 例子 <− or = or & ...

最新文章

  1. 通过JDBC进行简单的增删改查(二)
  2. cpu风扇一会转一会停_宝宝不能吹电风扇?空调PK电风扇,到底该Pick谁啊啊啊!...
  3. Gitee 如何自动部署博客 Pages?推荐用这个GitHub Actions!
  4. [css] 举例说明css的基本语句构成是什么呢?
  5. 二次元带音乐404源码
  6. codevs——2152 滑雪
  7. javascript之数组(二)
  8. linux lsm模块,Linux安全模块LSM研究及改进
  9. MS CRM 4中,添加营销列表成员查找列
  10. HRBEU 字符串 1003
  11. Docker下载安装
  12. Java知识点_类锁和对象锁的区别?
  13. http 415 错误
  14. 产业分析:东方甄选vs罗永浩直播间
  15. 《微信公众平台开发最佳实践》—— 1.2 微信公众账号的注册
  16. Unrecognized Windows Sockets error: 10106的解决办法
  17. 1334: PIPI计数
  18. python27.dll引起的appcrash_Python已经停止工作(APPCRASH)Python
  19. js 将小数转为科学记数法
  20. RN:metro缓存以及如何清除缓存

热门文章

  1. ASM(六) 利用TreeApi 动态生成以及转换方法字节码
  2. 隐式图的搜索问题(九宫重排)——实验准备
  3. 【c++】VSCode配置 c++ 环境(小白教程)
  4. Eclipse 报错 Cannot nest 'FisRptWeb/src/conf' inside library 'FisRptWeb/src'
  5. AttributeError: module ‘*****‘ has no attribute ‘###‘解决办法看过来~
  6. 《用Python写网络爬虫第2版》PDF中英文+代码分析
  7. 2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具
  8. 计算机窗口弹不出来桌面怎么弄,怎么在电脑中设置不再弹出程序的广告窗口
  9. 谈一谈Java中的深拷贝和浅拷贝
  10. win7 64位 java_1.win7 64位 java安装