SJ_Koding

[LLM] Text Embedding모델 파인튜닝을 위한 Hard Negative Mining 방법론 핵심 정리 본문

LLM

[LLM] Text Embedding모델 파인튜닝을 위한 Hard Negative Mining 방법론 핵심 정리

성지코딩 2025. 4. 7. 16:50

마지막 포스팅 이후 어느덧 5개월의 시간이 흘렀는데, 사실 이 사이에 회사 이직과 적응을 하느랴 블로그를 신경쓰지 못했습니다.

기존에는 LLM 챗봇 구축을 위한 서비스를 개발했다면, 현재는 RAG성능을 극대화 할 수 있는 Backbone모델의 성능을 높이는 업무를 담당하고있습니다.

정확한 업무는 말할 수 없으나, 다행스럽게도 특정 도메인에서 동료와 함께 기존 foundation모델 보다 좋은 성능을 달성할 수 있었고, 지금은 이보다 더 높은 성능을 달성하기 위해 다양한 기법을 적용하며 실험하고있습니다.

개인 공부 겸 hard negative mining을 간단히 정리합니다. 


gpt-4o image generator사용 이미지, 지브리 풍으로 만들까 하다가 너무 흔해져서 철회함

Hard Negative란?

Text Embedding모델을 파인튜닝 할 때, MLM(Masked Language Modeling), NLI(Natural Language Inferencing), 그리고 가장 많이 쓰이는 contrastive learning을 사용한다.

contrastive learning을 진행할 때 가장 중요한 것이 데이터셋인데, query - positive - negative 쌍으로 구성되어있다. 이때 주로 negative의 데이터가 없어서 곤란을 겪는다. 따라서 negative를 기존 데이터로부터 발굴한다라는 뜻으로 negative mining이라는 기법이 제시되었다.

여러 개의 query-positive쌍이 있을 때, negative가 없다면, 다른 query의 positive를 negative로 사용할 수 있다. 이 때 무작정 랜덤 샘플링으로 negative를 샘플링하게 되면 아래와 같은 문제가 생긴다.

1. False-negative문제
- 다른 query의 positive가 현재 query의 positive로도 성립하는 경우. 즉, negative데이터로 매핑됐지만 실제로는 positive내용인 경우를 의미)

2. Soft-negative문제
- 랜덤 샘플링으로 만들어진 negative데이터가 너무 쉬워서 헷갈리는 문장에 대해 잘 학습하지 못하는 경우.
예를 들어, "대한민국의 수도는 서울이다"-"오늘 날씨는 비가 많이 쏟아졌다" 처럼 negative가 명확한 경우를 soft-negative(딱히 구분짓지는 않고 그냥 negative라고 표현할 때가 많음)라고 하며 반대로 "대한민국의 수도는 서울이다"-"서울은 대한민국에서 가장 큰 도시 중 하나다" 처럼 유사해 보이지만, "수도"라는 핵심 정보가 다른 것 처럼 실제로는 같은 의미가 아닌 데이터를 hard-negative라고 한다.

hard negative가 거의 필수시 되는게, 유사하지만 의미가 다른 문장임을 명확히 구분해야할 필요가 있어서 Text Embedding모델에서 Sentence Similiarity 테스크를 다룰 경우, hard negative mining이 대체로 필수적이다. 이는 랜덤 샘플링이 아닌 특정 기준과 필터링을 통해 걸러진 유의미하고 품질이 높은 negative를 만드는 것에 목적이 있다.


Naive한 Hard Negative Mining

가장 기초적으로 마이닝 하는 방법은 임베딩 벡터간의 유사도 혹은 통계 기반(BM25등)으로 유사한 문장으로 hard negative를 찾는 방법이다. 임베딩 벡터간의 유사도를 기반으로 하는 마이닝 기법은 아래 단계로 이루어진다:

1. 기존 foundation모델 (ko-sroberta, bge-m3 등등 목적에 맞게)이나 외부 API(upstage, openAI)를 사용하여 VectorDB를 구축
2. 데이터셋을 순회하며, query와 유사한 문장 k개 추출
3. 추출된 문장들을 negative로 설정

정말 단순하지만 아래와 같은 문제점이 발생한다.

1. False-negative문제
이 문제는 사실 완벽히 해결하는게 어렵다. 어느 곳에서나 발생할 수 있는 문제인데 위 방법론에서 특히나 많이 발생한다. 유사도를 기준으로 negative를 추출하기 때문에, 문장은 유사하나 의미가 다른 문장을 구분짓기 어렵다. foundation 모델이나 외부 API모델이라고 한들, 모든 경우의 false-negative를 완벽히 필터링 할 수 없다. 그냥 문장이 유사하면 유사도가 높을 가능성이 있다.

2. 학습이 너무 어려워요ㅠㅠ
랜덤 샘플링 기법과 반대로, 모든 negative데이터셋이 'hard'하다 보니, 모델 입장에서 positive와 negative를 명확히 구분짓는데 어려움을 겪어 underfitting현상이 발생할 수 있다.


고도화된 Hard Negative Mining

사실 아래 두 가지 논문을 보면 자주 쓰이는 hard negative mining을 이해할 수 있다. 이를 아주 간단히 요약한건데, 아래 아이디어들을 결합하여 개인만의 마이닝 방식을 설계해보자! 관련 논문은 [n]으로 표기하였으며, 특히 [1]의 논문(NV-Retriever)에서 기존 mining기법을 모두 인용하여 흐름을 파악하기 매우 좋은 논문.

[1] 2024 NVIDIA 발표, NV-Retriever: Improving text embedding models with effective hard-negative mining
[2] 2024 CMTEB 1위 달성모델, Conan-embedding: General Text Embedding with More and Better Negative Samples

* Query-Positive Similarity : pos_score = $S_{pos}$
* Query-Negative Similarity : pos_score = $S_{neg}$
* Posistive-Negative Similarity : pos_score = $S_{pn}$

  1. Hybrid mining (BM25 + embedding model)
    1. BM25로 Top-30개의 청크 추출
    2. 추출된 top-30에서 top-10을 embedding similarity로 추출.
  2. Top-K with absolute threshold [1]
    1. $S_neg$가 유사도가 threshold를 넘으면 후보군에서 제외
    2. 쿼리와 유사도가 높으면 false negative일 경우가 있으므로.
  3. Top-K shifted by N [1]
    1. N이 5이면 top-1 부터 top-5까지 drop.
    2. false negative 방지
  4. TopK-MarginPos negatives filter [1]
    1. $S_{neg} > S_{pos}$ 즉, negative가 query와 더 가깝다고 판단되면 후보군에서 제외 
    2. 상수 margin 주어 필터정도 조절 가능 ($S_{neg} > S_{pos} + \sigma$)
    3. overlap청크, positive와 너무 유사한 negative방지(false-negative 위험)
  5. TopK-PercPos negatives filter [1]
    1. 4번 방법에서, $S_{pos}$에 margin_rate($\sigma_{rate}$)를 주어 S_{neg} > S_{pos}*$\sigma_{rate}$ 일 경우 후보군에서 제외
    2. $\sigma_{rate}$ > 1 일 경우 조금 더 후한 필터링, $\sigma_{rate}$ < 1일 경우 하드 필터링(더 많이 걸러진다는 뜻)
  6. Jaccard 유사도(토큰 겹침정도(like비교)) 필터링[1]
    1. $S_{pos}$와 $S_{neg}$ 간의 Jaccard Similarity 계산
      1. Jaccard Similarity: $J(A,B) = \frac{|A \cap B|}{|A \cup B|}$
      2. ' ' 공백 단위로 split하여 단어들의 Set으로 구성하면 구현이 매우 쉬움
    2. 4-2번과 마찬가지로 overlap청크 방지
    3. 논문에서는 0.3을 기준으로 잡음
  7. LLM사용하여 false negative필터링 [1]
    1. LLM에 청크를 하나씩 제공하여 query의 negative인지 판단을 맡김.
  8. Dynamic Hard Negative Mining(DHNM) [2]
    1. 기존 HNM은 전처리 단계에서만 수행되어 모델이 학습되는 동안 negative sample의 난이도가 변하는 것을 고려하지 못함
    2. DHNM은 학습 과정에서 반복적으로 hard Negative를 마이닝하여 모델이 변화하는 학습데이터에 동적으로 적응하도록 함
    3. 각 데이터 포인트에 대해 query에 대한 hard negative의 평균 score를 기록하고, 일정 iteration마다 score가 아래의 조건을 만족하는 경우 더 이상 어렵지 않은 데이터라고 판단하여, 새로운 hard negative mining을 진행
      1. 초기 score의 1.15배 미만일 경우
      2. 절대값이 0.8 미만일 경우
      3. 위 수치는 하이퍼파라메터임. 조절가능
      4. conan-embedding은 아래 그림처럼 쉬워진 데이터는 더 이상 학습하지 않고, 새로 어려운 데이터를 새롭게 마이닝 함으로써 다양한 negative데이터와 다양한 hard난이도 데이터를 볼 수 있다.
      5. 이렇게 되면 이미 negative로 학습된 데이터를 다시 학습하지 않는 다는 것이 되어서 효율적인 학습이 가능하다고도 볼 수 있다. 즉, 시험 직전 수학공부를 할 때, 챕터1의 1번문제를 보면 (일명 처음병) 너무 많이 본 문제이기 때문에 굳이 다시 공부할 필요가 없는 것 처럼, 이미 학습된 데이터는 다시 보지 않게된다. 매력적인 방법. 

Re-HNM을 진행할 때, 평균적인 negative셋의 스코어를 시각화함. 100step단위로 검증하여 조건을 만족하면 다시 HNM을 진행. 데이터에 따라 Re-HNM조건 튜닝 필수.

9. GISTEmbedLoss

갑자기 Loss가 나왔는데, Hard Negative가 잘 진행되어 있다한들, InfoNCE기반의 Loss(MultipleNegativeRankingLoss등)는 다른 쿼리의 negative후보군들을 모두 negative데이터로 가짐으로써 따라오는 false-negative현상을 해결할 수 없다.

따라서 해당 Loss는 Guide model을 활용하여 필터링 조건을 train time에서 배치단위로 진행하면서, 다른 query의 negative를 효과적으로 필터링 할 수 있는 Loss여서 기입하였다.

GISTEmbed: Guided In-sample Selection of Training Negatives for Text Embedding Fine-tuning의 Figure 1

 


본인은 위의 mining기법들을 적절히 커스터마이징 하여 성능을 향상시킬 수 있었다. 다양하게 조합하고 비교실험을 진행하여 새로운 마이닝 기법도 도출해보자!

잘못된 정보, 보충사항, 조언사항 댓글로 언제든 남겨주세요! 공부하겠습니다.