gMLP:Pay Attention to MLPs--模型代码讲解

gMLP模型代码讲解

  • Introduction
  • gMLP网络结构
    • Spatial Gating Unit (SGU)
  • code
    • gMLPBlock
    • Spatial Gating Unit

基于MLP-Mixer 的改进…

Introduction

总的来说,gMLP 在视觉和NLP领域的惊人有效性表明,自我注意并不是扩大机器学习模型的必要因素,尽管它根据任务的不同可以是一个有用的补充随着数据和计算量的增加。具有gMLP等更简单的空间交互机制的模型可以像变压器一样强大,分配给自我注意的能力可以被删除或大幅减少。

gMLP网络结构

gMLP 的输入仍为若干图像块(即将一张图像切割成若干图像块),输出为若干个向量(token)堆叠组成的矩阵,例如token的维度为L,个数为N,则输出为N ∗ L 的矩阵,通过池化等操作转换为最终的特征向量。
由若干个基本构成单元堆叠而成
在这里插入图片描述

设输入矩阵(即图中的Input Embeddedings)为 n ∗ d n∗d nd 的矩阵X , n为序列长度, d为特征维度,则gMLP的unit结构可以简化为 Z = δ ( X U ) Z ~ = s ( Z ) Y = δ ( Z ~ V ) + X Z=\delta (XU)\\ \tilde{Z} = s(Z)\\ Y=\delta(\tilde{Z}V)+X Z=δ(XU)Z~=s(Z)Y=δ(Z~V)+X
U , V U,V U,V为可学习的矩阵, δ \delta δ 为激活函数, s ( z ) s(z) s(z) 为图中的Spatial Gating Unit.

Spatial Gating Unit (SGU)

为了能有跨token的交互, s ( ⋅ ) s(\cdot) s() 操作须在空间维度。可以简单的使用线性映射表示: f W , b ( Z ) = W Z + b s ( Z ) = Z ⊙ f W , b ( Z ) f_{W,b}(Z)=WZ+b\\ s(Z)=Z⊙f_{W,b}(Z) fW,b(Z)=WZ+bs(Z)=ZfW,b(Z) Z Z Z n ∗ d n∗d nd 的矩阵,则 W W W n ∗ n n∗n nn 的矩阵,表示空间交互的映射参数,b 为n 维向量(WZ+b表示WZ的第一行元素与b的第一维元素相加),为了保证训练的稳定性,W 初始化值接近于0(貌似用[-1,1]的均匀分布初始化),b 的初始值为1,此时 f W , b ( Z ) ≈ 1 , s ( Z ) ≈ Z f_{W,b}(Z)\approx1,s(Z)\approx Z fW,b(Z)1,s(Z)Z,这种初始化确保了每个gMLP块在训练的早期阶段像一个常规的FFN,其中每个token 都被独立处理,并且只在学习过程中逐步跨token注入空间信息。

更进一步的作者发现将Z 沿着channel维度切割成 Z 1 , Z 2 Z_1,Z_2 Z1,Z2 ( Z 1 , Z 2 Z_1,Z_2 Z1,Z2的维度分别为 n ∗ d 1 , n ∗ d 2 , d 1 + d 2 = n n*d_1,n*d_2,d_1+d_2=n nd1,nd2,d1+d2=n)两个部分更为有效,此时s(Z)操作变为
s ( Z ) = Z 1 ⊙ f W , b ( Z 2 ) s(Z)=Z_1\odot f_{W,b}(Z_2) s(Z)=Z1fW,b(Z2)

code

先看整体结构,在整个gMLP结构中,gmlp代替self-attention设计了框架结构。每一个层级使用gMLPBlock作为一个block阶段。整个残差形式为gmlp(norm(x))+x.

class gMLP(nn.Module):def __init__(self,*,...):super().__init__()dim_ff = dim * ff_multself.seq_len = seq_lenself.prob_survival = prob_survivalself.to_embed = nn.Embedding(num_tokens, dim) if exists(num_tokens) else nn.Identity()self.layers = nn.ModuleList([Residual(PreNorm(dim, gMLPBlock(dim = dim, dim_ff = dim_ff, seq_len = seq_len, attn_dim = attn_dim, causal = causal, act = act))) for i in range(depth)])#  gmlp(norm(x))+xself.to_logits = nn.Sequential(nn.LayerNorm(dim),nn.Linear(dim, num_tokens)) if exists(num_tokens) else nn.Identity()def forward(self, x):x = self.to_embed(x)layers = self.layers if not self.training else dropout_layers(self.layers, self.prob_survival)out = nn.Sequential(*layers)(x)return self.to_logits(out)
class PreNorm(nn.Module):def __init__(self, dim, fn):super().__init__()self.fn = fnself.norm = nn.LayerNorm(dim)def forward(self, x, **kwargs):x = self.norm(x)return self.fn(x, **kwargs)

gMLPBlock

class gMLPBlock(nn.Module):def __init__(self,*,dim,dim_ff,seq_len,attn_dim = None,causal = False,act = nn.Identity()):super().__init__()self.proj_in = nn.Sequential(nn.Linear(dim, dim_ff),nn.GELU())# dim_ff = dim * ff_mult(4)# dim -> dim*4self.attn = Attention(dim, dim_ff // 2, attn_dim, causal) if exists(attn_dim) else Noneself.sgu = SpatialGatingUnit(dim_ff, seq_len, causal, act)self.proj_out = nn.Linear(dim_ff // 2, dim)def forward(self, x):gate_res = self.attn(x) if exists(self.attn) else None# 默认的attn是None,即不进行该操作x = self.proj_in(x)x = self.sgu(x, gate_res = gate_res)x = self.proj_out(x)return x

Spatial Gating Unit

class SpatialGatingUnit(nn.Module):def __init__(self, dim, dim_seq, causal = False, act = nn.Identity(), init_eps = 1e-3):super().__init__()dim_out = dim // 2self.causal = causalself.norm = nn.LayerNorm(dim_out)self.proj = nn.Conv1d(dim_seq, dim_seq, 1)self.act = actinit_eps /= dim_seqnn.init.uniform_(self.proj.weight, -init_eps, init_eps)nn.init.constant_(self.proj.bias, 1.)def forward(self, x, gate_res = None):device, n = x.device, x.shape[1]res, gate = x.chunk(2, dim = -1)# self-atten 用的dim# sgu用的dim_ff = dim * ff_mult(4),即4倍# chunk之后,每个为2倍,用两倍的值进行attentiongate = self.norm(gate)weight, bias = self.proj.weight, self.proj.biasif self.causal:...gate = F.conv1d(gate, weight, bias)# 1d卷积混合w*h维度的信息,patch通道的混合if exists(gate_res):gate = gate + gate_resreturn self.act(gate) * res

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

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

相关文章

新品:新一代全双工音频对讲模块SA618F22-C1

SA618F22-C1是我司一款升级版的无线数字和音频二合一全双工传输模块,支持8路并发高音质通话。用户不仅可以通过串口实现数据的无线传输,还可以通过I2S数字音频或模拟音频接口来传输语音信号。该模块内置高速微控制器、回声消除电路、ESD静电防护、高性能…

电脑退域或切换系统账号后系统黑屏

之前加入域时迁移了账号系统,导致退域后本地账号系统没了东西黑屏但能看到鼠标。也登不了域账号了一顿慌张(操作如下) 解决:又加回了域哈哈哈 重启电脑按F8进不去安全模式,找不到触发时间... winr打开运行,…

vue3+ts不能将类型“Timeout”分配给类型“null”不能将类型“Timeout”分配给类型number

在设置有setTimeout() 函数时,一般是需要进行清除计时器操作的; 常用的做法是定义一个全局变量timer,在onMounted或者有需要的地方进行赋值,在onBeforeUnmount进行clear,一般在定义timer变量时,使用 numbe…

we3.0里的钱包是什么?

we3.0里的钱包是什么? 在Web3.0的语境中,以太坊钱包是一种专为与以太坊区块链网络及其去中心化应用(DApps)交互而设计的数字钱包。这种钱包不仅支持用户存储、发送和接收以太币(ETH),还允许用户…

深度学习:迁移学习

目录 一、迁移学习 1.什么是迁移学习 2.迁移学习的步骤 1、选择预训练的模型和适当的层 2、冻结预训练模型的参数 3、在新数据集上训练新增加的层 4、微调预训练模型的层 5、评估和测试 二、迁移学习实例 1.导入模型 2.冻结模型参数 3.修改参数 4.创建类&#xff…

C++多态原理

C多态原理 多态的原理动态绑定与静态绑定静态多态动态多态 虚函数存在哪的&#xff1f;虚表存在哪的&#xff1f; 多态的原理 // 这里常考一道笔试题&#xff1a;sizeof(Base)是多少&#xff1f; class Base { public:virtual void Func1(){cout << "Func1()"…

【单调栈】单调栈基础及经典案例

【单调栈】单调栈基础及经典案例 单调栈理论基础每日温度下一个更大元素Ⅰ下一个更大元素Ⅱ经典例题—接雨水思路一 暴力求解思路二 双指针优化思路三 单调栈解法 经典例题—柱状图中最大的矩形思路一 暴力求解思路二 单调栈 单调栈理论基础 单调栈的应用场景&#xff1a;要寻…

109.游戏安全项目:信息显示二-利用游戏通知辅助计算基址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信…

Visual Studio使用与“Hello Word“的编写

1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建项" 5.点击"…

Java每日面试题(JVM)(day15)

目录 Java对象内存布局markWord 数据结构JDK1.8 JVM 内存结构JDK1.8堆内存结构GC垃圾回收如何发现垃圾如何回收垃圾 JVM调优参数 Java对象内存布局 markWord 数据结构 JDK1.8 JVM 内存结构 程序计数器: 线程私有&#xff0c;记录代码执行的位置. Java虚拟机栈: 线程私有&#…

【移植】标准系统方案之扬帆移植案例

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 本文章是基于瑞芯微RK3399芯片的yangfan开发板&#xff0c;进行标准…

【论文速看】DL最新进展20240927-目标检测、Transformer

目录 【目标检测】【Transformer】 【目标检测】 [2024小目标检测] A DeNoising FPN With Transformer R-CNN for Tiny Object Detection 论文链接&#xff1a;https://arxiv.org/abs/2406.05755 代码链接&#xff1a;https://github.com/hoiliu-0801/DNTR 尽管计算机视觉领域…

笔记整理—linux进程部分(1)进程终止函数注册、进程环境、进程虚拟地址

对于mian()函数而言&#xff0c;执行前也需要先执行一段引导代码才会去执行main()函数&#xff0c;该部分的代码包含构建c语言的运行环境等配置&#xff0c;如清理bss段等。 在使用gcc去编译程序的时候&#xff0c;使用gcc -v xxx.c可见链接过程。在编译完成后可见xxx.out文件。…

数据结构——计数、桶、基数排序

目录 引言 计数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 桶排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 基数排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 排序算法的稳定性 1.稳定性的概念 2.各个排序算法的稳定性 结束语 引…

NVLM多模态 LLM 在图像和语言任务中的表现优于 GPT-4o

论文地址&#xff1a;https://arxiv.org/pdf/2409.11402 背景 传统的多模态 LLM 有两种主要方法&#xff1a;纯解码器架构&#xff08;如 LLaVA&#xff09;和基于交叉注意力的架构&#xff08;如 Flamingo&#xff09;。混合架构&#xff0c;既提高了训练效率&#xff0c;又增…

[CKA]CKA的购买和注册考试券

CKA的购买和注册考试券 一、购买CKA 1、注册 LF开源软件学园 账号 LF开源软件学园&#xff1a;https://training.linuxfoundation.cn/register 2、个人中心进行实名认证 3、按需求进行购买 4、在考试中心–我的订单 中查看购买的订单 我是在"黑色星期五"打折买的…

LLM大模型书籍:专补大模型短板的RAG入门与实战书来了!

文末赠书 RAG自2020年由Facebook AI Research推出后&#xff0c;一下子就窜红了。 毕竟&#xff0c;它是真的帮了大忙&#xff0c;在解决大语言模型的“幻觉”问题上起到了关键作用。 如今&#xff0c;Google、AWS、IBM、微软、NVIDIA等科技巨头都在支持RAG应用的开发。微软…

中国新媒体联盟与中运律师事务所 建立战略合作伙伴关系

2024年9月27日&#xff0c;中国新媒体联盟与中运律师事务所举行战略合作协议签字仪式。中国新媒体联盟主任兼中国社会新闻网主编、中法新闻法制网运营中心主任左新发&#xff0c;中运律师事务所高级顾问刘学伟代表双方单位签字。 中国新媒体联盟是由央视微电影中文频道联合多家…

你的下一台手机会是眼镜吗?RTE 大会与你一同寻找下一代计算平台丨「空间计算和新硬件」论坛报名

周四 Meta 刚公布新一代 AR 眼镜 Orion 后&#xff0c;Perplexity 的 CEO 发了一条状态&#xff1a;「如果你还在做软件&#xff0c;请转型硬件。」 一家估值 30 亿美元的 AI 软件公司 CEO 说出这样的言论&#xff0c;既有有见到「最强 AR 眼镜」Orion 后的激动情绪&#xff0c…

如何组织一场考试并筛选未参加答题的考生?

&#x1f64b;频繁有小伙伴咨询&#xff1a;我组织了一场答题活动&#xff0c;导出考试成绩时只有参加了答题的人&#xff0c;但我想要找到哪些人没答题 此前我们会建议小伙伴逐人排查&#xff0c;但这建议被反复吐槽&#x1f926; 确实&#xff0c;如果只有十几个人逐人排查还…