【Vision Transformer】辅助理解笔记

Vision Transformer理解笔记及应用

        注:本文主要是对 PPT 部分内容的补充与拓展,建议结合使用(当然也完全可以单看)。

一、基础知识

1、从向量表示到词嵌入

        这部分主要是参考如下文章,大部分图片均来自此文: The Illustrated Word2vec – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)

        不知道大家有没有做过 MBTI 人格测试?这个测试会问你一系列的问题,然后在很多维度给你打分,内向/外向就是其中之一,然后用0到100的范围来表示你是多么内向/外向(其中0是最内向的,100是最外向的) 

        假设我在测试中,内向/外向得分为38/100,则可以用下图表示这个得分: 

        为了更好的表达 “程度”,我们把范围收缩到 -1 到 1 :

        考虑到人性复杂,对于一个人的描述只有一条信息显然是不够的,为此,我们添加另一测试的得分作为一个新的第二维度,而这两个维度均可以表现为图上的一个点(或称为从原点到该点的向量)

        然后可以说这个向量部分地代表了我的人格。当你想要将另外两个人与我进行比较时,这种表示法就有用了。
        假设我某天被公交给撞住院了,住院期间需要一个与我性格相似的人来代我行事。那在下图中,这两个人中哪一个更像我呢?

         而计算两个向量之间相似度得分的常用方法是余弦相似度:

        通过该公式,计算可得: 

        从而可知,person1 在性格上与我更相似。其实,从坐标系里也可以看出,person1 的向量指向与我的向量指向更相近,即他俩具有更高的余弦相似度。
        更进一步,两个维度还不足以捕获有关不同人群的足够信息。国外心理学较为主流的是五大人格特征(以及大量的子特征)。

        当使用五个维度时,我们没法在二维平面绘制向量小箭头了(毕竟三维空间下无法使五维空间可视化)。而实际生活中,我们经常要在更高维度的空间中做研究(有的人把研究一词表达成思考,实际上,大部分人没法在高维度空间思考,但科学研究人员经常干这事,故表达成研究更准确),好在余弦相似度仍然有效,它适用于任意维度:

        这些得分比上次的得分看起来更准确,毕竟它们是根据被比较事物的更高维度算出的。

        小结一下,有两点

  • 我们可以将人和事物表示为代数向量
  • 我们可以很容易地计算出相似向量之间的相互关系。

        众所周知,机器无法直接理解人类的语言,所以需要先把人类的语言“计算机化”,那如何变成计算机可以理解的语言呢?
        对于这个问题,机器翻译已经给出了答案:

        比如对于计算机,它是如何判断一个词的词性,是动词还是名词的呢?
        假定我们有一系列样本(x,y),其中的 x 是词语,y 是它们的词性,我们要构建的映射:

  • 首先,这个数学模型 f(比如神经网络、SVM)只接受数值型输入;
  • 而 NLP 里的词语是人类语言的抽象总结,是符号形式的(比如中文、英文、拉丁文等等);
  • 如此一来,咱们便需要把NLP里的词语转换成数值形式,或者嵌入到一个数学空间里;
  • 进一步,可以把文本分散嵌入到另一个离散空间,称作分布式表示,又称为词嵌入(word embedding)或词向量
  • 在各种词向量中,有一个简单的词向量是one-hot encoder。所谓one-hot编码,本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语

        当然,不是所有的编码都是01编码,且one-hot编码无法反应词与词之间的语义相似度。
        简单来说,就是用一系列二进制代码来表示词语的各种性质。

        这就是所谓的词嵌入了,而一个单词表达成Word Embedding后,便很容易找出语义相近的其它词汇

        再举一个例子,这是一个单词“king”的词嵌入(在维基百科上训练的GloVe向量):

[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]

        这是一个包含50个数字的列表。通过观察数值看不出什么,但是让我们稍微给它可视化,以便比较其它词向量。故我们把所有这些数字放在一行:

        让我们根据它们的值对单元格进行颜色编码(如果它们接近2则为红色,接近0则为白色,接近-2则为蓝色): 

        我们将忽略数字并仅查看颜色以指示单元格的值。现在让我们将“king”与其它单词进行比较: 

        你会发现“Man”这个词和“Woman”相比,比与“King”相比更相似,而这些向量图示很好的展现了这些单词的含义与关联

        这是另一个示例列表:

        通过垂直扫描列来查找具有相似颜色的列,相信你可以看到以下这几点

  • “woman”和“girl”在很多地方是相似的,“man”和“boy”也是一样
  • 当然,“boy”和“girl”也有彼此相似的地方,但这些地方却与“woman”或“man”不同,为何呢,毕竟boy/girl特指青春年少,而woman/man更多指成人
  • 此外,“king”和“queen”彼此之间相似,毕竟都是所谓的王室成员

2、从 Seq2Seq 到 Seq2Seq with Attention

        本文主要参考以下文章:一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq (easyai.tech)

(1)Encoder-Decoder

        Encoder-Decoder 是一个模型构架,是一类算法统称,并不是特指某一个具体的算法,在这个框架下可以使用不同的算法来解决不同的任务。首先,编码(encode)由一个编码器将输入序列转化成一个固定维度的稠密向量,解码(decode)阶段将这个激活状态生成目标译文。
        回顾一下,算法设计的基本思路:将现实问题转化为一类可优化或者可求解的数学问题,利用相应的算法来实现这一数学问题的求解,然后再应用到现实问题中,从而解决了现实问题。(比如,我们想解决一个词性标注的任务(现实问题),我们转化成一个BIO序列标注问题(数学模型),然后设计一系列的算法进行求解,如果解决了这个数学模型,从而也就解决了词性标注的任务)。

        Encoder :编码器,如下。

        Decoder:解码器,如下。

        合并起来,如下:

        更具体一点的表达如下所示:

        几点说明:

  • 不论输入和输出的长度是什么,中间的“向量c”长度都是固定的(这是它的缺陷所在)。
  • 根据不同的任务可以选择不同的编码器和解码器(例如,CNN、RNN、LSTM、GRU等)
  • Encoder-Decoder的一个显著特征就是:它是一个end-to-end的学习算法。
  • 只要符合这种框架结构的模型都可以统称为Encoder-Decoder模型。
(2)Seq2Seq

        Seq2Seq(是 Sequence-to-sequence 的缩写),就如字面意思,输入一个序列,输出另一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。例如下图:输入了 6 个汉字,输出了 3 个英文单词。输入和输出的长度不同。

        Seq2Seq 的由来

        在 Seq2Seq 框架提出之前,深度神经网络在图像分类等问题上取得了非常好的效果。在其擅长解决的问题中,输入和输出通常都可以表示为固定长度的向量,如果长度稍有变化,会使用补零等操作。
        然而许多重要的问题,例如机器翻译、语音识别、自动对话等,表示成序列后,其长度事先并不知道。因此如何突破先前深度神经网络的局限,使其可以适应这些场景,成为了13年以来的研究热点,Seq2Seq框架应运而生。

        「Seq2Seq」和「Encoder-Decoder」的关系

        Seq2Seq(强调目的)不特指具体方法,满足「输入序列、输出序列」的目的,都可以统称为 Seq2Seq 模型。
        而 Seq2Seq 使用的具体方法基本都属于Encoder-Decoder 模型(强调方法)的范畴。

        总结一下的话:

  • Seq2Seq 属于 Encoder-Decoder 的大范畴
  • Seq2Seq 更强调目的,Encoder-Decoder 更强调方法
(3)信息丢失的问题—— Attention 机制的引入

        上文提到:Encoder(编码器)和 Decoder(解码器)之间只有一个「向量 c」来传递信息,且 c 的长度固定。
        为了便于理解,我们类比为「压缩-解压」的过程:
        将一张 800X800 像素的图片压缩成 100KB,看上去还比较清晰。再将一张 3000X3000 像素的图片也压缩到 100KB,看上去就模糊了。

        Encoder-Decoder 就是类似的问题:当输入信息太长时,会丢失掉一些信息。

        Attention 机制就是为了解决「信息过长,信息丢失」的问题。
        Attention 模型的特点是 Eecoder 不再将整个输入序列编码为固定长度的「中间向量 C」 ,而是编码成一个向量的序列。引入了 Attention 的 Encoder-Decoder 模型如下图:

  • 从输出的角度讲
    每个输出的词Y会受到每个输入X1、X2、X3、X4的整体影响,不是只受某一个词的影响,毕竟整个输入语句是整体而连贯的,但同时每个输入词对每个输出的影响又是不一样的,即每个输出Y受输入X1、X2、X3、X4的影响权重不一样,而这个权重便是由Attention计算,也就是所谓的注意力分配系数,计算每一项输入对输出权重的影响大小
  • 从编码的角度讲
    在根据给到的信息进行编码时(或称特征提取),不同信息的重要程度是不一样的(可用权重表示),即有些信息是无关紧要的,比如一些语气助词之类的,所以这个时候在编码时,就可以有的放矢,根据不同的重要程度针对性汲取相关信息
(4)通过翻译 “Tom chase Jerry” 理解注意力 Attention 机制

        该部分主要参考以下文献:深度学习中的注意力机制(2017版)_深度学习中的注意力机制 四万字-CSDN博客

        再举一个机器翻译的例子(本猫追老鼠例子的配图和核心阐述均来源于参考文献4),即用Google翻译这句话:Tom chase Jerry

        1. 在翻译“杰瑞”的时候,带有注意力机制的模型会体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似这样一个概率分布值:(Tom,0.3)(Chase,0.2) (Jerry,0.5),每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小(类似公司在线开董事会,虽然每个人都有发言权,但对不同议题进行决策时,很明显对具体议题更擅长的人拥有更大的发言权,而这个发言权就像权重一样,不同的人对最终决策结果的产生有着不同大小的影响)

        2.目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词

<think>好的,用户想了解关于Vision Transformer(ViT)的学习资料和笔记。首先,我需要整理ViT的基础知识,确保覆盖其核心结构和关键概念。根据提供的引用,ViT将Transformer架构应用于计算机视觉,特别是图像分类任务。需要提到编码器、解码器部分,不过根据引用[1],ViT主要基于Transformer的编码器结构,这可能与原始Transformer不同。 接下来,用户可能需要学习资料,包括论文、GitHub代码库和教程。引用[2]提到了Google Research的GitHub仓库,应该推荐这个。另外,用户可能对ViT的工作原理感兴趣,比如如何处理图像数据。传统CNN会先提取特征图,ViT则通过分块(patches)将图像转换为序列,如引用[3]所述。需要解释分词器的作用,将图像分块并线性嵌入成标记序列,然后输入Transformer编码器。 还要注意比较ViT与CNN的差异,强调自注意力机制的优势。可能的问题包括ViT的计算效率、训练数据需求,以及应用场景。用户可能想知道如何实现ViT,所以需要提供代码示例或库的链接。此外,引用中的资料可以作为主要参考文献,确保引用标识正确。 最后,生成相关问题时,要考虑用户可能的后续疑问,比如ViT的优化方法、与CNN的结合,或者在不同任务中的应用。需要确保回答结构清晰,分点说明,并推荐可靠资源,帮助用户深入学习。</think>### Vision Transformer (ViT) 学习笔记 #### 1. **核心思想** Vision Transformer (ViT) 将Transformer架构应用于图像分类任务,通过将图像分割为固定大小的块(patches),并将这些块线性嵌入为序列输入Transformer编码器[^1][^3]。与传统CNN不同,ViT直接利用自注意力机制捕捉全局依赖关系。 #### 2. **关键步骤** - **图像分块**:将输入图像 $x \in \mathbb{R}^{H \times W \times C}$ 划分为 $N$ 个块,每个块大小为 $P \times P$,得到 $N = \frac{HW}{P^2}$ 个块。 - **线性嵌入**:将每个块展平为向量 $x_p \in \mathbb{R}^{P^2C}$,并通过可学习的线性层映射为 $D$ 维向量。 - **位置编码**:添加可学习的位置嵌入(position embedding)以保留空间信息: $$ z_0 = [x_{\text{class}}; x_p^1E; x_p^2E; \dots; x_p^NE] + E_{\text{pos}} $$ 其中 $E \in \mathbb{R}^{(P^2C) \times D}$ 为嵌入矩阵,$E_{\text{pos}}$ 为位置编码。 - **Transformer编码器**:由多头自注意力(MSA)和前馈网络(FFN)交替组成,公式为: $$ z'_l = \text{MSA}(\text{LayerNorm}(z_{l-1})) + z_{l-1} $$ $$ z_l = \text{FFN}(\text{LayerNorm}(z'_l)) + z'_l $$ 最终输出用于分类[^1][^2]。 #### 3. **与CNN的对比** - **优势**:ViT通过自注意力捕获长距离依赖,无需局部卷积归纳偏置,适合大规模数据场景。 - **局限**:小规模数据训练效果可能不如CNN,需大量预训练数据(如JFT-300M)。 #### 4. **学习资料推荐** - **论文**:[*An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale*](https://arxiv.org/abs/2010.11929) - **代码实现**:Google Research官方GitHub仓库 [vision_transformer](https://github.com/google-research/vision_transformer) - **教程**: - [PyTorch实现ViT](https://pytorch.org/vision/stable/models/vision_transformer.html) - 李宏毅《深度学习》课程中Transformer与ViT章节 #### 5. **代码示例(简化版)** ```python import torch from torchvision.models import vision_transformer # 加载预训练ViT模型 model = vision_transformer.vit_b_16(pretrained=True) # 输入图像分块处理 x = torch.randn(1, 3, 224, 224) # 输入尺寸需为224x224 output = model(x) # 输出分类结果 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值