4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer

本文主要是介绍4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现有Transformer模型的速度通常受到内存低效操作的限制,尤其是MHSA(多头自注意力)中的张量整形和逐元素函数。

设计了一种具有三明治布局的新构建块,即在高效FFN(前馈)层之间使用单个内存绑定的MHSA,从而提高内存效率,同时增强通道通信。

注意力图在头部之间具有高度相似性,导致计算冗余。

为了解决这个问题,提出了一个级联的组注意力模块,为注意力头提供完整特征的不同分割。


Transformer模型的速度通常受内存限制。内存访问延迟阻碍了GPU/CPU中计算能力的充分利用,从而对Transformer的运行速度产生严重的负面影响。

内存效率最低的操作是多头自注意力(MHSA)中频繁的张量整形和逐元素函数。通过适当调整MHSA和FFN(前馈网络)层之间的比例,可以在不影响性能的情况下显著减少内存访问时间。

通过向每个头提供不同的特征来显式分解每个头的计算来缓解冗余问题。 

为了提高参数效率,我们使用结构化剪枝来识别最重要的网络组件,并总结模型加速参数重新分配的经验指导。

结构化剪枝是在神经网络已经训练好的情况下,按照一定的剪枝策略来修剪掉一部分神经元或连接,从而减少模型的大小,保持模型的精度,形成一个新的更加简单的模型。

结构化剪枝能够直接减少卷积核的参数量和运算量,减少网络运行时的内存占用,不需要特征运算库即可实现运算加速。

 EfficientViT

  1. MBConv模块使用深度可分离卷积,即每个输入通道只与一个卷积核进行卷积,然后再将结果相加,从而减少了参数数量。
  2. Lighted Multi-scale Self-attention (轻量级多尺度自注意力)

DWConv指的是深度卷积,GConv指的是组卷积。

深度卷积是组卷积的极端情况,即分组数g等于输入通道数cin,也等于输出通道数cout

组卷积常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature
map,而大量的feature map意味着能够编码更多的信息。

组卷积指的是什么:

组卷积是将输入特征图分成多个组,然后在每个组内进行卷积操作,最后将每个组的输出特征图拼接起来作为最终的输出特征图
假设输入特征图的通道数为C,组数为G,每组的通道数为C/G,那么组卷积的操作可以表示为

  1. 将输入特征图分成G组,每组包含C/G个通道。
  2. 对每个组进行卷积操作,得到每组的输出特征图。
  3. 将G个组的输出特征图拼接起来,得到最终的输出特征图。

设计一个具有三明治布局的新块来构建模型:

三明治布局块在FFN层之间应用单个内存绑定的MHSA层;

并应用更多的FFN层来允许不同通道之间的通信,从而提高内存效率

内存绑定的MHSA(多头自注意力)层通过优化数据结构和计算流程,减少了内存使用,提高了计算效率。这种优化可能包括更有效的张量整形操作、减少不必要的数据复制、以及使用更紧凑的数据表示等

级联群体注意力(CGA)

与先前对所有头使用相同特征的自注意力相比,CGA为每个头提供不同的输入分割,并将输出特征级联到各个头。

该模块不仅减少了多头注意力中的计算冗余,而且还通过增加网络深度来提高模型容量。我们通过扩大关键网络组件(例如值投影)的通道宽度来重新分配参数,同时缩小重要性较低的组件(例如FFN中的隐藏维度)

使用Vision Transformers加快速度

内存效率

内存访问开销是影响模型速度的关键因素。Transformer中的许多运算符,例如频繁的整形、逐元素加法和归一化,都是内存效率低下的,需要跨不同内存单元进行耗时的访问。

我们通过减少内存效率低下的层来节省内存访问成本。内存效率低下的操作主要位于MHSA(多头注意力)而不是FFN层。然而,大多数现有的ViT使用相同数量的两层,无法达到最佳效率。

事实证明,适当降低MHSA层利用率可以在提高模型性能的同时提高内存效率。

这篇关于4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936699

相关文章

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J