【MLP-Mixer】核心方法解读

 abstract:

我们提出MLP-Mixer架构(或简称“Mixer”),这是一个具有竞争力但在概念和技术上都很简单的替代方案,它不使用卷积或自关注。相反,Mixer的架构完全基于多层感知器(mlp),这些感知器可以在空间位置或特征通道上重复应用。Mixer仅依赖于基本的矩阵乘法例程、对数据布局的更改(重塑和换位)以及标量非线性。

intro:

图1描述了Mixer的宏观结构。它接受一系列线性投影图像补丁(也称为令牌),形状为“patches x channels”表,作为输入,并保持该维度。Mixer使用两种类型的MLP层:通道混合MLP和令牌混合MLP。信道混合mlp允许在不同信道之间进行通信;它们独立地操作每个令牌,并将表中的各个行作为输入。令牌混合mlp允许在不同的空间位置(令牌)之间进行通信;它们独立地在每个通道上操作,并将表中的各个列作为输入。这两种类型的层相互交织,以支持两个输入维度的交互。

在极端情况下,我们的架构可以看作是一个非常特殊的CNN,它使用1×1卷积进行通道混合,使用单通道深度卷积的完整接受场和参数共享进行令牌混合。然而,相反的情况并不成立,因为典型的cnn并不是Mixer的特例。此外,卷积比mlp中的普通矩阵乘法更复杂,因为它需要对矩阵乘法进行额外的昂贵简化和/或专门的实现。

mixer architecture:

现代深度视觉架构由混合特征的层组成(i)在给定的空间位置,(ii)在不同的空间位置之间,或同时混合特征。

在cnn中,(ii)是用N × N个卷积(对于N > 1)和池化实现的。更深层的神经元有更大的接受野[1,29]。同时,1×1卷积也执行(i),更大的核同时执行(i)和(ii)。

在Vision transformer和其他基于注意力的架构中,自注意力层允许(i)和(ii),而mlp块执行(i)。Mixer架构背后的思想是清楚地分离每个位置(通道混合)操作(i)和跨位置(令牌混合)操作(ii)。

这两个操作都是通过mlp实现的。图1总结了该体系结构。

代码:

class MlpBlock(nn.Module):
  mlp_dim: int

  @nn.compact
  def __call__(self, x):
    y = nn.Dense(self.mlp_dim)(x)
    y = nn.gelu(y)
    return nn.Dense(x.shape[-1])(y)


class MixerBlock(nn.Module):
  """Mixer block layer."""
  tokens_mlp_dim: int
  channels_mlp_dim: int

  @nn.compact
  def __call__(self, x):
    y = nn.LayerNorm()(x)
    y = jnp.swapaxes(y, 1, 2)
    y = MlpBlock(self.tokens_mlp_dim, name='token_mixing')(y)
    y = jnp.swapaxes(y, 1, 2)
    x = x + y
    y = nn.LayerNorm()(x)
    return x + MlpBlock(self.channels_mlp_dim, name='channel_mixing')(y)


class MlpMixer(nn.Module):
  """Mixer architecture."""
  patches: Any
  num_classes: int
  num_blocks: int
  hidden_dim: int
  tokens_mlp_dim: int
  channels_mlp_dim: int
  model_name: Optional[str] = None

  @nn.compact
  def __call__(self, inputs, *, train):
    del train
    x = nn.Conv(self.hidden_dim, self.patches.size,
                strides=self.patches.size, name='stem')(inputs)
    x = einops.rearrange(x, 'n h w c -> n (h w) c')
    for _ in range(self.num_blocks):
      x = MixerBlock(self.tokens_mlp_dim, self.channels_mlp_dim)(x)
    x = nn.LayerNorm(name='pre_head_layer_norm')(x)
    x = jnp.mean(x, axis=1)
    if self.num_classes:
      x = nn.Dense(self.num_classes, kernel_init=nn.initializers.zeros,
                   name='head')(x)
    return x

mlpblock是一个简单的mlp块,包含两个全连接层和一个GELU激活函数。第一个全连接层增加维度,第二个全连接层减少维度回到原始输入的维度。

mixerblock是核心,首先对输入进行层归一化,然后应用token mixing,即对mlpblock交换维度,接着添加残差连接。之后再次对结果进行层归一化,并应用channel mixing,最后再次添加残差连接。

mlpmixer是完整的MLP-Mixer模型,首先使用一个卷积来处理输入图像,然后将图像patches展平。接着,通过多个mixerblock来处理patches。在所有MixerBlock之后,它应用层归一化并进行平均池化。如果指定了num_classes,它将添加一个全连接层作为分类头。

可以将公式总结为:

这里σ是单元非线性(GELU[16])。Ds和Dc分别是令牌混合和通道混合mlp中可调的隐藏宽度。注意,Ds的选择与输入补丁的数量无关。因此,网络的计算复杂度在输入patch的数量上是线性的,不像ViT的复杂度是二次的。由于Dc与patch大小无关,因此整体复杂度在图像的像素数上是线性的

如上所述,将相同的通道混合MLP(令牌混合MLP)应用于x的每一行(列)。将通道混合MLP的参数(在每一层内)捆绑在一起是一种自然的选择——它提供了位置不变性,这是卷积的一个突出特征。但是,跨通道绑定参数的情况要少见得多。例如,在一些cnn中使用的可分离卷积[9,40],独立于其他通道对每个通道应用卷积。然而,在可分离卷积中,不同的卷积核应用于每个通道,而不像Mixer中的令牌混合mlp,它为所有通道共享相同的核(完全接受场)。

当增加隐藏维度C或序列长度S时,参数绑定可以防止体系结构增长过快,并节省大量内存。

Mixer中的每一层(除了初始patch投影层)都有相同大小的输入。这种“各向同性”的设计最类似于变压器,或者其他领域的深度rnn,它们也使用固定的宽度。这与大多数具有金字塔结构的cnn不同:较深的层具有较低的分辨率输入,但有更多的通道。请注意,虽然这些是典型的设计,但也存在其他组合,如各向同性ResNets[38]和金字塔状vit[52]。

除了MLP层,Mixer还使用其他标准的体系结构组件:跳过连接[15]和层规范化[2]。与vit不同,Mixer不使用位置嵌入,因为令牌混合mlp对输入令牌的顺序很敏感。最后,Mixer使用具有全局平均池化层的标准分类头,然后是线性分类器。

注意,在多模态中,视频-文本,音频-文本应用了以上结构:

信息可以在不同的模态和时间序列之间流动。每个区块由两个MLP层和一个GELU激活功能(描述为𝛷). 此外,在每个块中也应用了跳连接。假设 是一个输入特征,其中 𝑡 是时间序列的长度,并且 𝑑 是模态的数量。在每一层中,MLP-communicator模块可表示如下:

其中,𝑖 从 1 到 𝑑 表示行数,𝑗 从 1 到 𝑡 表示列数。Norm() 表示 LayerNorm (层归一化),W 表示每个块中线性层的权重。输入特征 𝑋 首先通过 Time-Mixing MLP 过程,并通过跳连接生成 𝑍,这一步骤允许水平对应特征之间的通信。然后,𝑍 经过 Modality-Mixing MLP 过程生成 𝑌,特征在纵向方向上进行融合。最终得到的特征 𝑌 融合了两个方向的特征信息。该结构允许输入特征中的每个元素可以沿着两个维度与其他特征进行互动。

        解释:在Time-Mixing的过程中,假设我们有三个模态,X j,i 就是表示在第j个时间点,第i个模态的特征值。在这个公式中,我们将所有时间点下不同模态的特征进行了整合,然后Norm(X *,i)是对这个特征值进行正规化,使其分布在一个固定的区间内,通常是0到1或者-1到1。这个正规化的过程可以使得不同的特征值有可比性,且防止部分大数值特征对整个模型训练结果的过度影响。

        接着W_1和W_2就是两个权重矩阵,它们和正规化后的特征值进行乘积操作。φ是激活函数,例如本模型中的GELU激活函数,这个函数起到的作用类似一个开关,可以根据函数结果决定神经元是否被激活,即该特征是否被放入下一层中去。

        然后,我们再看第二个公式:

        这个公式和前一个公式的结构是一样的,都是先进行一次正规化,然后使用两个权重矩阵和输入的特征进行乘积操作,并通过激活函数处理。

        在这个公式中,我们将所有模态在同一个时间点的特征进行了整合,即在时间 j 的所有模态的特征都放入了这个公式中。这也就体现了这个模型中,在不同模态和时间系列进行信息流动和整合的目的。

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

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

相关文章

JQuery基本操作(二)

遍历 $(选择器).each(function(下标,值){//代码块 });$.each(数组名,function(下标,值){//代码块 }); <body><button> 获得数组下标和值</button> </body> <script>$(function(){$("button").click(function(){var arr [1,2,3,4,5,…

Ansible 工具从入门到使用

1. Ansible概述 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(2)- NPM发布、在线示例

这里分享一下本开源项目是如何构建组件库及其如何发布到NPM上的&#xff0c;还有组件库与在线示例的构建有什么差异。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 NPM 示例地址 版本更新信息 这两天抽空…

自动化测试中如何高效进行元素定位!

前言 在自动化测试中&#xff0c;元素定位是一项非常重要的工作。良好的元素定位可以帮助测试人员处理大量的测试用例&#xff0c;加快测试进度&#xff0c;降低工作负担。但是在实际的测试工作中&#xff0c;我们常常遇到各种各样的定位问题&#xff0c;比如元素定位失败、元…

鸿蒙开发之ArkUI 界面篇 三十三 Builder(封装容器)

鸿蒙开发中遇到容器相同、容器下面的子组件相同&#xff0c;就是子组件的文字不同&#xff0c;背景颜色不同&#xff0c;文字颜色不同之类&#xff0c;就可以使用Builder来封装&#xff0c;语法格式如下&#xff1a; 例如下面的界面&#xff1a; Row4个ColumImageText来实现&am…

Python WebSocket 的原理及其应用

Python WebSocket 的原理及其应用 在现代 Web 开发中&#xff0c;实时通信成为了越来越多应用的重要组成部分。尤其是像聊天应用、实时数据更新、在线游戏等场景&#xff0c;服务器与客户端之间的即时数据传输需求非常迫切。在传统的 HTTP 协议中&#xff0c;通信往往是基于请…

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具&#xff08;网络和串口调试助手&#xff09; 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中&#xff0c;并解压给权限 cd /home/${USER}/Ne…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中&#xff0c;“股票”可以说&#xff1a; • 株&#xff08;かぶ&#xff09; 这是最常用的表达方式&#xff0c;直接表示“股票”。 例如&#xff1a; 株を買う - 买股票 株を売る - 卖股票 • 株式&#xff08;かぶしき&#xff09; 这个词也是“股票”的意…

网站集群批量管理-Ansible(ad-hoc)

1. 概述 1. 自动化运维: 批量管理,批量分发,批量执行,维护 2. 无客户端,基于ssh进行管理与维护 2. 环境准备 环境主机ansible10.0.0.7(管理节点)nfs01 10.0.0.31(被管理节点)backup10.0.0.41(被管理节点) 2.1 创建密钥认证 安装sshpass yum install -y sshpass #!/bin/bash ##…

息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络

息肉检测数据集 yolov5 yolov8格式 息肉检测数据集介绍 数据集概述 名称&#xff1a;息肉检测数据集&#xff08;基于某公开的分割数据集调整&#xff09;用途&#xff1a;适用于目标检测任务&#xff0c;特别是内窥镜图像中的息肉检测格式&#xff1a;YOLO格式&#xff08;边…

YOLO11改进 | 注意力机制 | 轻量级的空间组增强模块SGE【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了一个空间组增强&#xff08;S…

论文笔记:Prototypical Verbalizer for Prompt-based Few-shot Tuning

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://arxiv.org/pdf/2203.09770.pdfhttps://arxiv.org/pdf/2203.09770.pdf 论文代码&#xff1a;https://github.com/thunlp/OpenPrompthttps://github.com/thunlp/OpenPrompt Abstract 基于提示的预训练语言模型&#…

highcharts样式记录

图表设置 const rendChart (min, max) > {Highcharts.setOptions({global: { useUTC: false },});Highcharts.chart(hourly-chart, {chart: {spacingBottom: 0,marginLeft: 53,marginTop: 10,marginBottom: 0,marginRight: 13,style: {fontSize: 0.2rem,color: #363a44,li…

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…

JAVA基础 day12

一、File、IO流 File是java.io.包下的类&#xff0c;file类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以代表文件、文件夹&#xff09;&#xff0c;使用File可以操作文件及文件夹。 注意&#xff1a;File只能对文件本身进行操作&#xff0c;不能读写文件里…

Redis到底是单线程还是多线程的?详解

1. Redis是单线程还是多线程的&#xff1f; Redis 的核心执行模型是单线程的&#xff0c;但自 Redis 6.0 版本起&#xff0c;在特定场景下支持了多线程处理。 1.1. Redis 的核心执行是单线程的 Redis 的单线程指的是 Redis 的⽹络 IO 以及键值对指令读写是由⼀个线程来执⾏的…

Unity实现自定义图集(四)

以下内容是根据Unity 2020.1.0f1版本进行编写的   在之前的篇章中已经把自定义图集在编辑器上的使用,以及运行时所需的信息都准备好了,接下来就是魔改UGUI的Image组件,使其能够像Image那样运行时如果引用的资源有打自定义图集,则加载对应自定义图集的Texture。 1、思路 …