본문 바로가기

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

패스트캠퍼스 환급챌린지 22일차 : 파인튜닝 강의 후기

by Sungwook Choi 2025. 4. 22.

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

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

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

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

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

 

 

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

파인튜닝과 평가에는 다음과 같은 과정을 거침

  • 각 문서에 대해서 질문 2개씩 생성
  • 센텐스 트랜스포머 학습 형식으로 변환
    • 유사 문장 쌍
    • (질의어, 응답) 쌍
    • (번역하고자 하는 언어, 번역된 언어) 쌍
  • 학습시킬 때 losses.MultipleNegativesRankingLoss(model) 로 학습
  • 작동원리
    • 입력데이터 : 검색어 (질문) + Positive 문서 (응답) + 배치 내 다른 문서 (네거티브)
    • 각 입력데이터별 코사인 유사도를 구해서 손실함수를 자동으로 구함
  • 예시
# 6. 모델 및 손실 함수 설정
model_id = "BAAI/bge-m3"
model = SentenceTransformer(model_id)

# 손실 함수 정의: 모델이 검색어와 포지티브 문서는 가깝게, 네거티브 문서는 멀게 학습하도록 유도
loss = losses.MultipleNegativesRankingLoss(model)

평가를 위해서 테스트 데이터를 특정 형식으로 변환
from sentence_transformers.evaluation import InformationRetrievalEvaluator

# 7. 검증 데이터 평가기 설정
# 검증 데이터셋 구성
val_dataset = {
    'queries': {},
    'corpus': {},
    'relevant_docs': {}
}

# 문서 ID를 먼저 생성
doc_ids = {}
for i, doc in enumerate(val_corpus):
    doc_id = f"d{i}"
    val_dataset['corpus'][doc_id] = doc
    doc_ids[doc] = doc_id

# 질문에 ID 부여하고 관련 문서 설정
for i, (query, doc) in enumerate(zip(val_queries, val_positive_docs)):
    query_id = f"q{i}"
    val_dataset['queries'][query_id] = query

    # 이 질문이 어떤 문서에서 왔는지 찾기
    doc_id = doc_ids[doc]

    # 관련 문서 설정
    if query_id not in val_dataset['relevant_docs']:
        val_dataset['relevant_docs'][query_id] = set()
    val_dataset['relevant_docs'][query_id].add(doc_id)

# 검증 데이터셋 설정: 평가를 위한 쿼리, 문서, 정답 문서 목록
dataset = val_dataset

# 검증 데이터셋에서 코퍼스(전체 문서), 쿼리, 그리고 각 쿼리와 관련된 문서 가져오기
corpus = dataset['corpus']  # 검색 대상 문서
queries = dataset['queries']  # 검색어(쿼리)
relevant_docs = dataset['relevant_docs']  # 각 쿼리와 관련된 문서 (포지티브)

# Information Retrieval 평가 도구 설정: 쿼리-문서 검색 성능 평가
evaluator = InformationRetrievalEvaluator(queries, corpus, relevant_docs)

실제 학습

# 7. 모델 학습
EPOCHS = 2

# W&B(WandB, Weights and Biases) 로깅 비활성화
# W&B는 학습 과정을 실시간으로 추적하고 시각화할 수 있는 도구입니다.
# 하지만 이 코드는 W&B 기능을 사용하지 않으므로, 이를 비활성화하여 로깅을 중단합니다.
os.environ["WANDB_DISABLED"] = "true"

# 학습 초기에 학습률을 점진적으로 증가시키는 단계 수 설정
# 전체 학습 단계의 10%를 워밍업으로 사용
warmup_steps = int(len(loader) * EPOCHS * 0.1)

# 모델 학습
model.fit(
    train_objectives=[(loader, loss)],  # 학습 데이터 로더와 손실 함수 설정
    epochs=EPOCHS,  # 총 에포크 수
    warmup_steps=warmup_steps,  # 워밍업 단계
    output_path='exp_finetune',  # 학습된 모델 저장 경로
    show_progress_bar=True,  # 학습 진행률 표시 여부
    evaluator=evaluator,  # 학습 중간에 평가를 수행할 도구
    evaluation_steps=50,  # 50단계마다 평가 수행
)

url : https://abit.ly/lisbva

댓글