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 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 深度学习:论文阅读:(ICLR-2021)Vision Transformer -> 正文阅读

[人工智能]深度学习:论文阅读:(ICLR-2021)Vision Transformer

论文详情

名称:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
研究团队:Google Research, Brain Team
原文:原文
参考笔记:笔记1
自注意力及多头注意力讲解笔记
李沐vitb站视频笔记
transformer的self att和multi-head att:视频讲解霹雳吧啦Wz
vit理解笔记1
vit理解笔记2

预备知识- Self-Attention和Multi-Head Attention

B站讲解视频笔记
李沐

Self-Attention

1 注意力函数: 一个将一个 query 和一些 key - value 对 映射成一个输出的函数,其中所有的 query、key、value 和 output 都是一些向量。

2 输出:output 是 value 的一个加权和 --> 输出的维度 == value 的维度。

3 权重:output 中 value 的权重 = 查询 query 和对应的 key 的相似度 or compatibility function

4 注意力的具体计算是:对每一个 query 和 key 做内积,然后把它作为相似度

attention = softmax( 两个向量的内积值 / sqrt(dk)) * V ,dk 是向量的长度

使用 softmax :一个 query 给 n 个 key - value pair ,这个 query 会跟每个 key - value pair 做内积,会产生 n 个相似度值。传入 softmax 得到 n 个非负、求和为 1 的权重值。把 softmax 得到的权重值 与 value 矩阵 V 相乘 得到 attention 输出。

因为 softmax 最后的结果是希望 softmax 的预测值,置信的地方尽量靠近,不置信的地方尽量靠近零,以保证收敛差不多了。这时候梯度就会变得比较小,那就会跑不动。

5 输入:encoder 的注意力层,有三个输入,它分别表示的是key、value 和 query。
一根线过来,它复制成了三下:同样一个东西,既 key 也作为 value 也作为 query,所以叫做自注意力机制。key、value 和 query 其实就是一个东西,就是自己本身。

6 总结:输入了 n 个 query,每个 query 会得到一个输出,那么会有 n 个输出。
输出 是 value 加权和(权重是 query 和 key 的相似度),输出的维度 == d – > 输入维度 == 输出维度
在这里插入图片描述

在这里插入图片描述

Multi-head attention

与其做一个单个的注意力函数,不如说把整个 query、key、value 整个投影 project 到 1个低维,投影 h 次。然后再做 h 次的注意力函数,把每一个函数的输出 拼接在一起,然后 again projected,会得到最终的输出。

  • 为什么要做多头注意力机制呢?
    一个 dot product 的注意力里面,没有什么可以学的参数。具体函数就是内积,为了识别不一样的模式,希望有不一样的计算相似度的办法。

multi-head attention 给 h 次机会去学习 不一样的投影的方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的一些相似函数,然后把 h 个 heads 拼接起来,最后再做一次投影。

  • 过程
    输入是:原始的 value、key、query
    进入一个线形层,线形层把 value、key、query 投影到比较低的维度。然后再做一个 scaled dot product (图 2 左图)。
    执行 h 次会得到 h 个输出,再把 h 个 输出向量全部合并 concat 在一起,最后做一次线性的投影 Linear,会回到我们的 multi-head attention。
    在这里插入图片描述
    输出是 不同的头的输出的 concat 起来,再投影到一个 WO 里面。
    每一个头 hi 是把 Q,K,V 通过 可以学习的 Wq, Wk, Wv 投影到 dv 上,再通过注意力函数,得到 headi
    在这里插入图片描述

在这里插入图片描述

VIT主要思想

将原始图片进行均匀的分成若干个patch,,每个小块可以看做成NLP当中的词,把patch展平成序列,再把分割后的patch输入到原始Transformer模型的编码器部分中,最后通过正常的全连接层对图片进行分类

主要部分

主要包括以下几个部分:数据处理部分,Patch编码,位置编码,分类等模块。
Multi-Head Attention,是由多个Self-Attention组成的,
Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。
在这里插入图片描述
LayerNorm:对每个样本做 Normalization(把每一行变成 均值为 0、方差为 1),不是对每个特征做 normalization。

过程

1 将输入的图像进行patch的划分
2 Linear Projection of Flatted Patches,将patch拉平并进行线性映射
3 生成CLS token特殊字符*,生成Position Embedding,Patch+Position Embedding相加作为inputs token
4 Transformer Encoder编码,特征提取
5 MLP Head进行分类输出结果
在这里插入图片描述

step1. 图像划分Patch

我们假设原始的输入数据是 HxWxC的大小,对原始的数据,先分块,再展平。假设每个Patch的长宽为P,那么分块的数目为:N=HxW/(PxP)
对每个Patch都展平成一维的向量,每个向量可以表示成:PxPxC
乘以C是因为有C个通道,那总的输入的经过展平后的维数为:NxPxPxC
在这里插入图片描述

step2.Linear Projection of Flatted Patches

接着对每个向量都做一个线性变换(即全连接层),压缩维度为D,这里我们称其为 Patch Embedding。
在这里插入图片描述

step3. Patch+Position Embedding

  • 位置信息编码是为了给patch加上相对位置,不然在后面的特征提取中丢掉了位置信息可就不好了
  • 位置信息编码有可学习参数类型,有通过公式计算的方法,可以是一维、二维;但不使用性能会差点

假设我们按照论文切成了9块,但是在输入的时候变成了10个向量。这是人为增加的一个向量。因为传统的Transformer采取的是类似seq2seq编解码的结构。而ViT只用到了Encoder编码器结构,缺少了解码的过程,假设你9个向量经过编码器之后,你该选择哪一个向量进入到最后的分类头呢?
因此这里作者给了额外的一个**用于分类的向量,与输入进行拼接。**同样这是一个可学习的变量。

step4. Transformer Encoder

在这里插入图片描述
Encoder输入的维度为[197, 768],输出的维度为[197, 768],可以把中间过程简单的理解成为特征提取的过程

step5. MLP Head

分类头的意思就是:特征提取工作已经全部完成,现在你要做分类就加上对应的操作。(同CNN特征提取层后的Linear层+Softmax进行分类预测)
在这里插入图片描述
整个Encoder的输出为[197, 768]我们仅仅保留最前面的CLS token作为全连接的输入[1, 768],然后接上全连接层及分类数n_class,使用交叉熵损失函数计算损失,反向传播更新网络的权重和参数。

分类头很简单,加入了LayerNorm和两层全连接层实现的,采用的是GELU激活函数。

总结流程

一个图片224x224,分成了49个32x32的patch;
对这么多的patch做embedding,成49个128向量;
再拼接一个cls_tokens,变成50个128向量;
再加上pos_embedding,还是50个128向量;
这些向量输入到transformer中进行自注意力的特征提取;
输出的是50个128向量,然后对这个50个求均值,变成一个128向量;
然后线性层把128维变成2维从而完成二分类任务的transformer模型

缺点

  1. **计算量大:**计算复杂度与token的平方相关,如果输入特征图为56*56的特征图,那么会涉及3000+长宽的矩阵运算,计算量很大,同时在原始Transformer计算过程中token数以及hidden size保持不变,所以后来的研究者采用了几个方法是解决计算量大的问题。参考resnet结构使用金字塔的结构,越高层的token数量越少;使用局部窗口自注意,分别考虑特征图的一部分做自注意,再想办法把这些局部信息进行交互;使用卷积来代替全连接层,以减少参数;在生成Q,K,V过程中,对K,V的特征图或者是token做池化,减少计算复杂度。
  2. 训练数据需求量高:自注意力机制的inductive-bias较CNN和RNN弱,CNN具有空间不变形的假设,所以它可以用卷积核去滑窗处理整个特征映射;而RNN具有时间不变性,但是自注意力机制并没有这些假设,所以需要更多的数据去学习这些假设。
  3. 堆叠层数数量受限:存在过度平滑问题,不同的Block之间的相似性随着模型的加深而增加;不同token之间的相似性随着随着模型的加深而增加。
  4. 模型本身无法编码位置:需要各种各样的位置编码,目前了解到的包括:固定的与可学习的,绝对的和相对的,还有利用卷积的特性使用卷积去作为位置编码的。
  5. **参数数量大:**以上4点导致的问题 或者 也可以与第2点合并
    根据以上这5条缺点,后人有针对性地做出了一些改进。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:23:58  更:2022-03-30 18:25:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:23:12-

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