3. 经典对齐方法:全局对齐与局部对齐

跨模态对齐的核心,说白了就是让不同模态的数据在某个空间里「对上话」。我这些年做过的项目里,对齐策略基本就两大流派:全局对齐和局部对齐。全局对齐的代表是典型相关分析(CCA),局部对齐的代表就是注意力机制。今天咱们就把这两个东西掰开揉碎了讲清楚。

3.1 全局对齐:典型相关分析(CCA)

CCA 是个老牌方法,上世纪 30 年代就有人提出来了。它的思路很直接——找到两组变量之间的线性组合,让它们的相关性最大化。

举个例子。假设你有图像特征 X 和文本特征 Y,CCA 会分别学两个投影矩阵 W_x 和 W_y,把 X 和 Y 投影到同一个公共空间里。在这个空间里,对应的图像-文本对的相关性最高。

CCA 的优化目标:
max_{W_x, W_y} corr(W_x^T X, W_y^T Y)

说白了就是让投影后的特征向量之间的皮尔逊相关系数最大。

我在一个图文检索项目里用过 CCA。当时数据量不大,大概 5 万对,CCA 跑得飞快,效果也还行。但后来数据量涨到百万级,CCA 就有点吃力了——它本质上是线性方法,处理不了复杂的非线性关系。

3.1.1 CCA 的数学本质

CCA 的求解其实是个广义特征值问题。我建议你记住这个关键点:

  1. 计算 X 和 Y 的协方差矩阵 Σ_xx、Σ_yy、Σ_xy
  2. 构造矩阵 K = Σ_xx^{-1/2} Σ_xy Σ_yy^{-1/2}
  3. 对 K 做奇异值分解,得到左右奇异向量
  4. 左右奇异向量就是投影矩阵 W_x 和 W_y
小技巧: 实际工程中,我习惯先对特征做 PCA 降维,再用 CCA。这样能避免协方差矩阵奇异的问题,而且速度能快 3-5 倍。

3.1.2 CCA 的变体

方法 核心思想 适用场景
线性 CCA 线性投影,最大化相关性 小规模数据,线性关系
核 CCA 用核函数映射到高维空间 非线性关系,中等规模
深度 CCA 用神经网络学习非线性投影 大规模数据,复杂模态
稀疏 CCA 加入 L1 正则化,得到稀疏投影 高维特征,特征选择

你想想看,线性 CCA 就像一把直尺,只能量直线。核 CCA 加了弯尺,能量曲线。深度 CCA 直接上软尺,什么形状都能量。我建议新手先从线性 CCA 入手,理解透了再上深度版本。

3.2 局部对齐:注意力机制

全局对齐有个硬伤——它把整个图像和整个文本压缩成一个全局向量,然后做匹配。但实际场景里,往往是图像的某个区域对应文本的某个词。比如「一只黑狗在草地上追球」,图像里狗、草地、球是三个不同的区域。

注意力机制就是来解决这个问题的。它让模型学会「看哪里」和「读什么」。

3.2.1 注意力机制的核心公式

注意力机制的本质是加权求和。给定查询 Q、键 K、值 V:

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

这个公式我建议你背下来。它做了三件事:

  1. 计算相似度: QK^T 算出每个查询和每个键的匹配分数
  2. 归一化: softmax 把分数变成概率分布
  3. 加权求和: 用概率对 V 做加权平均
我曾经踩过的坑: 注意力权重矩阵的维度一定要算清楚。有一次我把 Q 和 K 的维度搞反了,模型训了三天才发现结果全是 NaN。检查维度!检查维度!检查维度!

3.2.2 跨模态注意力

在跨模态场景里,注意力机制有两种典型用法:

  • 图像到文本注意力: 以图像区域为 Q,文本词为 K/V,找出每个图像区域最相关的文本词
  • 文本到图像注意力: 以文本词为 Q,图像区域为 K/V,找出每个词最相关的图像区域

我习惯把这两种注意力结合起来,做成双向注意力。效果比单向好 5-10 个点。

3.2.3 多头注意力

单头注意力只能捕捉一种对齐关系。多头注意力让模型从不同角度去对齐:

MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W_O
其中 head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)

每个头可以关注不同的语义关系。比如一个头关注颜色对齐,另一个头关注位置对齐,第三个头关注动作对齐。

工程建议: 头数一般设 8 或 16。头数太少,表达能力不够;头数太多,计算量上去了但收益递减。我一般先试 8 头,效果不够再加。

3.3 全局对齐 vs 局部对齐

这两种方法各有千秋。我整理了一个对比表:

维度 全局对齐(CCA) 局部对齐(注意力)
对齐粒度 整体到整体 局部到局部
计算复杂度 O(n^3),n 为特征维度 O(L_q * L_k),L 为序列长度
可解释性 低,投影矩阵难解释 高,注意力权重直观
非线性能力 弱(线性版本) 强(通过非线性变换)
小样本表现 好,参数少 差,需要大量数据
工程落地难度 低,scikit-learn 直接调用 中,需要自己实现或调库

你想想看,如果数据量小、任务简单,CCA 是个稳妥的选择。如果数据量大、需要细粒度匹配,注意力机制是更好的选择。

3.4 知识体系总览

下面这张图展示了全局对齐和局部对齐的核心逻辑:

跨模态特征对齐方法体系 全局对齐(CCA) 线性 CCA 核 CCA 深度 CCA 稀疏 CCA 局部对齐(注意力) 单头注意力 多头注意力 图像→文本注意力 文本→图像注意力 核心区别 全局对齐:整体→整体,线性,参数少,适合小数据 局部对齐:局部→局部,非线性,参数多,适合大数据

3.5 实践建议

说了这么多理论,最后给点实在的建议:

选型指南:
  • 数据量 < 10 万对: 用线性 CCA 或核 CCA,简单高效
  • 数据量 10 万 - 100 万对: 用深度 CCA 或单头注意力
  • 数据量 > 100 万对: 上多头注意力,配合预训练模型
  • 需要可解释性: 注意力机制是首选,权重可视化很直观
  • 需要快速迭代: CCA 系列,scikit-learn 一行代码搞定

嗯,全局对齐和局部对齐就讲到这里。这两种方法不是互斥的,很多工业级系统会把它们结合起来用——先用 CCA 做粗对齐,再用注意力做细对齐。具体怎么结合,后面的章节会展开讲。