Week 3 学习记录(5.4 - 5.11)

来源:duangxin/LLM-learing week3/week3_log.md

文献阅读

4. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

ViT | Dosovitskiy et al., 2020 | 【精读】

阅读重点

  • 视觉 Transformer 的代表作,核心思想是将图像切分为固定大小的 patch,并视作序列输入 Transformer
  • 重点理解:patch embedding、位置编码、大规模预训练对视觉模型性能的影响
  • 这是所有后续 MLLM 视觉编码器的起点

笔记

  1. ViT(Vision Transformer)主要采用的是有监督学习。因为 ViT 缺少先天的归纳偏置(一个是局部性,一个是平移等变性),也就是视觉感知逻辑。它必须通过大量的标签(Label)来学习,只有通过“这张图标签是狗”、“那张图标签是猫”这种强监督信号,ViT 才能在 Self-Attention 层中慢慢学出:原来这些散落在各处的 Patch 组合在一起才是一个物体。
  2. 这篇论文算是将cv与nlp领域模型架构统一的里程碑之作。ViT 证明了:只要数据量够大,CV 根本不需要专门设计的卷积核,用 NLP 那套通用的注意力机制就够了。他也导致了后面多模态的爆发
  3. 由于transformer的自注意力机制时间复杂度是o(n^2),直接作用在图片上序列长度过长。因此vit考虑使用patch,将图片切成16*16的小方块。它通过损失一部分极其细微的像素级空间关系,让 Transformer 处理图像在算力上变得可行了。
  4. 为了尽可能的与原始架构一致,vit 没有采用平均池化而是使用 [CLS] Token。由于模型会得到很多个关于局部特征的输出,ViT 通过在输入序列的开头添加一个特殊的 [CLS] Token 来聚合全局信息。它不代表任何一个具体的 patch,仅作为一个输出来代表整张图片来做分类。
  5. vit序列的长度是由图片的尺寸和patch的尺寸决定的。比如输入图片是224224,patch是1616,那么每个patch包含256个像素,整个图片就被切成了(224/16)(224/16)=1414=196个patch,再加上一个[CLS] token,总长度就是197。
  6. vit 使用的是一维位置编码,因为作者们没有观察到使用二维位置编码会带来明显的性能提升。虽然图像是二维的,但在 ViT 中,所有的 patch 都被展平为一维序列输入到 Transformer 中,因此使用一维位置编码就足够了。
  7. vit 在微调的时候,输入的图片分辨率更高,这会导致 patch 的数量增加,进而导致位置编码的长度不匹配。为了解决这个问题,ViT 采用了插值(Interpolation)的方法(torch 自带的函数 torch.nn.functional.interpolate)来调整位置编码,使其适应新的输入尺寸。这种方法虽然简单,但在实践中效果不错。
  8. 位置嵌入可视化:1d的位置编码也学习到了二维空间的结构信息,说明模型在训练过程中学会了捕捉图像的空间关系。

5. Learning Transferable Visual Models From Natural Language Supervision

CLIP | Radford et al., 2021 | 【精读】

阅读重点

  • 通过大规模图文对比学习将图像和文本映射到统一表示空间
  • 阅读重点在于双塔结构、对比学习目标以及 zero-shot 泛化能力
  • 补充建议:读完 CLIP 后可以略读 SigLIP(Zhai et al., 2023),现在主流 MLLM(Qwen2-VL、LLaVA-OneVision、Janus)都已经把视觉编码器从 CLIP 换成了 SigLIP

笔记

  1. clip输入是图像和文本对,输出是它们在共享空间中的相似度。通过使用对比学习的方式,clip 的训练目标是最大化正确图文对的相似度,同时最小化错误图文对的相似度。具体来说,clip 会将一批图像和对应的文本输入到两个独立的编码器中,得到图像和文本的向量表示。然后通过计算这些向量之间的余弦相似度来评估它们的匹配程度。对于一个批次中的 n 对图文对,正确的图文对有 n 个,而错误的图文对有 n^2-n 个。clip 通过一个 softmax 函数来计算每个图像和文本对的概率分布,并使用交叉熵损失来优化模型,使得正确的图文对的概率最大化。
  2. clip 预训练的数据集是从互联网收集的4亿对图文对,规模非常大。然后论文说他的迁移能力极强,在许多不同的 benchmark 上都取得了不错的 zero-shot 结果,甚至在一些任务上超过了专门微调的模型。有没有一种可能是,clip 的预训练数据里就包含了这些 benchmark 的测试集或者相似的图文对?如果是这样的话,clip 的 zero-shot 能力可能就没有那么神奇了。
  3. clip 之前的模型仅仅能将图片映射到训练集中划分好的类别上,而 cllip 学习的是视觉概念和语言概念之间的关系。因此见到一个训练集里没有的“新词“时,clip 能够推理猜出来。比如 clip 见过“黄色的香蕉”,见过“红色的苹果”,但没见过“红色的香蕉”,它也能拆解“红色“和“香蕉“来理解“红色的香蕉”这个新概念。
  4. clip使用了prompt engineering,通过在训练中为文本输入添加一些固定的前缀(如“a photo of a”)来引导模型学习更通用的视觉概念,而不是过于依赖特定的类别标签。这种方法可以帮助模型更好地泛化到未见过的类别上,从而提升 zero-shot 能力。
  5. clip的局限性上:还无法理解一些深层次的概念,比如无法理解图片中的人是否“安全“或者“危险“。另外clip数据集已经很大了,想要再通过扩大数据集来提升性能可能也不太现实了。后续的 SigLIP 就是通过改进模型架构和训练方法来提升性能的。
  6. siglip 主要的改进是提出新的损失函数-sigmoid 损失,来替代 clip 中的 softmax 损失。在 clip 中 n*n 矩阵本质上是多分类问题,而在 siglip 中矩阵的每个单元格都是一个二分类问题,对每个点都进行 sigmoid 激活。这简化了分布式训练中的损失计算,提高了效率。

知识学习

平移不变性与 Transformer 的空间感知

  • 平移不变性:无论目标物体出现在图像中的什么位置,系统都能将其识别为同一个物体。严格意义上 CNN 具有的是平移等变性(Translation Equivariance),而“不变性”往往是经过多层处理和池化后达到的最终效果
  • 等变性: 输入平移了,输出的特征图(Feature Map)也跟着相应平移。不变性: 输入平移了,最终的分类结果(如“猫”)保持完全不动。
  • 而 Transformer 采用的是自注意力机制。全连接性质:Self-Attention 是全局的,每一个 Token 都会与序列中所有其他 Token 进行点积运算。空间无关性:如果你把输入序列中的两个 Token 交换位置,由于注意力机制本质上是在做“集合”操作(Set-based),如果不加干预,输出的结果除了对应的顺序改变外,数值逻辑完全一致。这种特性被称为“置换不变性”,它比平移不变性更强,但也因此完全失去了对物体空间位置的感知。

卷积操作(Convolution)

  • 主要目的是从输入图像中提取特征(如边缘、纹理、形状等)。使用一个小矩阵(卷积核/过滤器,Kernel/Filter)在图像上滑动,在每个位置与覆盖的像素区域做点乘求和,生成新的特征值。
  • 1×1 卷积:用于增加或减少通道数,实现维度缩放;在不改变特征图尺寸的前提下,增加一层激活函数,提升网络表达能力。
  • 3×3 卷积:捕捉局部空间特征的最小有效尺寸,能区分上下左右中心。
  • 卷积:有权重,要训练,做特征提取

池化操作(Pooling)

  • 通常紧跟在卷积层之后,用于压缩数据和简化信息。同样用一个窗口在图像上滑动,但不做加权计算,只做”筛选”。
  • 最大池化(Max Pooling):取窗口内像素的最大值,保留最显著的特征(如最亮的点),最为常用。
  • 平均池化(Average Pooling):取窗口内像素的平均值,使特征变得平滑。
  • 池化:无权重,不训练,只做压缩和筛选

卷积:有权重,要训练,做特征提取。 池化:无权重,不训练,只做压缩和筛选特征。

整体流程

  • 原始图片–>卷积提取特征–>一个卷积核融合所有输入通道,输出一张特征图(一个通道)–>池化操作保留关键特征–>下一层卷积

对比学习

  • 目标是让模型学会区分相似和不相似的样本。通过构造正样本对(相似)和负样本对(不相似),训练模型最大化正样本对的相似度,最小化负样本对的相似度。

余弦相似度

  • 衡量两个向量之间的相似度,计算公式为:$$\text{Cosine Similarity} = \frac{A \cdot B}{|A| |B|}$$
  • 就是两个向量的点积除以它们的模长乘积,结果在 -1 到 1 之间,越接近 1 表示越相似。