第10章 构建文本嵌入模型
Q118:为什么通过对比(相似 / 不相似样本)学习通常比仅学习相似样本能更有效地捕捉文本的语义或特定任务特征?
答案:
通过对比(即同时使用相似/正例和不相似/负例样本)进行学习,比仅学习相似样本能更有效地捕捉语义特征,其核心原因在于对比学习为模型提供了更丰富、更具辨别力的监督信号,并有效防止了“表示坍塌”(Representation Collapse)这一灾难性现象。
让我们从两个角度来深入理解这个问题:
1. 仅学习相似样本的局限性:表示坍塌
假设我们的训练目标仅仅是“让相似的样本在嵌入空间中尽可能接近”。例如,我们使用均方误差(MSE)或余弦相似度损失,只要求正例对 (anchor, positive)
的嵌入向量 v_a
和 v_p
越来越像。
-
模型的“捷径”:在这种单一目标的驱动下,模型会发现一个非常简单的“捷径”来完美地完成任务:将所有输入的文本,无论其内容是什么,都映射到嵌入空间中的同一个点或一个极其微小的区域。
-
灾难性后果:如果所有文本的嵌入都变得相同或几乎相同,那么这个嵌入模型就完全失去了任何表示能力和区分能力。它无法分辨“苹果”和“香蕉”,也无法分辨“今天天气真好”和“我爱人工智能”。这个模型虽然在训练目标上可能达到了“完美”(所有正例对的相似度都为1),但它在任何实际应用中都将是无用的。这种现象被称为表示坍塌或模型坍塌。
图:仅学习正例可能导致所有向量坍塌到一点,而对比学习则塑造出一个有区分度的空间。
2. 对比学习的优势:塑造有意义的语义空间
引入不相似的样本(负例)后,学习目标变为一个双重任务:
- 拉近 (Pull):将相似样本(正例对)的嵌入在空间中拉近。
- 推开 (Push):将不相似样本(负例对)的嵌入在空间中推远。
这种“又拉又推”的机制带来了根本性的改变:
-
提供信息梯度和约束:负例的存在为模型的学习提供了必要的信息梯度和约束。模型不能再走“坍塌”的捷径,因为它必须同时满足“推开”不相似样本的要求。为了降低整体损失,模型被迫去理解文本之间的语义差异,并为不同的语义概念在嵌入空间中找到各自独立且有意义的位置。
-
塑造几何结构:对比学习的过程,本质上是在高维空间中塑造一个有意义的几何结构。相似的语义概念被组织成“簇”,而不相似的“簇”之间则保持着足够大的距离。这个空间的结构直接反映了文本的语义关系,使得“距离近等于语义相似”这一核心假设得以成立。
-
提升辨别力和鲁棒性:通过不断地从“相似但不相同”的难负例中学习,模型被迫关注那些最细微的语义差别,从而极大地提升了其辨别力。这使得模型在面对真实世界中各种复杂、模糊的文本时,表现得更加鲁棒和准确。
总结
学习方式 | 学习目标 | 结果 | 对语义的捕捉 |
---|---|---|---|
仅学习相似样本 | 单一:仅拉近正例 | 表示坍塌:所有向量挤在一起,模型失效。 | 无效:无法区分任何语义。 |
对比学习 | 双重:拉近正例,推开负例 | 结构化的语义空间:相似的成簇,不同的分离。 | 有效:通过对比和区分来理解和表示语义。 |
因此,对比学习通过引入负例,提供了一个防止模型走捷径的必要约束,迫使模型从“区分不同”中去深刻理解“何为相似”,从而学习到真正有价值、有辨别力的语义表示。
Q119:如何生成负例以提升模型性能?如何构建高质量的难负例?
答案:
在训练嵌入模型(尤其是使用对比学习方法时,如多负例排序损失MNR)时,负例(Negative Examples)的质量直接决定了模型的最终性能。高质量的负例,特别是难负例(Hard Negatives),是模型学习区分细微语义差别的关键。
为什么需要负例?
对比学习的目标是“拉近相似的,推开不相似的”。
- 正例(Positive Example):告诉模型“这两个东西意思相近”,模型需要将它们的嵌入向量在空间中拉近。
- 负例(Negative Example):告诉模型“这两个东西意思不同”,模型需要将它们的嵌入向量在空间中推远。
如果只使用随机的、与查询完全不相关的“简单负例”,模型很快就能学会区分它们,但对于那些“看起来相关,但实际不相关”的样本,模型则会感到困惑。难负例就是指那些在语义上与查询(Anchor)很相似,但不是正确答案的样本。通过学习从这些难负例中识别出真正的正例,模型被迫学习更深层次、更精确的语义特征,从而获得更强的泛化能力。
如何生成负例?
生成负例的方法可以从简单到复杂分为以下几类:
1. 随机负例 (Random Negatives)
- 方法:从整个语料库中随机抽取样本作为负例。
- 优点:实现最简单,计算成本最低。
- 缺点:绝大多数随机样本与查询的语义差异巨大,是“简单负例”。模型在训练初期过后,从这些样本上学不到太多有用信息,导致学习效率低下,模型性能瓶颈明显。
2. 批内负例 (In-batch Negatives)
- 方法:这是目前最常用、最高效的方法之一。在一个训练批次(batch)中,对于一个给定的正例对
(query_i, positive_j)
,该批次内所有其他的正例文档positive_j
(其中j ≠ i
) 都被视为query_i
的负例。 - 优点:
- 高效:无需额外的计算或I/O操作来获取负例,极大地提升了训练速度。
- 提供天然的难负例:如果一个批次内的数据来自相似的领域或主题,那么这些批内负例天然就具有一定的语义相似性,构成了质量不错的“半难负例”。
- 缺点:负例的质量和数量受限于批次大小(Batch Size)。批次越大,负例越多越好。
3. 难负例挖掘 (Hard Negative Mining)
为了获得最高质量的负例,我们需要主动去“挖掘”那些最容易让模型混淆的样本。主要方法包括:
-
a. 基于词汇匹配的方法 (Lexical-based)
- 方法:使用传统的稀疏向量检索方法,如 BM25 或 TF-IDF,来为查询检索一个文档列表。在这个列表中,除了真正的正例文档外,其他排名靠前的文档通常在关键词上与查询高度重合,是绝佳的难负例来源。
- 优点:速度快,与基于嵌入的方法形成互补,能找到那些“字面相似但意思不同”的例子。
- 缺点:无法找到那些“字面不同但意思相似”的语义难负例。
-
b. 基于嵌入向量的方法 (Embedding-based)
- 方法:这是最强大的难负例挖掘策略。使用一个已经训练过的(可能是上一代或者一个较弱的)双编码器模型,为查询在整个语料库中进行向量搜索,找出与查询嵌入最相似的Top-K个文档。排除掉真正的正例后,其余的文档就是最难的负例,因为它们在当前模型的认知中与查询最接近。
- 优点:能找到语义上最接近的负例,对模型提升最大。
- 缺点:计算成本高,需要一个预先训练好的模型和一次额外的检索过程。
如何构建高质量的难负例:一个实用的迭代流程
在实践中,通常会结合多种方法,并采用迭代的方式来持续优化。
-
启动阶段 (Stage 1):
- 方法:结合 BM25 和 批内负例。
- 流程:对于每个训练查询,首先使用BM25召回Top-200的文档。将标记好的正例作为Positive,从这200个文档中随机挑选几个作为Hard Negatives。在训练时,再结合批内负例一起使用。
- 目的:快速启动训练,得到一个“第一版”的嵌入模型。
-
迭代挖掘与训练 (Stage 2):
- 方法:使用上一阶段训练好的模型进行难负例挖掘。
- 流程:
- 挖掘 (Mine):使用第一阶段得到的双编码器模型,对每一个训练查询,在整个语料库中进行ANN搜索,找出Top-200的“语义最相似”的文档。
- 构建训练集:将真正的正例和从这200个中挑选出的难负例(排除正例本身)组成新的训练数据。
- 重训练 (Retrain):在新的、包含更难负例的数据集上继续训练模型,得到一个性能更强的“第二版”模型。
- 目的:让模型见到自己当前认知下的“最难”的例子,从而不断突破性能瓶颈。
-
循环迭代:
- 重复第二阶段的“挖掘-重训练”循环。随着模型越来越强,它挖出的难负例质量也越来越高,形成一个自我强化的正向循环。
通过这种“BM25/随机启动 -> 模型迭代挖掘”的策略,我们可以为模型持续不断地提供高质量的难负例,从而最大限度地提升其语义表示和分辨能力。
Q120:双编码器和交叉编码器有什么区别?假设你需要构建一个大规模语义搜索引擎,你会优先选择哪种架构来计算查询与文档的相似度,为什么?如果任务变为对少量候选对进行精确重排序,你的选择会改变吗?
答案:
双编码器(Bi-Encoder)和交叉编码器(Cross-Encoder)是用于计算文本对(如查询-文档)相似度的两种核心架构。它们在计算效率和模型精度之间做出了根本性的不同权衡,这使得它们分别适用于搜索系统的不同阶段。
核心区别
特性 | 双编码器 (Bi-Encoder) | 交叉编码器 (Cross-Encoder) |
---|---|---|
架构图 | ![]() | ![]() |
计算流程 | 1. 独立编码:查询和文档分别通过两个独立的Transformer编码器,生成各自的嵌入向量。 2. 后期交互:通过计算两个嵌入向量的余弦相似度来得到最终分数。 | 1. 早期交互:将查询和文档拼接在一起(通常用 [SEP] 分隔),作为一个单一序列输入到一个Transformer编码器中。2. 深度交互:模型内部的自注意力机制(Self-Attention)会在所有层面对查询和文档的词元进行深度、复杂的交互。 3. 输出分数:最终通过一个特殊词元(如 [CLS] )的输出来得到一个单一的相似度分数。 |
速度 | 极快。因为文档的嵌入向量可以预先计算并存储。在线上服务时,只需计算查询的嵌入,然后在海量文档向量中进行高效的向量近邻搜索。 | 极慢。因为每次查询都必须与每个候选文档进行一次完整的、昂贵的模型前向传播。无法预计算。 |
精度 | 较低。由于查询和文档在编码时互相不可见,模型无法捕捉它们之间细微的、依赖上下文的交互关系。 | 非常高。通过深度的交叉注意力,模型能捕捉到极其细微的语义关联,例如一个词在特定查询上下文中的特殊含义。 |
适用场景 | 召回(Recall) / 一级检索(First-stage Retrieval) | 重排序(Reranking) / 二级排序(Second-stage Ranking) |
场景一:构建大规模语义搜索引擎
优先选择:双编码器 (Bi-Encoder)
原因:
对于一个需要从数百万甚至数十亿文档中检索信息的大规模搜索引擎来说,响应速度是决定系统可用性的生命线。用户期望在毫秒或秒级内得到结果。
-
可扩展性与效率:双编码器架构完美地满足了这一需求。我们可以离线将整个文档库中的所有文档通过编码器计算出它们的嵌入向量,并将这些向量存储在专门的向量数据库(如FAISS, Milvus, Pinecone)中。当一个在线查询到来时,我们只需要:
- 用同样的编码器计算查询的嵌入向量(极快)。
- 在向量数据库中执行一次高效的近似最近邻(Approximate Nearest Neighbor, ANN)搜索,找出与查询向量最相似的Top-K个文档向量(极快)。
-
不可行性:如果使用交叉编码器,对于每一个查询,都需要将其与库中的每一个文档进行一次完整的模型计算。假设有100万个文档,一次查询就需要进行100万次昂贵的Transformer前向传播,这在计算上是完全不可行的,响应时间可能会是数小时甚至数天。
因此,在大规模搜索的召回阶段,双编码器是唯一可行的选择。
场景二:对少量候选对进行精确重排序
选择改变:是,优先选择交叉编码器 (Cross-Encoder)
原因:
当任务变为对一个小规模的、已经经过初步筛选的候选集(例如,由双编码器召回的Top-100个文档)进行精确排序时,我们面临的核心矛盾从“速度”转向了“精度”。
-
追求极致的精度:在这个阶段,我们不再关心处理海量文档的能力,而是希望在这一小撮“可能相关”的文档中,找出“最相关”的那几个。交叉编码器通过其深度交互的能力,能够更好地理解查询和每个文档之间的细微差别,从而给出远比双编码器更精准的排序结果。它可以判断出那些表面相关但实际不符的“陷阱”文档,提升最终结果的质量。
-
计算成本可接受:对100个候选文档运行100次交叉编码器计算,其延迟通常在可接受的范围内(例如几百毫秒),这对于提升最终搜索结果的质量来说是完全值得的。
总结:业界标准的“召回-排序”两阶段范式
在实践中,最佳的解决方案是将两者结合,形成一个两阶段的搜索流水线:
- 召回阶段 (Recall):使用双编码器从海量文档库中快速、粗略地召回一个较小的、高度相关的候选集(如Top-100)。
- 排序阶段 (Ranking):使用交叉编码器对这个小候选集进行精细、准确的重排序,得到最终呈现给用户的Top-K结果。
这种“快而粗(双编码器)+ 慢而精(交叉编码器)”的组合,完美地平衡了大规模搜索系统对速度和精度的双重需求。
Q121:多负例排序损失(MNR)、余弦相似度损失和 softmax 损失在训练嵌入模型时有哪些优缺点?在什么场景下,余弦相似度损失可能比 MNR 损失更合适?
答案:
在训练文本嵌入模型时,选择合适的损失函数至关重要,它直接决定了模型学习语义表示的方式。多负例排序损失(Multiple Negatives Ranking Loss, MNR)、余弦相似度损失(Cosine Similarity Loss)和Softmax损失是三种常见但目标各异的损失函数。
1. 三种损失函数的核心思想
A. 余弦相似度损失 (Cosine Similarity Loss)
- 核心思想:直接优化一对句子的相似度。它将两个句子的嵌入向量的余弦相似度与一个真实标签(通常是-1到1之间的连续值)进行比较,目标是让模型预测的相似度尽可能接近真实标签。
- 数学形式:通常使用均方误差(Mean Squared Error, MSE)作为损失:
Loss = (gold_label - cosine_similarity(v1, v2))^2
- 数据要求:需要成对的句子和它们之间连续的、带标签的相似度分数(如STSB数据集)。
B. Softmax 损失 (Softmax Loss)
- 核心思想:将句子匹配问题视为一个分类问题。给定一个句子(锚点),从一个包含一个正例和一个或多个负例的集合中,正确地“分类”出哪个是正例。
- 数学形式:模型计算锚点与所有候选句子的相似度分数,然后通过Softmax函数将其转换为概率分布,最后使用交叉熵损失(Cross-Entropy Loss)来最大化选中正例的概率。
- 数据要求:需要**三元组(anchor, positive, negative)**或更多负例。
C. 多负例排序损失 (Multiple Negatives Ranking Loss, MNR)
- 核心思想:这是Softmax损失的一种更高效、更强大的变体,专门为信息检索和语义搜索场景设计。它利用了“批内负采样(in-batch negatives)”的思想。
- 工作方式:在一个批次(Batch)中,假设有
N
个正例对(a_i, p_i)
。对于任何一个锚点a_i
,其对应的p_i
是它的正例,而批次内所有其他的p_j
(其中j != i
) 都被视为它的负例。因此,对于每个锚点,我们都有1个正例和N-1
个高质量的“硬负例”。 - 目标:与Softmax损失类似,目标是让
a_i
与p_i
的相似度远大于它与所有其他p_j
的相似度。 - 数据要求:只需要正例对
(sentence1, sentence2)
。负例是自动从批次内构建的,无需手动提供。
2. 优缺点对比
特性 | 余弦相似度损失 | Softmax 损失 | 多负例排序损失 (MNR) |
---|---|---|---|
训练效率 | 高 | 中等(需要构建三元组) | 非常高(无需构造负例,批内自动生成) |
数据要求 | 需要带连续相似度分数的句子对 | 需要三元组(或更多负例) | 只需要正例对 |
负样本质量 | 不直接使用负样本 | 依赖于提供的负样本质量 | 高质量(批内负例通常是语义相关但非最优的“硬负例”) |
优化目标 | 优化绝对相似度分数 | 优化分类正确性 | 优化排序/检索性能 |
主要优点 | 简单直观,能学习绝对相似度 | 概念清晰,易于理解 | 高效,训练信号强,非常适合检索任务 |
主要缺点 | 需要昂贵的带分数的标注数据 | 负样本选择困难,效率较低 | 不学习绝对相似度,只关心相对排序 |
3. 何时余弦相似度损失比 MNR 损失更合适?
尽管MNR损失在许多场景下(尤其是在构建RAG等检索系统时)因其高效和强大的性能而成为首选,但在以下特定场景中,结构更简单的余弦相似度损失可能更为合适:
-
当你需要一个绝对的、可解释的相似度分数时
- 场景:你需要判断两段文本的相似度是否超过一个固定的阈值(例如0.8)来进行某些操作,或者你需要向用户展示一个直观的“相似度百分比”。
- 原因:MNR只关心“相对排序”,即正例的得分是否高于所有负例。它不保证相似度得分本身有任何绝对意义。一个用MNR训练的模型可能会给两个语义完全相同的句子打出0.6的相似度,而给两个不相关的句子打出0.5的相似度。而余弦相似度损失直接优化模型去拟合一个绝对的、有意义的相似度分数,其输出结果更具可解释性。
-
当高质量的负样本难以获取时
- 场景:你的数据集中只有正例对,并且这些正例对非常相似,以至于在一个批次内,任何一个其他的正例对于当前锚点来说都不能算是一个好的“负例”。例如,数据全是“A是B的释义”这样的高度相似对。
- 原因:MNR的有效性高度依赖于“批内负采样”能够提供有意义的硬负例。如果批内的其他样本与正例过于相似,模型很难从中学习到区分度,甚至会产生混淆。在这种情况下,如果恰好有带连续相似度分数的数据(如STSB),使用余弦相似度损失会是更稳健的选择。
-
当训练数据本身就是带连续分数的回归任务时
- 场景:你的任务目标本身就是预测一个连续的相似度分数,例如参加STSB评测。
- 原因:任务目标和损失函数完全匹配。将回归问题强行转换为排序问题(MNR)是不自然且低效的。
总结:MNR是为高效的语义检索而生的王者,而余弦相似度损失则在需要可解释的绝对相似度或处理特定回归式标注数据时,展现其不可替代的价值。
Q122:为什么 TSDAE 选择使用特殊词元而非平均池化作为句子表征?
答案:
TSDAE(Transformer-based Denoising Autoencoder)选择使用特殊词元(通常是 [CLS]
)的输出向量作为句子表征,而非更常见的平均池化(Mean Pooling),其背后有深刻的技术考量,主要与基础模型(如BERT)的预训练方式和TSDAE自身的架构目标紧密相关。
1. 平均池化在“原生”Transformer模型中的缺陷
首先,我们需要理解为什么对于一个没有经过“句子相似度”任务微调的、开箱即用的BERT模型,直接对其所有词元(Token)的输出向量进行平均池化,效果往往很差。
-
“各向异性”(Anisotropy)问题:研究(如Sentence-BERT论文中提到的)发现,原生BERT的词元嵌入空间存在严重的“各向异性”问题。这意味着所有词元的输出向量都倾向于分布在向量空间中的一个非常狭窄的锥形区域内。它们彼此之间的余弦相似度都很高(例如,普遍大于0.7),即使这些词语在语义上毫无关系。
-
平均池化的后果:在这种“挤在一起”的向量空间中进行平均池化,会导致最终得到的句子向量也全都挤在一个小区域里,彼此之间缺乏区分度。无论输入什么句子,得到的句子嵌入向量在方向上都非常接近,无法有效地用于衡量语义相似度。
-
原因:BERT的预训练任务是掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)。这些任务优化的是词元级别的表示,旨在让模型能够根据上下文预测单词,而不是生成一个高质量的、可用于比较的句子级向量。因此,模型并没有被“教导”如何将整个句子的语义信息有效地聚合到一个全局表征中。
2. TSDAE 架构如何“激活”[CLS]
词元
TSDAE通过其独特的编码器-解码器和去噪任务,巧妙地解决了上述问题,并赋予了 [CLS]
词元作为高质量句子表征的能力。
-
信息瓶颈(Information Bottleneck):TSDAE的架构是,编码器(Encoder)接收一个被“加噪”的句子,并将其所有信息压缩到
[CLS]
词元的输出向量中。随后,解码器(Decoder)仅仅使用这个[CLS]
向量作为其全部输入,来尝试重构出原始的、完整的、无噪声的句子。 -
“逼迫”
[CLS]
学习全局语义:这个过程创造了一个强大的“信息瓶颈”。为了让解码器能够成功地“解压缩”并还原整个句子,编码器必须学会如何将句子的所有关键语义信息(词序、依赖关系、整体含义等)高效地编码(encode)到[CLS]
这一个向量中。如果[CLS]
向量丢失了重要信息,解码器就无法完成重构任务。 -
[CLS]
成为天然的句子表征:因此,经过TSDAE训练后,[CLS]
词元的输出向量就不再是一个普通的、未经优化的向量了。它被“训练”成了一个信息密度极高、专门用于概括整个句子语义的**“超级表征”**。这个向量自然而然地成为了代表整个句子的最佳选择。
总结
方法 | 在原生BERT中的问题 | 在TSDAE中的角色和优势 |
---|---|---|
平均池化 | 受各向异性影响,导致句子向量缺乏区分度,相似度计算不可靠。 | (未使用) |
[CLS] 词元 | 在原生BERT中,其向量同样未被优化用于句子相似度任务。 | 通过编码器-解码器的“信息瓶颈”设计,被强制学习成为一个包含了完整句子语义的、高质量的、信息密集的句子表征。 |
简单来说,TSDAE之所以选择 [CLS]
词元,是因为它的训练任务从根本上改变了这个词元的角色:从一个普通的特殊标记,转变为一个经过精心设计的、承载整个句子所有语义信息的**“信息枢纽”**。这使得它远比在有问题的向量空间中进行简单的平均池化要可靠和有效得多。
Q123:相比有监督方法,TSDAE 这类无监督预训练方法在处理领域外数据或进行领域适配时有何优缺点?
答案:
TSDAE(Transformer-based Denoising Autoencoder)代表了一类强大的无监督领域自适应方法。在处理领域外(Out-of-Domain, OOD)数据或需要将一个通用模型适配到特定领域(如法律、医疗)时,与传统的有监督方法相比,TSDAE这类无监督预训练方法展现出了独特的优缺点组合。
核心差异:学习信号的来源
- 有监督方法:依赖人工标注的高质量数据对(如NLI中的“蕴含/矛盾/中立”标签,或STS中的相似度分数)。学习信号强而明确,直接优化特定任务目标。
- 无监督方法(如TSDAE):不依赖任何人工标签,而是通过数据自身的结构来创造学习任务。TSDAE的核心任务是“去噪重构”:将一个被“加噪”(如删除、交换词语)的句子,通过编码器-解码器结构恢复成原始句子。学习信号弱但泛在,目标是学习文本的普适语义表示。
优点:低成本、高适应性的领域专家
-
无需昂贵的人工标注(Zero Label Cost)
- 这是最大的优点。对于许多专业领域(如生物医学、金融财报、法律文书),获取大量高质量的标注数据成本极高,甚至是不可能的。TSDAE只需要该领域的纯文本即可,数据获取成本极低。
-
强大的领域适应能力(Strong Domain Adaptation)
- 一个在通用领域(如维基百科)预训练好的模型,其语义空间可能并不适应特定领域的术语和表达习惯(例如,“苹果”在通用领域指水果,在科技领域指公司)。通过在目标领域的无标签文本上运行TSDAE,可以有效地将模型的语义空间“扭转”或“校准”,使其更好地理解该领域的特定语义。这个过程被称为领域自适应预训练(Domain-Adaptive Pre-training, DAPT)。
-
充分利用海量无标签数据(Leverages Massive Unlabeled Data)
- 企业或研究机构通常拥有大量的领域内无标签文本(如内部文档、报告、论文)。TSDAE能够将这些沉睡的数据资产转化为提升模型性能的宝贵资源,学习到有监督方法因数据稀疏而无法学到的领域知识。
缺点:学习信号的模糊性与任务的非直观性
-
学习信号相对较弱(Weaker Learning Signal)
- “去噪重构”任务的目标是学习一个通用的、鲁棒的句子表示,但它并不直接针对任何特定的下游任务(如相似度判断、分类)。因此,相比于直接在目标任务上进行有监督训练,其性能上限可能更低。它更像是在打“通识基础”,而非“应试训练”。
-
可能引入领域噪声(Potential to Learn Noise)
- 如果领域内的无标签文本质量参差不齐,包含大量非正式、有错误或无关的表达,TSDAE可能会将这些噪声也学习到模型中,因为它无法像有监督方法那样区分“好”与“坏”。
-
对特定任务的优化不足(Not Optimized for Specific Tasks)
- TSDAE旨在提升句子的整体语义表示质量,但如果你的最终目标是一个非常具体的任务,例如判断两段代码的逻辑等价性,那么有监督方法(如果能获得数据)通常会提供更直接、更有效的优化路径。
总结与实践建议
特性 | 有监督方法 (Supervised) | 无监督方法 (e.g., TSDAE) |
---|---|---|
数据需求 | 高质量、人工标注的数据对 | 大量无标签的纯文本 |
成本 | 极高 | 极低 |
领域适应 | 困难,依赖领域内标注数据 | 简单高效,直接使用领域文本 |
学习信号 | 强,任务导向 | 弱,通用表示导向 |
性能上限 | 在数据充足时,通常更高 | 作为预训练步骤,能显著提升基线 |
最佳实践(Best Practice):
在实际应用中,最佳策略通常是结合两者的优点:
-
第一步:无监督领域自适应预训练
- 拿一个在通用领域预训练好的基础模型(如BERT)。
- 在你的目标领域的大量无标签文本上,使用TSDAE进行进一步的预训练。这会使模型成为一个理解该领域术语和语义的“领域专家”。
-
第二步:有监督任务微调
- 将在第一步中适配好的模型,用于你的具体下游任务(如相似度匹配、分类等)。
- 此时,你只需要少量的领域内有监督数据,就可以达到非常好的性能,因为模型已经具备了坚实的领域知识基础。这种方法被称为**“预训练-微调”(Pre-train, Fine-tune)**范式,是当前NLP领域的主流方法。
Q124:MTEB 相比基础的语义相似度测试(STSB)有哪些改进?其中包括哪些类别的嵌入任务?
答案:
MTEB(Massive Text Embedding Benchmark)是目前评估文本嵌入模型最全面、最权威的基准之一。相比于像STSB(Semantic Textual Similarity Benchmark)这样的早期基准,MTEB做出了根本性的、全方位的改进,旨在更真实、更全面地评估一个嵌入模型在各种现实场景下的泛化能力。
STSB 的局限性
在讨论MTEB的改进之前,我们先要理解STSB的局限性:
- 任务单一:STSB只专注于一个任务——语义文本相似度(Semantic Textual Similarity, STS)。它衡量的是模型判断两个句子语义相似程度的能力(通常是1-5分)。
- 领域狭窄:其数据主要来源于新闻、标题等通用领域,无法评估模型在法律、生物、金融等垂直领域的表现。
- 评估片面:一个在STS任务上表现好的模型,不一定在分类、聚类或信息检索等其他下游任务上同样出色。模型的“好坏”被极大地简化了。
MTEB 的核心改进
MTEB通过以下三个核心改进,克服了STSB的局限性:
-
大规模性(Massive):MTEB整合了58个不同的数据集,覆盖了112种语言,数据规模远超以往任何基准。这使得评估结果更具统计意义,更能抵抗“过拟合”到某个特定测试集上的风险。
-
多任务性(Multi-task):这是MTEB最核心的改进。它不再将模型能力局限于单一的STS任务,而是将其扩展到8大类、共计58个具体的嵌入任务中。这强迫模型必须具备更全面的语义理解和表示能力,而非仅仅是判断句子间的相似度。
-
多领域性(Multi-domain):MTEB精心挑选了来自不同领域的数据集,包括生物医学(SciFact)、金融(FiQA)、法律等,可以有效评估模型在特定垂直领域的性能,这对于企业级应用至关重要。
MTEB 包含的嵌入任务类别
MTEB将嵌入模型的下游应用场景归纳为以下8大任务类别,每个类别下包含多个具体的数据集:
任务类别 | 任务描述 | 典型例子 | 对模型能力的要求 |
---|---|---|---|
1. 比特文本检索 (Bitext Mining) | 从两种语言的大量句子中,找出互为翻译的句子对。 | Tatoeba | 跨语言语义对齐能力 |
2. 分类 (Classification) | 将给定的文本嵌入向量用于训练一个简单的分类器(如逻辑回归),评估其区分类别的能力。 | AmazonReviews, TweetEval | 嵌入向量的类别区分度 |
3. 聚类 (Clustering) | 将一组文本根据其嵌入向量进行聚类,评估聚类的质量(如V-measure)。 | ArxivClustering, BiorxivClustering | 语义空间的结构性、同类文本的聚集度 |
4. 成对分类 (Pair Classification) | 判断两个句子是否具有某种特定关系(如释义、矛盾、蕴含)。 | MSRP, QQP | 对句子间细微语义关系的捕捉能力 |
5. 重排序 (Reranking) | 给定一个查询和一组候选文档,将最相关的文档排在最前面。 | SciDocs, NFCorpus | 对查询和文档相关性的精准排序能力 |
6. 检索 (Retrieval) | 从一个巨大的文档库中,为给定的查询找出最相关的文档。这是RAG应用的核心。 | MSMARCO, QuoraRetrieval | 在大规模数据中进行高效、准确语义匹配的能力 |
7. 语义文本相似度 (STS) | 与STSB任务相同,判断两个句子的语义相似度得分。 | STSB, Sick-R | 对句子级语义相似度的精细度量能力 |
8. 摘要 (Summarization) | 评估生成的摘要与其源文本在语义上的一致性。 | SummEval | 对文本核心语义的把握和压缩能力 |
总结来说,MTEB通过构建一个多任务、多领域、大规模的评估矩阵,从根本上改变了我们衡量文本嵌入模型好坏的方式。它不再是一个单一的分数,而是一个全面的“能力雷达图”,清晰地展示了模型在不同应用场景下的优势和短板,为模型选型和优化提供了远比STSB更可靠、更具指导意义的依据。
Q125:如何根据用户偏好反馈数据,持续提升 RAG 系统的重排序模型性能?
答案:
根据用户偏好反馈数据来持续提升RAG(Retrieval-Augmented Generation)系统中重排序模型(Reranker)的性能,核心在于构建一个闭环的在线学习系统。这个系统能够捕获用户的显式和隐式反馈,将其转化为高质量的训练数据,并用于持续微调(Fine-tuning)重排序模型,使其越来越懂用户的真实意图。
以下是实现这一目标的详细步骤和策略。
1. 收集用户偏好反馈数据
反馈数据是整个优化循环的燃料。我们可以从以下两个方面收集:
A. 显式反馈(Explicit Feedback)
这是最直接、最准确的信号,但通常比较稀疏。
- 顶/踩(Upvote/Downvote):在每个检索结果旁边设置“赞”和“踩”的按钮。
- 星级评分(Star Ratings):允许用户对检索结果进行1-5星的评价。
- “选为最佳答案”:如果场景适用,允许用户将某个检索结果标记为解决了他们的问题。
- 直接反馈表单:提供一个简单的入口,让用户报告“这个结果不相关”或“我想要的是XXX”。
B. 隐式反馈(Implicit Feedback)
这是用户无意识行为产生的数据,量大但有噪声,需要谨慎处理。
- 点击率(Click-Through Rate, CTR):用户点击了哪个检索结果?通常,被点击的结果比未被点击的更相关。
- 停留时间(Dwell Time):用户点击一个结果后,在页面上停留了多长时间?停留时间长可能意味着内容有用。
- 鼠标悬停(Hovering):用户鼠标在哪个结果上悬停时间较长?
- 复制粘贴行为:用户是否从某个检索结果中复制了内容?这是一个非常强的正向信号。
- 后续查询(Query Reformulation):用户在看到结果后,是否修改了查询词并重新搜索?这可能意味着初次检索的结果不佳。
2. 将反馈数据转化为训练样本
我们的目标是训练一个成对学习(Pairwise Learning to Rank)的重排序模型。因此,需要将收集到的反馈数据转换成偏好对(Preference Pairs),其标准格式为 (query, chosen_document, rejected_document)
,表示对于同一个查询 query
,用户更偏爱 chosen_document
而不是 rejected_document
。
转化规则示例:
- 显式反馈:
- 用户对文档A点了“赞”,对文档B点了“踩” -> 生成偏好对
(query, A, B)
。 - 用户将文档C选为最佳答案,而文档D是另一个高排名结果 -> 生成偏好对
(query, C, D)
。
- 用户对文档A点了“赞”,对文档B点了“踩” -> 生成偏好对
- 隐式反馈:
- 用户点击了文档E,但没有点击文档F(假设E和F排名接近) -> 生成偏好对
(query, E, F)
。 - 用户点击文档G后停留了30秒,点击文档H后只停留了3秒 -> 生成偏好对
(query, G, H)
。
- 用户点击了文档E,但没有点击文档F(假设E和F排名接近) -> 生成偏好对
3. 持续微调重排序模型
有了偏好对数据集后,我们就可以定期对重排序模型进行微调。
-
模型选择:重排序模型通常是一个跨编码器(Cross-Encoder),例如基于BERT的模型。它接收
(query, document)
对作为输入,并输出一个单一的相关性分数。 -
损失函数:使用成对学习的损失函数,最常用的是RankNet Loss或Hinge Loss。
- RankNet Loss 的核心思想是:模型对
(query, chosen_document)
的打分(score_chosen
)应该高于对(query, rejected_document)
的打分(score_rejected
)。损失函数会惩罚那些score_chosen <= score_rejected
的情况。
- RankNet Loss 的核心思想是:模型对
-
训练流程:
- 数据批处理:从偏好对数据集中抽取一个批次(Batch)的数据。
- 模型打分:对于每个偏好对,让重排序模型分别计算
score_chosen
和score_rejected
。 - 计算损失:根据上述损失函数,计算批次的总损失。
- 反向传播:更新模型参数,以最小化损失。
4. 系统架构与部署
- 日志系统:建立一个强大的日志系统,用于捕获所有用户交互和反馈。
- 数据处理管道:开发一个ETL(Extract, Transform, Load)管道,定期将原始日志转化为干净的偏好对数据集。
- 训练服务:设置一个独立的训练服务,定期(如每天或每周)拉取最新的偏好数据集,对线上重排序模型的一个副本进行微调。
- A/B 测试:在将更新后的模型全面部署之前,通过A/B测试来验证其性能是否确实优于旧模型,确保用户体验得到正向提升。
通过这个“收集 -> 标注 -> 训练 -> 验证 -> 部署”的闭环,RAG系统的重排序模型就能够持续地从真实用户行为中学习,不断进化,从而提供越来越精准和个性化的搜索结果。
Q126:如果一个 RAG 系统没有人类用户,仅供 AI agent 使用,如何自动收集 AI agent 的反馈,持续提升 RAG 系统的重排序模型性能?
答案:
为一个仅供 AI Agent 使用的 RAG 系统收集反馈并持续优化,关键在于建立一个自动化的、基于 Agent 行为和任务结果的闭环反馈系统。其核心思想是:将 Agent 的最终任务成败和解决问题的过程本身,作为衡量检索文档质量的“代理指标”(Proxy Metric)。如果 Agent 成功、高效地完成了任务,那么它所依赖的文档大概率是高质量的;反之,则可能是低质量的。
以下是构建这样一个自动化反馈与优化系统的完整方案。
1. 核心思路:从 Agent 的“行为”中挖掘“反馈”
我们无法直接问 Agent “这个文档好不好?”,但我们可以通过观察其行为来推断。整个系统可以被设计成一个持续学习的循环:执行 -> 监控 -> 分析 -> 标注 -> 训练 -> 部署。
2. 关键的自动化反馈信号
我们可以从以下几个维度自动捕获信号,以生成用于训练重排序模型(Reranker)的偏好数据(Preference Data)。
反馈信号类别 | 具体指标 | 如何解读和利用 | 数据示例(用于训练) |
---|---|---|---|
任务结果信号 | 最终任务成功/失败 | 这是最强的反馈信号。需要一个可自动验证任务结果的方法(如单元测试通过、API返回成功码、代码可编译等)。 | 正例:Agent 使用文档A、B后任务成功。{query, doc_A, doc_C} (A > C) |
Agent 自我修正次数 | Agent 在读取某些文档后,是否需要进行额外的澄清查询或修正自己的计划?修正次数越多,说明初始文档可能越模糊或有误导性。 | 负例:Agent 读取文档D后,发起了新的澄清查询。{query, doc_E, doc_D} (E > D) | |
内容使用信号 | 文档内容引用(Citation) | Agent 在其最终答案或推理链(Chain-of-Thought)中,是否明确引用了某篇文档的内容?被引用的文档是强正例。 | 强正例:Agent 的答案明确来自文档F。{query, doc_F, doc_G} (F > G) |
内容忽略(Ignorance) | 在重排序模型返回的Top-K个文档中,哪些文档被 Agent 完全忽略,从未在推理链中出现?这些是很好的负例。 | 强负例:文档G在Top-5中,但Agent完全没用。{query, doc_F, doc_G} (F > G) | |
效率与成本信号 | 解决问题的步数/时间 | Agent 使用哪些文档组合时,能以最少的步骤或最短的时间解决问题?这代表了文档的“信息效率”。 | 偏好:使用文档H比使用文档I,解决问题快3步。{query, doc_H, doc_I} (H > I) |
外部工具调用 | Agent 在读取RAG返回的文档后,是否仍然需要调用外部工具(如 Web Search)来寻找答案?这说明内部文档库未能满足需求,是负向信号。 | 负例:Agent 读取文档J后,转而求助搜索引擎。{query, doc_K, doc_J} (K > J) |
3. 自动化数据标注与训练流程
-
全面日志记录(Logging):记录 Agent 的每一次交互,包括:
- 原始查询(Query)
- 召回的文档列表
- 重排序后的文档列表(及其分数)
- Agent 的完整思考链(CoT)和最终行动
- 任务的最终结果(Success/Fail)和效率指标(步数、时间等)
-
自动化标注器(Automated Labeler):开发一个“标注函数”或使用一个强大的LLM(如GPT-4)作为“裁判”,来自动处理上述日志,生成偏好数据集。
- 输入:一条完整的交互日志。
- 逻辑:根据上述反馈信号规则,自动判断哪些文档是“好”的(被引用、带来成功),哪些是“坏”的(被忽略、导致失败或低效)。
- 输出:大量的偏好对,格式通常为
(query, chosen_document, rejected_document)
。
-
持续微调(Continuous Fine-tuning):
- 定期(例如每天或每周)使用新收集到的偏好数据集来微调(Fine-tune)你的重排序模型。
- 重排序模型通常是一个跨编码器(Cross-Encoder),它接收
(query, document)
对并输出一个相关性分数。训练的目标是让模型对chosen_document
的打分高于rejected_document
。
-
A/B 测试与部署:
- 在将更新后的模型部署到生产环境之前,进行 A/B 测试,确保新模型能带来 Agent 整体任务成功率的提升。
通过这个闭环系统,RAG 的重排序模型能够从其唯一的“用户”——AI Agent——那里持续学习,不断地自我迭代和优化,从而更精准地理解 Agent 的需求,提供更高质量的信息支持。
Q127:如果要构建一个类似 Google 图片搜索的文本嵌入模型,根据输入图片找到相似图片,应该如何训练?
答案:
要构建一个类似Google图片搜索的系统,其核心能力不仅包括“以文搜图”,还包括更基础的“以图搜图”。这要求模型能够理解图片的内容,并将其表示为一个可以进行相似度计算的向量(即嵌入)。解决这个问题的关键在于训练一个强大的多模态嵌入模型,使其能够将图片和描述图片的文本映射到同一个统一的语义空间中。目前业界最主流、最成功的方法是基于对比学习的**CLIP(Contrastive Language-Image Pre-training)**模型。
以下是训练这样一个模型的完整步骤和原理。
1. 核心思想:对齐图像和文本的语义空间
我们的目标是,如果一张图片和一段文本描述的是同一个事物(例如,一张狗的照片和文本“一只在草地上奔跑的金毛犬”),那么它们的嵌入向量在语义空间中就应该非常接近。反之,不相关的图片和文本,其嵌入向量就应该互相远离。
2. 模型架构:双编码器(Dual-Encoder)
为了实现上述目标,我们需要一个能够分别处理图像和文本的双编码器架构:
-
图像编码器(Image Encoder):
- 作用:负责接收一张图片作为输入,并输出一个固定维度的图像嵌入向量(Image Embedding)。
- 常用模型:通常使用强大的卷积神经网络(CNN)如ResNet,或更现代的Vision Transformer (ViT)。
-
文本编码器(Text Encoder):
- 作用:负责接收一段文本作为输入,并输出一个与图像嵌入向量相同维度的文本嵌入向量(Text Embedding)。
- 常用模型:通常使用基于Transformer的语言模型,如BERT。
这两个编码器是独立工作的,但它们的目标是输出可以在同一个空间中进行比较的向量。
3. 训练数据:海量的“图片-文本”对
CLIP的成功在很大程度上归功于其庞大的训练数据集。我们需要收集数以亿计的、从互联网上抓取的“图片-文本”对。这些文本通常是图片的文件名、ALT标签、周围的描述性文字等。这些数据是无监督的,因为我们不需要人工标注它们是否“相似”,只要它们是配对出现的即可。
4. 训练方法:多模态对比学习
训练过程的核心是对比学习,具体步骤如下:
-
构建一个批次(Batch):从数据集中随机抽取
N
个“图片-文本”对,这样我们就有了N
张图片和N
段对应的文本。 -
分别进行编码:
- 将
N
张图片输入图像编码器,得到N
个图像嵌入向量I_1, I_2, ..., I_N
。 - 将
N
段文本输入文本编码器,得到N
个文本嵌入向量T_1, T_2, ..., T_N
。
- 将
-
计算相似度矩阵:计算所有图像嵌入与所有文本嵌入之间的余弦相似度,形成一个
N x N
的相似度矩阵。在这个矩阵中,matrix[i][j]
表示图像I_i
和文本T_j
的相似度。 -
定义损失函数(Contrastive Loss):
- 正例:在这个
N x N
的矩阵中,对角线上的元素matrix[i][i]
是我们希望的正例,因为I_i
和T_i
是天然配对的,它们的相似度应该尽可能高。 - 负例:所有非对角线上的元素
matrix[i][j]
(当i != j
时) 都是负例,因为I_i
和T_j
是不相关的,它们的相似度应该尽可能低。 - 损失计算:损失函数的目标就是最大化对角线上正例的相似度,同时最小化非对角线上所有负例的相似度。这通常通过一个类似Softmax的交叉熵损失来实现,分别在矩阵的行和列上进行计算,确保每个图像能找到其对应的文本,反之亦然。
- 正例:在这个
5. 如何使用训练好的模型进行“以图搜图”
训练完成后,我们就得到了两个强大的编码器。
-
建立索引(Indexing):
- 将你的整个图片库(例如数百万张图片)全部输入到图像编码器中,为每一张图片生成一个嵌入向量。
- 将这些嵌入向量存储在一个专门的向量数据库(如FAISS, Milvus, Pinecone)中,并建立高效的索引(如HNSW, IVF)以便快速检索。
-
执行搜索(Searching):
- 当用户上传一张新的查询图片时,同样使用图像编码器将其转换为一个查询向量。
- 拿着这个查询向量,去向量数据库中执行K-近邻(K-NN)搜索,找出与查询向量在嵌入空间中距离最近的
K
个向量。 - 这
K
个向量对应的原始图片,就是与查询图片最相似的结果。
通过这种方式,我们不仅能实现高效的“以图搜图”,还能利用文本编码器轻松实现“以文搜图”,构建一个功能全面的多模态搜索系统。
Q128:如果要构建一个非自然语言垂直领域(如氨基酸序列、集成电路设计)的语义搜索系统,但该领域标注数据极少,应该如何训练嵌入模型?
答案:
在非自然语言的垂直领域(如生物信息学、电子设计自动化)构建语义搜索系统,最大的挑战是标注数据(即“相似”或“不相似”的样本对)的极度稀缺。在这种情况下,依赖有监督学习是不可行的。解决之道在于充分利用该领域大量的无标注数据,通过**自监督学习(Self-supervised Learning)和迁移学习(Transfer Learning)**来构建高质量的嵌入模型。
核心策略是“通用预训练 + 领域内自监督微调”的两阶段方法。
阶段一:利用通用序列模型进行迁移学习
许多垂直领域的非自然语言数据本质上也是一种序列(如氨基酸序列、基因序列、电路网表中的节点序列)。因此,我们可以利用在海量通用数据(如自然语言、代码)上预训练好的强大序列模型(如BERT、T5)作为起点。
- 选择合适的模型架构:选择一个强大的、基于Transformer的预训练模型。这些模型已经学习到了关于序列数据依赖关系、模式和结构的通用知识。
- 调整词汇表:将模型的词汇表替换为特定领域的“词元”。例如,对于氨基酸序列,词元就是20多种氨基酸;对于集成电路设计,词元可能是不同的逻辑门和标准单元。
阶段二:在领域内无标注数据上进行自监督微调
这是最关键的一步。我们利用领域内海量的无标注数据,设计自监督任务来让模型学习领域的“语法”和“语义”。
1. 设计适用于该领域的自监督任务
自监督学习的核心是从数据自身创造“伪标签”。以下是几种非常有效的自监督任务:
-
掩码预测(Masked Prediction):类似于BERT的掩码语言模型(MLM)。
- 做法:随机“掩盖”掉序列中的一部分单元(如一个氨基酸或一个逻辑门),然后让模型预测被掩盖的单元是什么。
- 效果:通过这个任务,模型被迫学习到单元之间的局部上下文关系和共现模式。例如,它会学到哪些氨基酸片段经常一起出现,构成一个功能域。
-
对比学习(Contrastive Learning):类似于SimCLR或MoCo。
- 做法:
- 取一个序列样本(称为“锚点”)。
- 通过数据增强生成两个该样本的“正例”。对于序列数据,数据增强可以是:
- 随机掩码:随机去掉序列中的一些单元。
- 随机裁剪:随机截取序列的一个子片段。
- 置换:随机打乱一小部分单元的顺序。
- 将数据集中所有其他的序列视为“负例”。
- 训练模型,使其拉近锚点与其正例在嵌入空间中的距离,同时推远其与所有负例的距离。
- 效果:对比学习能让模型学习到序列的全局、高层次的语义表征。经过增强后仍然相似的序列,其嵌入向量也应该相似。
- 做法:
-
下一单元预测(Next Unit Prediction):类似于GPT的训练方式。
- 做法:给定序列的前一部分,让模型预测下一个单元是什么。
- 效果:这能让模型学习到序列的方向性和生成规律。
2. 执行自监督训练
在领域内海量的无标注数据上,使用上述一种或多种自监督任务对模型进行微调。这个过程不需要任何人工标注,模型会自动从数据本身的结构中学习知识。
阶段三(可选):利用少量标注数据进行有监督微调
如果在自监督微调后,能够获得少量(哪怕只有几十或几百个)高质量的标注样本对,可以用这些数据再进行一轮简短的有监督微调(例如,使用多负例排序损失)。这将进一步提升模型在特定任务上的性能,使其嵌入空间与人类专家的判断对齐。
总结
面对标注数据稀缺的垂直领域,成功的关键是摆脱对监督学习的依赖。通过迁移学习利用通用模型的强大基础,再结合领域内自监督学习(特别是对比学习和掩码预测)从海量无标注数据中挖掘领域知识,我们完全可以训练出强大的嵌入模型,为构建高效的语义搜索系统奠定坚实的基础。
Q129:随着新数据和新概念的不断产生,如何检测何时需要更新文本嵌入模型,实现增量的持续学习?
答案:
随着时间推移,新的词汇、概念和数据分布不断涌现(这一现象称为“概念漂移”),静态的文本嵌入模型会逐渐“老化”,其性能会下降。要解决这个问题,需要建立一个包含监控、验证和更新三个阶段的动态维护框架,以实现模型的增量式持续学习。
阶段一:监控(Detection)—— 何时需要更新?
监控是持续学习的第一步,目标是低成本、自动化地检测出模型可能已经过时的信号。主要有两大类监控策略:
1. 基于性能的监控(Performance-based Monitoring)
这是最直接的方法,通过监控模型在实际任务中的表现来判断其有效性。
- 下游任务性能衰退:持续追踪使用该嵌入模型的下游任务(如分类、聚类、语义搜索)的关键性能指标(如准确率、F1分数、召回率、NDCG)。如果观察到指标出现持续、显著的下降,这是一个强烈的更新信号。
- “黄金标准”集评估:维护一个高质量、代表性的“黄金标准”测试集,其中包含固定的、具有代表性的相似/不相似文本对。定期在该测试集上评估模型的性能。如果模型区分这些文本对的能力下降,说明其语义空间已经发生了偏移。
2. 基于数据的监控(Data-based Monitoring)
这类方法不依赖于下游任务的标签,而是通过分析新数据的统计特性来检测变化。
- 词汇表外(OOV)词元增长率:监控新数据中未出现在模型词汇表中的新词元(Out-of-Vocabulary)的比例。如果OOV率急剧或持续上升,说明语言环境已经发生了显著变化。
- 数据分布漂移检测:
- 嵌入空间密度变化:将新数据的文本批量转换为嵌入向量,并分析其在嵌入空间中的分布。可以使用统计方法(如K-L散度、J-S散度)来量化新数据嵌入分布与原始训练数据嵌入分布之间的差异。显著的差异表明语义空间发生了漂移。
- 聚类分析:定期对新数据的嵌入向量进行聚类。如果出现了一些新的、紧凑的、远离现有簇的簇群,这通常意味着新概念或新主题的诞生。
阶段二:验证(Validation)
当监控系统发出警报后,需要进行验证,以确认更新的必要性,避免因暂时的噪声或波动而进行不必要的昂贵更新。验证可以是在“黄金标准”集上进行一次全面的评估,或者通过人工抽样检查新概念是否确实对业务有重要影响。
阶段三:更新(Update)—— 如何实现增量学习?
确认需要更新后,可以根据实际需求和资源选择不同的更新策略:
1. 增量学习(Incremental Learning)
增量学习旨在用新数据更新模型,同时避免“灾难性遗忘”(Catastrophic Forgetting)——即模型在学习新知识后忘记了旧知识。
- 持续预训练(Continual Pre-training):在新的数据上继续进行模型的原始训练任务(如对比学习、掩码语言模型)。这是一种有效的方法,但需要仔细调整学习率,以平衡新旧知识。
- 弹性权重巩固(EWC):这是一种著名的持续学习算法。它在更新模型时,会识别并保护对旧任务至关重要的权重,减慢这些权重的更新速度,从而在学习新知识的同时保留旧能力。
- 数据回放(Data Replay):在用新数据训练时,混入一小部分旧的、有代表性的数据。这是最简单也通常非常有效的防止遗忘的方法。
2. 完全重训练(Full Retraining)
- 按需重训练:将新数据与所有旧数据合并,从头开始重新训练整个模型。这是效果最好但成本最高的方法,适用于模型性能下降显著或有重大新领域数据加入时。
- 定期重训练:设定一个固定的时间周期(如每季度、每半年),定期进行完全重训练。这是一种简单、可预测的策略,适用于业务变化速度较快的场景。
总结:一个实用的框架
一个健壮的持续学习系统通常是一个结合了上述策略的混合框架:
- 持续监控:使用轻量级的数据监控(如OOV率、分布漂移)作为7x24小时的“哨兵”。
- 触发验证:当“哨兵”发出警报时,自动触发基于性能的监控(如黄金标准集评估)进行确认。
- 智能更新:如果性能下降得到证实,根据下降的严重程度、新数据的规模以及计算预算,选择最合适的更新策略(例如,对于小幅漂移采用增量学习,对于大幅漂移或累积了大量新数据后进行完全重训练)。