IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Vit的学习笔记 -> 正文阅读

[人工智能]Vit的学习笔记

1 致谢

感谢paddle开源的Vit系列教程《飞桨——从零开始学视觉Transformer》

2 Vit模型介绍

2.2 Attention模块(Multi-head Attention)

Attention模块是一种seq2seq的变换模块,其输入输出的特征维数相同
参数:

  • num_heads: attention head的数量,默认为8;将向量分成8份的话,计算效率也比较高。
  • qkv_bias: 在qkv映射时使用偏置参数,默认为False但是qkv_bias默认需要开启
  • attn_drop: self.attn_drop的丢弃率,默认为0
  • proj_drop: self.proj_drop的丢弃率,默认为0

Note:

  • qkv_bias在一般情况下必须开启,这样才符合逻辑回归的数学原理,我们在timm的Vit实现中也可以看到此参数默认是开启的,这里我们引用timm中Vit模型的参数解释来说明:

    qkv_bias: bool, If True, enable qkv(nn.Linear) layer with bias, default: True

    可知qkv_bias默认需要开启。
# timm库中的Attention实现
# 在torch中声明模块需要继承nn.Module
class Attention(nn.Module):
    def __init__(self, dim, num_heads=8, qkv_bias=False, attn_drop=0., proj_drop=0.):
        super().__init__()
        self.num_heads = num_heads
        # dim需要是num_heads的整数倍,可以参考HuggingFace的实现,
        # https://huggingface.co/transformers/_modules/transformers/models/vit/modeling_vit.html#ViTForImageClassification
        # TODO: assert dim % num_heads == 0
        head_dim = dim // num_heads
        self.scale = head_dim ** -0.5

        self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
        self.attn_drop = nn.Dropout(attn_drop)
        self.proj = nn.Linear(dim, dim)
        self.proj_drop = nn.Dropout(proj_drop)

    def forward(self, x):
    	# B为batch-size,
    	# N为patch-num,
    	# C为通道数,
        B, N, C = x.shape
        qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
        # self.qkv() --> x: (B, N, 3C)
        # complex: 3C^2
        # reshape() --> x1: (B, N, 3, nhead, dhead)
        # complex: 0
        # permute() --> qkv: (3, B, nhead, N, dhead)
        # complex: 0
        q, k, v = qkv.unbind(0)   # make torchscript happy (cannot use tensor as tuple)

		# q: (B, nhead, N, dhead)
		# k: (B, nhead, N, dhead)
        attn = (q @ k.transpose(-2, -1)) * self.scale
        # q@k' --> attn: (B, nhead, N, N)
		# complex: B*nhead*N*dhead*N = BN^2*C
		# *self.scale --> attn
		# complex: B*nhead*N*N = BN^2*nhead
        attn = attn.softmax(dim=-1)
        # complex: BN^2*nhead
        attn = self.attn_drop(attn)
        # complex: 0
		
		# attn: (B, nhead, N, N)
		# v: (B, nhead, N, dhead)
        x = (attn @ v).transpose(1, 2).reshape(B, N, C)
        # attn @ v --> x
        # complex: B*nhead*N*N*dhead = BN^2C
        x = self.proj(x)
        x = self.proj_drop(x)
        return x

复杂度分析

可以看到,Attention模块的计算复杂度为
3 C 2 + B N 2 C + B N 2 ? n h e a d s + B N 2 3C^2 + BN^2C+BN^2\cdot nheads + BN^2 3C2+BN2C+BN2?nheads+BN2
我们将复杂度按照算子分开列出:

  • FC算子self.qkv: 3 C 2 3C^2 3C2
  • 乘法注意力q@k': B N 2 C BN^2C BN2C
  • Softmax算子: B N 2 ? n h e a d s BN^2\cdot nheads BN2?nheads
  • 注意力加权运算: B N 2 BN^2 BN2

2.2 Vit模型为什么要使用Multi-head-Attention?

这里我们针对仅原始Vit的Multi-head-Attention进行讨论,并没有扩展到所有SOTA的vit类型算法;
Attention模块的复杂度分析可知,仅有Softmax算子的复杂度 B N 2 ? n h e a d s BN^2\cdot nheads BN2?nheads与注意力head的数量有关;于是我们可以知道使用Multi-head-Attention会使得Self-Attention算法的复杂度增加,且其增加的复杂度主要是来源于softmax算子的运算量增加了,且其运算量增加了 n h e a d s nheads nheads倍;

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:54:11  更:2021-11-27 09:54:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 3:58:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码