CLIP:连接视觉与语言的桥梁
<h2 id="什么是-clip">什么是 CLIP?</h2><p>CLIP(Contrastive Language-Image Pre-training,对比语言-图像预训练)是 OpenAI 提出的一种<strong>多模态</strong>预训练模型。它采用对比学习和双塔架构,实现了视觉与语言的统一表征。</p>
<blockquote>
<p>CLIP并不像是一种模型,更像是一种方法,一种通用的将计算机视觉模型与自然语言处理领域模型结合的方法</p>
</blockquote>
<h2 id="为什么需要-clip">为什么需要 CLIP?</h2>
<p>传统的图像识别模型存在一个根本性局限:需要预先定义固定的分类类别。模型只能识别训练时见过的类别,面对新类别时束手无策。这种"封闭世界"的假设严重限制了模型的泛化能力。</p>
<p>CLIP 打破了这一限制。它不再依赖预定义的类别标签,而是直接利用自然语言作为监督信号。这种设计让模型具备了开放域的识别能力——只要用文字描述,就能识别任意概念。</p>
<h2 id="clip-的核心架构">CLIP 的核心架构</h2>
<p>CLIP 采用双塔式架构,由两个独立的编码器组成:</p>
<ul>
<li><strong>文本编码器</strong>:将文本描述转换为语义向量(原论文使用 Transformer)</li>
<li><strong>图像编码器</strong>:将图像转换为视觉特征向量(原论文使用 ResNet 或 ViT)</li>
</ul>
<p>这两个编码器的核心目标是将文本和图像映射到同一个共享的特征空间中,使得语义相关的图文对在该空间中彼此接近。</p>
<h3 id="模型架构图">模型架构图</h3>
<p><img src="https://img2024.cnblogs.com/blog/3152699/202603/3152699-20260315153519515-892603904.png" alt="CLIP 模型架构" loading="lazy"></p>
<h3 id="训练流程伪代码">训练流程伪代码</h3>
<p><img src="https://img2024.cnblogs.com/blog/3152699/202603/3152699-20260315153523663-1222439763.png" alt="CLIP 伪代码实现" loading="lazy"></p>
<p>通过上述架构图和伪代码,我们可以清晰地理解 CLIP 的训练机制。</p>
<h2 id="clip-的训练过程详解">CLIP 的训练过程详解</h2>
<h3 id="1-特征提取">1. 特征提取</h3>
<p>训练时,CLIP 接收成对的图像和文本作为输入:</p>
<ul>
<li><strong>图像 I</strong>:维度为 <code>(batch_size, height, width, channel)</code></li>
<li><strong>文本 T</strong>:维度为 <code>(batch_size, seq_len)</code></li>
</ul>
<p>将它们分别送入对应的编码器后,得到:</p>
<ul>
<li><strong>图像特征</strong>:<code>(batch_size, d_image)</code></li>
<li><strong>文本特征</strong>:<code>(batch_size, d_text)</code></li>
</ul>
<h3 id="2-特征对齐">2. 特征对齐</h3>
<p>由于图像特征和文本特征的维度不同,无法直接计算相似度。CLIP 通过线性投影层将两者映射到相同的嵌入空间:</p>
<ul>
<li><strong>图像嵌入 I_e</strong>:<code>(batch_size, d_e)</code></li>
<li><strong>文本嵌入 T_e</strong>:<code>(batch_size, d_e)</code></li>
</ul>
<blockquote>
<p><strong>设计选择</strong>:为什么使用线性投影而不是非线性投影?</p>
<p>原论文指出,在传统的单模态图像识别任务中,非线性投影通常表现更好。但在多模态场景下,实验发现线性投影与 非线性投影的效果相当,而线性投影更简单高效,因此选择了线性投影。</p>
</blockquote>
<h3 id="3-相似度计算">3. 相似度计算</h3>
<p>将 I_e 和 T_e 进行矩阵乘法,得到一个 <code>(batch_size × batch_size)</code> 的相似度矩阵。为了控制相似度的分布,引入可学习的温度参数 τ:</p>
<pre><code>logits = I_e @ T_e.T * τ
</code></pre>
<blockquote>
<p><strong>温度参数的作用</strong>:</p>
<p>温度参数 τ 控制着相似度分布的"锐利程度"。理论上可以通过超参数搜索找到最优值,但由于 CLIP 的训练规模极大,手动调参成本过高。因此论文将 τ 设置为可学习参数,让模型在训练过程中自动优化。</p>
</blockquote>
<h3 id="4-对比学习损失">4. 对比学习损失</h3>
<p>相似度矩阵中,对角线元素代表匹配的图文对(正样本),非对角线元素代表不匹配的图文对(负样本)。CLIP 使用对称的交叉熵损失进行优化。</p>
<h4 id="图像到文本的损失">图像到文本的损失</h4>
<p>将相似度矩阵的每一行视为一个分类问题:对于第 i 张图像,从 batch_size 个文本中找出正确的描述。标签是一个 one-hot 向量,只有位置 i 为 1。</p>
<pre><code>loss_i = cross_entropy_loss(logits, labels, axis=0)
</code></pre>
<h4 id="文本到图像的损失">文本到图像的损失</h4>
<p>将相似度矩阵的每一列视为一个分类问题:对于第 j 段文本,从 batch_size 张图像中找出正确的图像。</p>
<pre><code>loss_t = cross_entropy_loss(logits, labels, axis=1)
</code></pre>
<h4 id="总损失">总损失</h4>
<p>最终损失是两个方向损失的平均值:</p>
<pre><code>loss = (loss_i + loss_t) / 2
</code></pre>
<p>这种对称的损失设计确保了图像和文本编码器能够相互促进,共同学习统一的多模态表征空间。</p>
<h4 id="常见疑问需要手动-softmax-吗">常见疑问:需要手动 Softmax 吗?</h4>
<p><strong>问题</strong>:计算得到相似度矩阵后如何求损失值?该矩阵到底要不要先 Softmax,再求交叉熵损失?</p>
<p><strong>答案</strong>:不需要在计算损失函数之前手动进行 Softmax。</p>
<p>这是因为在深度学习框架(如 PyTorch、TensorFlow)中,交叉熵损失函数(<code>CrossEntropyLoss</code>)的内部实现已经包含了 Softmax 操作。</p>
<h3 id="5-模型优化">5. 模型优化</h3>
<p>CLIP 使用 Adam 优化器进行反向传播,更新两个编码器和投影层的参数。</p>
<h2 id="总结">总结</h2>
<p>CLIP 通过对比学习将视觉和语言统一到同一表征空间,实现了零样本图像分类、图文检索等多种下游任务。其核心创新在于:</p>
<ol>
<li><strong>开放域识别</strong>:摆脱固定类别限制,支持任意文本描述</li>
<li><strong>大规模预训练</strong>:利用海量图文对数据进行自监督学习</li>
<li><strong>对称损失设计</strong>:双向对比学习确保图文特征的对齐</li>
</ol>
<p>这种设计范式为多模态学习开辟了新的方向,也为后续的 DALL-E、Stable Diffusion 等生成模型奠定了基础。</p><br><br>
来源:https://www.cnblogs.com/penggeon/p/19721017
頁:
[1]