3. 经典对齐方法:全局对齐与局部对齐
跨模态对齐的核心,说白了就是让不同模态的数据在某个空间里「对上话」。我这些年做过的项目里,对齐策略基本就两大流派:全局对齐和局部对齐。全局对齐的代表是典型相关分析(CCA),局部对齐的代表就是注意力机制。今天咱们就把这两个东西掰开揉碎了讲清楚。
3.1 全局对齐:典型相关分析(CCA)
CCA 是个老牌方法,上世纪 30 年代就有人提出来了。它的思路很直接——找到两组变量之间的线性组合,让它们的相关性最大化。
举个例子。假设你有图像特征 X 和文本特征 Y,CCA 会分别学两个投影矩阵 W_x 和 W_y,把 X 和 Y 投影到同一个公共空间里。在这个空间里,对应的图像-文本对的相关性最高。
max_{W_x, W_y} corr(W_x^T X, W_y^T Y)
说白了就是让投影后的特征向量之间的皮尔逊相关系数最大。
我在一个图文检索项目里用过 CCA。当时数据量不大,大概 5 万对,CCA 跑得飞快,效果也还行。但后来数据量涨到百万级,CCA 就有点吃力了——它本质上是线性方法,处理不了复杂的非线性关系。
3.1.1 CCA 的数学本质
CCA 的求解其实是个广义特征值问题。我建议你记住这个关键点:
- 计算
X和Y的协方差矩阵Σ_xx、Σ_yy、Σ_xy - 构造矩阵
K = Σ_xx^{-1/2} Σ_xy Σ_yy^{-1/2} - 对
K做奇异值分解,得到左右奇异向量 - 左右奇异向量就是投影矩阵
W_x和W_y
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
这个公式我建议你背下来。它做了三件事:
- 计算相似度:
QK^T算出每个查询和每个键的匹配分数 - 归一化: softmax 把分数变成概率分布
- 加权求和: 用概率对 V 做加权平均
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)
每个头可以关注不同的语义关系。比如一个头关注颜色对齐,另一个头关注位置对齐,第三个头关注动作对齐。
3.3 全局对齐 vs 局部对齐
这两种方法各有千秋。我整理了一个对比表:
| 维度 | 全局对齐(CCA) | 局部对齐(注意力) |
|---|---|---|
| 对齐粒度 | 整体到整体 | 局部到局部 |
| 计算复杂度 | O(n^3),n 为特征维度 | O(L_q * L_k),L 为序列长度 |
| 可解释性 | 低,投影矩阵难解释 | 高,注意力权重直观 |
| 非线性能力 | 弱(线性版本) | 强(通过非线性变换) |
| 小样本表现 | 好,参数少 | 差,需要大量数据 |
| 工程落地难度 | 低,scikit-learn 直接调用 | 中,需要自己实现或调库 |
你想想看,如果数据量小、任务简单,CCA 是个稳妥的选择。如果数据量大、需要细粒度匹配,注意力机制是更好的选择。
3.4 知识体系总览
下面这张图展示了全局对齐和局部对齐的核心逻辑:
3.5 实践建议
说了这么多理论,最后给点实在的建议:
- 数据量 < 10 万对: 用线性 CCA 或核 CCA,简单高效
- 数据量 10 万 - 100 万对: 用深度 CCA 或单头注意力
- 数据量 > 100 万对: 上多头注意力,配合预训练模型
- 需要可解释性: 注意力机制是首选,权重可视化很直观
- 需要快速迭代: CCA 系列,scikit-learn 一行代码搞定
嗯,全局对齐和局部对齐就讲到这里。这两种方法不是互斥的,很多工业级系统会把它们结合起来用——先用 CCA 做粗对齐,再用注意力做细对齐。具体怎么结合,后面的章节会展开讲。