최근 언어모델 기반 평가지표 bert_score

bert_score

개발 주체

BERT는 구글에서 개발한 언어 모델로, 문맥을 양방향으로 이해하는 능력을 가지고 있으며, 이 모델의 특성을 활용하여 텍스트 생성 품질을 평가하는 점수(Score)를 계산하는 방식이라는 의미를 담고 있습니다.


개발 목적

기존의 n-gram 기반 평가 지표(BLEU, ROUGE 등)의 한계를 극복하기 위해 개발. 이전 지표들은 단어의 표면적 일치에 초점을 맞추어 의미적 유사성 파악 부족. BERTScore는 문맥화된 임베딩을 활용하여 의미적 유사성을 더 정확하게 측정하기 위해


핵심 개념 : "의미적 유사성"

문맥화된 임베딩을 활용하여 의미적 유사성을 더 정확하게 측정


한계

  • 계산 복잡성: BLEU나 ROUGE보다 계산 비용이 큼
  • 모델 의존성: 사용하는 사전학습 모델에 따라 결과가 달라질 수 있어 일관된 비교가 어려움
  • 도메인 특수성: 특정 도메인에 특화된 텍스트를 평가 어려움


발전

  • 다양한 사전학습 모델과의 통합: RoBERTa, DeBERTa, XLM-RoBERTa 등
  • 세분화된 평가: 문장 단위뿐만 아니라 문서 단위, 문단 단위로 확장
  • 다국어 지원: 영어 중심에서 다양한 언어로
  • 특수 도메인 적응: 의학, 법률 등 특수 도메인 맞춤


주요 평가지표

METEOR (Metric for Evaluation of Translation with Explicit ORdering)

강점:

  • 동의어/어간 매칭: 형태소 분석과 WordNet 기반 동의어 사전을 활용해 의미적 유사성 평가 가능
  • 패널티 시스템: 단어 삽입/삭제 오류에 가중치 차등 적용
  • BLEU 대비 개선: recall 고려와 n-gram 유연성으로 인간 평가와 0.96 상관관계 달성

한계:

  • 언어 의존성: WordNet 없는 언어에 적용 시 정확도 저하
  • 계산 복잡도: BLEU 대비 2~3배 긴 처리 시간


GLUE/SuperGLUE (General Language Understanding Evaluation)

강점:

  • 11개 NLU 태스크 통합: CoLA(문법 검증), MNLI(추론) 등 다양한 과제 평가
  • 인간 기준점 제공: 2019년 BERT 모델이 인간 성능 초과

한계:

  • 생성 능력 미반영: 텍스트 이해 중심 평가로 생성 품질 측정 불가
  • 데이터 유출 문제: 대규모 사전학습 모델에서 테스트 데이터 노출 가능성


KLUE:

강점

  • 포괄적인 평가: KLUE는 8개의 다양한 한국어 자연어 이해 태스크를 포함하여 종합적인 평가가 가능.
  • 한국어 특화: 세계에서 13번째로 많이 사용되는 한국어에 특화된 벤치마크로, 한국어 NLP 발전에 크게 기여.
  • 윤리적 고려: 데이터 구축 시 저작권, 개인정보 보호, 사회적 편견 등을 고려.
  • 오픈 소스: 누구나 자유롭게 사용할 수 있어 한국어 NLP 연구 발전을 촉진.
  • 다양한 평가 지표: 각 태스크에 적합한 평가 지표를 제공.

한계

  • 제한된 도메인: 외국어나 일부 특수한 도메인(예: 금융)에 대한 평가는 제한적.


실습

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from bert_score import score
from transformers import AutoTokenizer, AutoModel
import nltk
from nltk.translate.bleu_score import sentence_bleu
from nltk.translate.meteor_score import meteor_score
import nltk.data
nltk.download('wordnet')
nltk.download('punkt_tab')
nltk.download('omw-1.4')
# 데이터 예시 생성
references = [
    "이 영화는 매우 재미있고 감동적이었습니다.",
    "서울은 한국의 수도이며 많은 관광 명소가 있습니다.",
    "인공지능 기술은 빠르게 발전하고 있습니다.",
    "건강을 위해 규칙적인 운동과 균형 잡힌 식단이 중요합니다.",
    "환경 보호를 위해 재활용을 실천해야 합니다."
]

candidates = [
    "이 영화는 정말 재미있었고 감동적인 내용이었습니다.",  # 유사한 문장
    "대한민국의 수도 서울에는 관광 명소가 많이 있습니다.",  # 유사한 문장, 단어 순서 변경
    "머신러닝과 딥러닝은 최근 급속도로 발전하고 있는 분야입니다.",  # 의미는 유사하지만 다른 단어 사용
    "건강한 생활을 위해서는 운동과 식이 요법이 중요합니다.",  # 유사한 의미, 다른 표현
    "환경을 보존하기 위한 노력이 필요합니다."  # 관련은 있지만 덜 유사한 문장


# BERTScore 계산 함수
def calculate_bertscore(refs, cands, model_type="bert-base-multilingual-cased", lang="ko"):
    """
    BERTScore를 계산하는 함수

    Parameters:
        refs (list): 참조 문장 리스트
        cands (list): 생성된 문장 리스트
        model_type (str): 사용할 BERT 모델의 종류
        lang (str): 언어 코드

    Returns:
        pandas.DataFrame: 각 문장 쌍의 BERTScore (Precision, Recall, F1)
    """
    # BERTScore 계산
    P, R, F1 = score(cands, refs, lang=lang, model_type=model_type, verbose=True)

    # 결과를 DataFrame으로 변환
    results = pd.DataFrame({
        'Reference': refs,
        'Candidate': cands,
        'Precision': P.numpy(),
        'Recall': R.numpy(),
        'F1': F1.numpy()
    })

    # 평균 점수 계산
    avg_scores = {
        'Average Precision': P.mean().item(),
        'Average Recall': R.mean().item(),
        'Average F1': F1.mean().item()
    }

    return results, avg_scores


# BERTScore 계산
bertscore_results, bertscore_avg = calculate_bertscore(references, candidates)

# 비교를 위한 다른 평가 지표 계산
bleu_scores = calculate_bleu(references, candidates)
meteor_scores = calculate_meteor(references, candidates)

# 결과 출력
print("\n=== BERTScore 결과 ===")
print(bertscore_results)
print("\n=== 평균 BERTScore ===")
for k, v in bertscore_avg.items():
    print(f"{k}: {v:.4f}")

print("\n=== 다른 평가 지표와 비교 ===")
comparison_df = pd.DataFrame({
    'Reference': references,
    'Candidate': candidates,
    'BERTScore (F1)': bertscore_results['F1'],
    'BLEU': bleu_scores,
    'METEOR': meteor_scores
})
print(comparison_df)

Precision Recall F1 0 0.903969 0.931825 0.917686 1 0.904147 0.886206 0.895087 2 0.799675 0.814007 0.806777 3 0.865194 0.840638 0.852739 4 0.819508 0.819538 0.819523


댓글 쓰기

다음 이전