본문 바로가기

스타트업 투자/데이터 + 테크

패스트캠퍼스 환급챌린지 20일차 : 임베딩 모델 파인튜닝 학습이해

by Sungwook Choi 2025. 4. 20.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

*_1. 학습 인증샷 4장 이상 포함
*_① 오늘자 날짜, 공부 시작 시각 포함 사진 1장

② 오늘자 날짜, 공부 종료 시각 포함 사진 1장

③ 1개 클립 수강 인증 사진 (강의장 목록 캡쳐, 강의 내용이 담긴 수강화면이 보이지 않도록) 1장

④ 학습 인증샷 1장 이상 (ex. 필기 촬영, 작업물, 등)

 

 

2. 학습 후기 700자 이상 (공백 제외)

MultipleNegativesRankingLoss를 활용한 임베딩 파인 튜닝에 대한 상세 설명

  • MultipleNegativesRankingLoss는 문장 임베딩 모델을 파인 튜닝하는 데 매우 효과적인 손실 함수

포지티브 샘플과 네거티브 샘플

  • 포지티브 샘플(Positive Sample): 의미적으로 관련이 있는 문장 쌍을 의미
    • 예: (질문: "서울의 인구는?", 답변: "서울의 인구는 약 970만 명입니다.")
  • 네거티브 샘플(Negative Sample): 의미적으로 관련이 없거나 관련성이 낮은 문장 쌍을 의미
    • 예: (질문: "서울의 인구는?", 답변: "파리는 프랑스의 수도입니다.")

임베딩 학습의 기본 원리

  • 임베딩 학습의 핵심 목표는 의미적으로 유사한 텍스트는 임베딩 공간에서 가깝게, 의미적으로 다른 텍스트는 멀게 위치시키는 것
    • 이를 위해 일반적인 임베딩 학습 방법은 다음과 같은 프로세스를 따름
  1. 포지티브 샘플과 네거티브 샘플 준비: 학습 데이터로 포지티브 샘플(관련 있는 쌍)과 네거티브 샘플(관련 없는 쌍)을 모두 준비
  2. 대조 학습(Contrastive Learning): 모델이 포지티브 샘플 쌍의 임베딩 간 거리는 가깝게, 네거티브 샘플 쌍의 임베딩 간 거리는 멀게 학습
  3. 손실 함수 최적화: 임베딩 간 유사도(보통 코사인 유사도)를 계산하고, 포지티브 쌍의 유사도는 높이고 네거티브 쌍의 유사도는 낮추는 방향으로 손실 함수를 최적화

전통적인 임베딩 학습 데이터셋 구성

  • 전통적인 대조 학습에서는 하나의 앵커(anchor)에 대해 하나의 포지티브와 여러 네거티브 샘플을 명시적으로 준비해야 했음
    • 다음과 같은 방식으로 데이터셋을 구성해야 함
  1. 트리플렛(Triplet) 구성: 각 학습 데이터는 (앵커, 포지티브, 네거티브) 형태의 트리플렛으로 구성
  2. # 전통적인 트리플렛 구성 예시 triplets = [ # (앵커, 포지티브, 네거티브) ("강아지를 기르는 방법", "반려견 양육 가이드", "고양이 사료 추천"), ("파이썬 코딩 튜토리얼", "파이썬 프로그래밍 기초", "자바스크립트 입문 강의"), # ... 수천, 수만 개의 트리플렛 필요 ]
  3. 다중 네거티브 사례: 효과적인 학습을 위해 하나의 앵커당 여러 개의 네거티브 샘플이 필요
  4. # 다중 네거티브 샘플 구성 예시 training_data = [ { "anchor": "머신러닝이란?", "positive": "기계학습은 데이터로부터 패턴을 찾는 AI 기술입니다.", "negatives": [ "오늘 날씨가 좋네요.", "내일 회의는 2시에 시작합니다.", "이 식당의 불고기가 맛있습니다.", # ... 여러 개의 네거티브 샘플 ] }, # ... 수천 개의 이런 구조 ]
  5. 데이터 준비의 어려움:
    • 각 앵커에 대한 관련 없는 문장들을 수집해야 함
    • 적절한 난이도의 네거티브 샘플을 선택해야 함 (너무 쉽거나 어려우면 학습 효과 감소)
    • 데이터셋 크기가 기하급수적으로 증가 (앵커 × 네거티브 수)
    • 대규모 말뭉치에서 효과적인 네거티브 샘플링 전략 필요
      • 이러한 방식은 데이터 준비 과정이 복잡하고 시간이 많이 소요되는 단점
      • 양질의 네거티브 샘플을 구성하는 것은 종종 전체 학습 프로세스에서 가장 어려운 부분

MultipleNegativesRankingLoss: 배치 내 네거티브 샘플링

  • 여기서 MultipleNegativesRankingLoss의 혁신적인 접근 방식이 등장
  • 기존 방식과 달리, 이 손실 함수는 명시적인 네거티브 샘플을 별도로 준비할 필요가 없다는 큰 장점
  • 대신, 현재 배치 내의 다른 샘플들을 자동으로 네거티브로 활용함
  • 이는 데이터 준비 과정을 크게 단순화하고, 학습 효율성을 높이는 핵심 요소
  • 사용자는 포지티브 샘플만 제공하면 되며, 네거티브 샘플은 배치 내에서 자동으로 생성

예를 들어, 배치 크기가 4인 경우:

배치 = [
    (질문1, 답변1),  # 쌍 1
    (질문2, 답변2),  # 쌍 2
    (질문3, 답변3),  # 쌍 3
    (질문4, 답변4)   # 쌍 4
]

질문1에 대해:

  • 답변1은 포지티브 샘플
  • 답변2, 답변3, 답변4는 네거티브 샘플로 취급됨

마찬가지로 질문2에 대해:

  • 답변2는 포지티브 샘플
  • 답변1, 답변3, 답변4는 네거티브 샘플

MultipleNegativesRankingLoss의 실제 작동 예시

다음과 같은 문장 쌍이 있다고 가정

[
    ("AI란 무엇인가?", "AI는 인간의 지능을 모방한 기술입니다."),
    ("딥러닝이란?", "신경망을 여러 층 쌓아 데이터로부터 학습하는 기계학습 방법입니다."),
    ("Python은 어디에 쓰이나요?", "Python은 데이터 분석, 웹 개발, AI 등에 널리 사용됩니다."),
    ("자연어 처리란?", "컴퓨터가 인간의 언어를 이해하고 처리하는 AI의 한 분야입니다.")
]

배치 크기가 4일 때, "AI란 무엇인가?"라는 질문(앵커)에 대해:

  1. 포지티브 샘플: "AI는 인간의 지능을 모방한 기술입니다."
  2. 네거티브 샘플:
    • "신경망을 여러 층 쌓아 데이터로부터 학습하는 기계학습 방법입니다."
    • "Python은 데이터 분석, 웹 개발, AI 등에 널리 사용됩니다."
    • "컴퓨터가 인간의 언어를 이해하고 처리하는 AI의 한 분야입니다."

배치 크기의 중요성

배치 크기가 클수록 더 많은 네거티브 샘플이 생성되므로 모델의 성능이 향상될 수 있음

  • 배치 크기가 4인 경우: 각 질문에 대해 3개의 네거티브 샘플
  • 배치 크기가 32인 경우: 각 질문에 대해 31개의 네거티브 샘플
  • 배치 크기가 128인 경우: 각 질문에 대해 127개의 네거티브 샘플

하드 네거티브 샘플링

기본적인 배치 내 네거티브 샘플링만으로도 좋은 성능을 얻을 수 있지만, 더 어려운 네거티브 샘플을 추가하면 성능을 더욱 향상시킬 수 있음

하드 네거티브의 이해

  • 하드 네거티브는 명시적으로 사용자가 직접 선택하여 학습 데이터에 포함시키는 네거티브 샘플을
  • 일반적인 MultipleNegativesRankingLoss의 배치 내 네거티브 샘플링이 자동으로 선택되는 "이지 네거티브(easy negative)"인 반면, 하드 네거티브는 사용자가 의도적으로 선별하는 샘플

하드 네거티브 구현 방법

공식 문서에 따르면, MultipleNegativesRankingLoss에서 하드 네거티브는 다음과 같은 형태로 데이터를 구조화하여 제공:

# 하드 네거티브 예제
train_examples = [
    # (앵커, 포지티브, 하드 네거티브) 형태로 제공
    InputExample(texts=["AI란 무엇인가?", "AI는 인간의 지능을 모방한 기술입니다.", "AI는 로봇과 같은 물리적 형태를 가진 기계입니다."]),
    InputExample(texts=["딥러닝이란?", "신경망을 여러 층 쌓아 데이터로부터 학습하는 기계학습 방법입니다.", "컴퓨터가 스스로 생각하는 방법입니다."])
]

이 방식에서는:

  • InputExample의 첫 번째 항목은 앵커(질문)입니다.
  • 두 번째 항목은 포지티브 샘플(관련 있는 응답)입니다.
  • 세 번째 이후 항목들은 하드 네거티브(관련 없지만 구분하기 어려운 응답)입니다.
  • 손실 함수는 쌍 (a_i, p_i)에 대해 모든 p_j(j != i)와 모든 n_j를 네거티브로 사용
  • 즉, 각 앵커는 자신의 포지티브와 유사도가 높아지도록 학습되고, 다른 앵커의 포지티브와 모든 하드 네거티브와는 유사도가 낮아지도록 학습

하드 네거티브 vs 일반 네거티브

일반 네거티브(배치 내 무작위 네거티브):

  • 자동으로 배치 내에서 생성됨
  • 대부분 주제가 완전히 다른 무관한 문장들
  • 모델이 구분하기 상대적으로 쉬움

하드 네거티브(명시적 네거티브):

  • 사용자가 직접, 의도적으로 선택함
  • 포지티브와 주제는 유사하나 정확한 답변이 아님
  • 미묘한 의미 차이를 포함하여 모델에게 더 큰 도전이 됨

예시:

  • 질문: "당뇨병의 증상은 무엇인가요?"
  • 포지티브: "당뇨병의 주요 증상으로는 갈증 증가, 빈뇨, 체중 감소 등이 있습니다."
  • 하드 네거티브(명시적): "저혈당의 증상으로는 현기증, 발한, 불안감 등이 있습니다." (의료 관련 주제이지만 당뇨병이 아닌 저혈당에 관한 내용)
  • 일반 네거티브(암시적): "파이썬은 객체지향 프로그래밍 언어입니다." (완전히 다른 주제)
  • 하드 네거티브 샘플을 사용하면 모델이 더 미묘한 의미 차이를 학습하게 되어 정확도가 크게 향상될 수 있음
  • 그러나 이러한 하드 네거티브를 구성하려면 도메인 지식과 추가 작업이 필요

url : https://abit.ly/lisbva

댓글