1272 字
6 分钟
EmbeddingGemma

最近 EmbeddingGemma 2 发布了,但还没有技术报告,于是先读了上一代 EmbeddingGemma 的论文:EmbeddingGemma: Powerful and Lightweight Text Representations。两者的一大区别是:EmbeddingGemma 2 是原生多模态模型,而 EmbeddingGemma 只处理文本。

EmbeddingGemma: Powerful and Lightweight Text Representations
arXiv:2509.20354 [cs.CL]
Henrique Schechter Vera et al.
2025-09-24

decoder-only 还是 encoder?#

之前不了解 EmbeddingGemma,读了才发现它居然是 encoder-only 模型。

直觉上,双向注意力的 encoder 更适合做 embedding。但如今 LLM 大多是 decoder-only,基于 LLM 的 embedding 模型也多直接沿用这一结构,取末尾 EOS 或最后一个 token 的表示作为向量:这个位置在序列末尾,即使是因果注意力也能看到全部前文,汇总整段信息。因果注意力还有算力上的好处:注意力矩阵是下三角的,注意力分数部分的计算量理论上约为双向注意力的一半(FFN、投影层不受影响,整体并不会快一倍)。

EmbeddingGemma 没有走这条路,而是先把 decoder-only 的 Gemma 3 改造成 encoder-decoder,再取出其中的 encoder。

从 Gemma 3 到 encoder#

EmbeddingGemma 从 300M 的 Gemma 3 出发,按 T5Gemma 的方法得到 encoder:

  1. 构建 encoder:复用 Gemma 3 的 self-attention、FFN 等权重,把因果注意力改成双向注意力。
  2. 构建 decoder:同样复用原权重,保留因果 self-attention,并新增 cross-attention 读取 encoder 输出。
  3. UL2 继续预训练:在 Gemma 3 的预训练数据上做混合去噪任务,encoder 理解输入、decoder 还原目标文本,两者联合更新。
  4. 取出 encoder:作为 embedding 模型的主干,decoder 直接丢弃。

encoder 共 24 层,隐藏维度 768。输出的 token 表示先做 mean pooling,再经过两层随机初始化的线性投影(768 → 3072 → 768)得到最终向量。

消融实验(MTEB 多语言任务均分)印证了这些选择:

  • 初始化:encoder-decoder 60.4 > decoder-only 59.7。作者认为这得益于双向注意力,以及 encoder 参数可以专门负责理解输入。
  • 池化:mean 60.4 > attention 60.2 > first-token 59.9 > last-token 59.7。带可学习参数的 attention pooling 反而不如简单平均。

训练目标#

训练同时优化三个损失,分别负责区分相关文本、让向量空间充分展开和吸收大模型的表示能力。

记号:qiq_i 是查询向量,pi+p_i^+ 是相关文档(正例)向量,pi−p_i^- 是看似相关、实则不相关的困难负例向量,BB 是 batch 大小。

1. 对比损失 LC\mathcal L_C:拉近相关,推远不相关#

在标准 InfoNCE 的基础上,单个样本的损失为:

ℓi=−log⁡esim⁡(qi,pi+)/τesim⁡(qi,pi+)/τ+wi esim⁡(qi,pi−)/τ+∑j≠i1TN(i,j) esim⁡(qi,pj+)/τ\ell_i=-\log\frac{e^{\operatorname{sim}(q_i,p_i^+)/\tau}}{e^{\operatorname{sim}(q_i,p_i^+)/\tau}+w_i\,e^{\operatorname{sim}(q_i,p_i^-)/\tau}+\sum_{j\ne i}\mathbb 1_{\text{TN}}(i,j)\,e^{\operatorname{sim}(q_i,p_j^+)/\tau}}

其中 sim⁡\operatorname{sim} 是余弦相似度,τ\tau 是温度。正例在所有候选中的相对得分越高,损失越小。分母中除了正例自身,还有两类负例:

  • 困难负例:权重 wi=exp⁡(α sg(sim⁡(qi,pi−)))w_i=\exp\left(\alpha\,\mathrm{sg}(\operatorname{sim}(q_i,p_i^-))\right),α=5.0\alpha=5.0。负例越像查询,权重越大,模型越重视它;sg\mathrm{sg} 表示停止梯度,权重只反映当前难度,本身不参与求导。困难负例是可选的:大规模、噪声多的 pre-finetuning 阶段只用 (query, target) 对,微调阶段才加入。
  • batch 内负例:同一 batch 中其他样本的正例 pj+p_j^+。每个 batch 只取自同一数据集,这样的负例更难区分、更有价值;1TN\mathbb 1_{\text{TN}} 会把查询或正例与当前样本重复的项 mask 掉,避免误当负例。

2. 分散正则 LS\mathcal L_S:避免向量挤在少数方向上#

对 batch 内两两不同的查询、两两不同的正例,分别惩罚它们内积的平方:

LS=∑i≠j(qi⊤qj)2B(B−1)+∑i≠j((pi+)⊤pj+)2B(B−1)\mathcal L_S= \frac{\sum_{i\ne j}(q_i^\top q_j)^2}{B(B-1)} + \frac{\sum_{i\ne j}((p_i^+)^\top p_j^+)^2}{B(B-1)}

内积越接近 0(近似正交),惩罚越小,于是向量整体在空间中铺开。思路来自 GOR(global orthogonal regularizer):让随机两条文本的向量,在内积的均值和二阶矩上都接近单位球面上独立均匀采样的两点;论文只保留了二阶矩这一项。

它约束的是整体统计性质,并不要求语义相近的文本彼此正交:拉近相关文本仍由对比损失负责,两者相互制衡。作者还希望这种分布让模型对量化更鲁棒,也更适合近似最近邻(ANN)检索。

3. 嵌入匹配 LD\mathcal L_D:直接学习老师的向量#

老师是更大的 Gemini Embedding。以往的蒸馏大多只让学生模仿老师给出的查询-文档相关性分数;这里基于 EmbedDistill,直接把学生的向量对齐到老师的向量,学到的是老师整个向量空间的几何结构。

与 EmbedDistill 不同,论文不只对齐查询和正例,也对齐困难负例,并发现这能明显提升效果。直觉上,这和对比损失中使用困难负例的作用相同:学生能学到老师是如何区分查询与困难负例的。三项等权相加:

LD=LDQ+LDP++LDP−\mathcal L_D=\mathcal L_D^{Q}+\mathcal L_D^{P^+}+\mathcal L_D^{P^-}

补充:MRL#

LC\mathcal L_C 和 LS\mathcal L_S 还套用了 MRL(Matryoshka Representation Learning),在多个嵌套的前缀维度(768 / 512 / 256 / 128)上分别计算损失再直接相加。这样训练出的向量可以直接截断到低维使用。

EmbeddingGemma
https://blog.leemengyu.com/posts/embeddinggemma/
作者
Li Mengyu
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0