在韩语金融文本中使用 NV-Retriever 探索难负例挖掘

社区文章 发布于 2025 年 1 月 12 日

本文由Yewon Hwang撰写,并获得Hanwool Lee的建议贡献。

现代文本嵌入模型——在 SimCSE[1] 之后——广泛依赖于对比学习来微调句子嵌入。对比方法旨在将语义相似的句子在嵌入空间中拉近,将不相似的句子推远。然而,如何定义“相似”或“不相似”高度依赖于拥有正确的正例负例对。

特别是,过于简单或完全随机的负例对(例如从大型语料库中随机选取任何句子)可能无法为模型提供足够的训练信号。模型很容易将它们识别为不相似,并从中学习到很少的东西。另一方面,难负例是那些表面上有些相似但最终意义无关的棘手句子对——这使它们对模型性能来说弥足珍贵。

在这篇博客文章中,我们将重点关注:

  1. 难负例挖掘背后的原理,
  2. NV-Retriever 作为一种“正例感知”方法,
  3. 韩语金融领域环境中的实验应用。

1. 对比学习与难负例问题

1.1 快速背景

SimCSE[1] 引发了一波基于对比学习的句子嵌入方法浪潮。其原则是:

  • 正例对(语义上接近)在嵌入空间中被拉近,
  • 负例对(语义上遥远)被推开。

为了有效实现这一目标,构建一个包含正例负例的良好数据集至关重要。如果负例对是微不足道的随机样本(例如,“高阳喜欢什么食物?”与“Netflix 成立于 1997 年。”),模型会认为它们显然无关,从而获得最小的收益。这样的“易负例”无助于细化嵌入的区别。

因此,难负例——模型难以与真阳例区分的样本对——能够推动更细致的学习。然而,系统地找到这些难负例仍然具有挑战性。

1.2 早期尝试与局限性

方法 说明 弱点
朴素的 top-k 选择 top-k 最相似的段落(排除已知正例) 引入假负例的可能性很高
按 N 偏移的 Top-K 跳过前 N 个匹配,然后选择 top k 忽略了超出绝对排名截止值的相似性分数;可能既会丢失有价值的负例,又会保留错误的负例
Top-k 绝对值 排除相似性高于某个阈值的负例段落 高度依赖于一个超敏感的阈值

此外,BM25 或来自 DPR[4]、ANCE[5] 等的朴素方法有时会产生大量“假负例”。RocketQA[6] 发现,在 MS-MARCO 数据集上,经过手动检查,近 70% 的基于 BM25 的“难负例”实际上是正例。


2. NV-Retriever:正例感知的难负例

NV-Retriever[7] 提出了一种正例感知的负例挖掘方法,其中每个查询的正例相似度指导着最大负例相似度阈值。

  1. 选择一个较大的教师模型(例如,基于 e5 或基于 Mistral 的模型)。

  2. 使用教师嵌入对查询和段落进行编码。

  3. 对于每个具有已知正例对的查询 ( q ):

    • 获取正例分数(pos_score)。
    • 定义最大负例相似度阈值:
      • Top-K MarginPos:max_neg_score_threshold = pos_score - absolute_margin
      • Top-K PercPos:max_neg_score_threshold = pos_score * percentage_margin
  4. 在过滤后的负例候选者中,选择 top-k 作为难负例。

在最初的 NV-Retriever 实验中,使用以下配置取得了最佳性能:

  • 教师模型 = Mistral
  • 挖掘方法 = TopK-PercPos,边距 = 0.95

3. 韩语金融领域实验

阅读 NV-Retriever 后,我们应用了类似的方法来构建韩语金融文本嵌入数据集,以验证正例感知方法是否具有通用性。以下是我们的过程概述:

3.1 教师模型与基础模型

  • 教师模型候选者

    • BM25 (Okapi)
      - 尽管它在原始 NV-Retriever 中表现不佳,但我们想看看这种基于关键词的方法在高度依赖金融关键词的领域中是否会表现更好。
    • bge-m3 (BAAI/bge-m3):多语言嵌入模型(5.68 亿参数)
    • KURE-v1 (nlpai-lab/KURE-v1):bge-m3 的韩语微调版本
  • 基础模型候选者(用于最终微调)

3.2 数据

我们使用了两种主要的数据类型:

  1. 问答数据集
    - BCCard/BCCard-Finance-Kor-QnA
    - (查询 - 回答) 对作为正例

  2. 非问答数据集
    - Naver 金融新闻抓取(2024 年)
    - (标题 - 段落) 对作为正例

注意:文本内容全部为韩语。例如:

(Korean)
Query : "미성년 자녀에게 증여한 재산이 상속세에 포함되나요?"
Answer : "미성년 자녀에게 증여한 재산은 상속세 계산 시 포함될 수 있습니다. ... "
(English)
Query : “Is property given to minor children included in the estate tax?”
Answer : “Property given to minor children can be included in the calculation of inheritance tax. ... ”

3.3 难负例挖掘

  • 挖掘方法 = TopK-PercPos,percentage_margin = 0.95
  • 每个查询最多可以检索 4 个难负例。

下面是使用 BM25 进行演示的部分代码片段(包含韩语变量命名)

def mine_hard_negatives(data, bm25, max_neg=4):
    results = []
    for index, row in tqdm(data.iterrows(), total=len(data)):
        query = row['Query']
        positive_answer = row['Answer']
        
        # BM25 scores
        scores = bm25.get_scores(tokenizing(query))  # tokenizing is user-defined
        normalized_scores = normalize_scores(scores)
        
        pos_score = normalized_scores[index]  # This is the positive
        max_neg_score_threshold = pos_score * 0.95
        
        negative_candidates = [
            (i, normalized_scores[i]) 
            for i in range(len(scores)) 
            if normalized_scores[i] <= max_neg_score_threshold and i != index
        ]
        negative_candidates.sort(key=lambda x: x[1], reverse=True)
        hard_negatives = negative_candidates[:max_neg]
        
        for neg in hard_negatives:
            results.append({
                'Query': query,
                'Positive Answer': positive_answer,
                'Hard Negative': data.iloc[neg[0]]['Answer'],
                'Positive Score': pos_score,
                'Negative Score': neg[1]
            })
    return pd.DataFrame(results)

3.4 结果与观察

对于问答集(例如,BCCard 问答)

  • BM25 在 minmax 缩放后经常产生极端的 0 或 1 相似度分数。如果( ext{pos_score} approx 1)或( approx 0),则难负例采样变得有些无意义。
  • bge-m3KURE-v1 产生了更稳定的相似度分布,因此难负例的挖掘更具现实意义。

对于非问答新闻数据集

  • 总体而言,正例相似度分数较低。文本可能相当长,并且主题更加多样(例如,一篇文章中包含多个主题)。
  • 区分假负例和真正的负例更困难。
    • 示例:两个不同的新闻段落都可能提到“纽交所混合走势”加上完全不同的内容——它们应该是负例还是语义重叠?

结论:我们发现基于嵌入的教师模型(bge-m3,KURE-v1)在难负例筛选方面优于 BM25。然而,数据领域和主题越多样,定义“真正负例”对就越复杂。仔细的数据整理显式类型/元数据标注有助于减少假负例。


4. 总结

  1. 对比学习在精心选择的负例上表现出色。随机负例采样可能会限制模型的潜力。
  2. NV-Retriever 通过设置相对于正例的负例相似度上限,解决了朴素负例挖掘的不足。
  3. 在韩语金融领域,我们测试了 BM25 与基于嵌入的教师模型。BM25 经常给出极端的相似度值,从而削弱了难负例的选择。bge-m3KURE-v1 产生了更稳定的分布。
  4. 基于新闻的非问答集引入了更多复杂性,强调了数据“类型标签”对于避免过多假负例的重要性。

尽管存在这些挑战,NV-Retriever 的“正例感知阈值”方法证明是对旧的“top-k”方法的显著改进。我们仍然坚信,持续改进负例采样将进一步提高嵌入质量。


参考文献

[1]: SimCSE: 简单对比学习句子嵌入 ( https://arxiv.org/abs/2104.08821 )
[2]: 通过超球面上的对齐和均匀性理解对比表示学习 ( https://arxiv.org/abs/2005.10242 )
[3]: 用于学习自然语言推理的大规模标注语料库 ( https://arxiv.org/abs/1508.05326 )
[4]: DPR ( https://arxiv.org/abs/2004.04906 )
[5]: ANCE ( https://arxiv.org/abs/2007.00808 )
[6]: RocketQA ( https://arxiv.org/abs/2010.08191 )
[7]: NV-Retriever ( https://arxiv.org/abs/2407.15831 )


感谢阅读!如果您对韩语文本嵌入的难负例挖掘,特别是在金融等专业领域有疑问或见解,请随时发表评论或分享您的经验。

NMIXX-Financial-NLP-Lab 是一个由 ModuLabs 支持的开源金融自然语言处理研究实验室。该实验室致力于未来在金融自然语言处理领域进行广泛研究。请访问并支持我们的工作:https://huggingface.co/nmixx-fin/https://github.com/nmixx-fin

引用

@misc{hwang2025nvretriever,
  author       = {Yewon Hwang and Hanwool Lee},
  title        = {Exploring Hard Negative Mining with NV-Retriever in Korean Financial Text},
  year         = {2025},
  url          = {https://huggingface.co/blog/Albertmade/nvretriever-into-financial-text},
  note         = {Hugging Face Blog Post}
}

社区

注册登录 以评论