logo

BLEU

참조 답안과 생성문 비교

참조 기반 자동 평가: 생성문과 사람이 작성한 참조 답안 비교

  • 활용: 번역, 요약 등 참조 답안을 준비할 수 있는 과업
  • 장점: 빠르고 반복 가능한 대규모 평가
  • 한계: 정답 표현이 여러 가지인 개방형 생성에서는 실제 품질을 충분히 설명하지 못함

BLEU

BLEU(Bilingual Evaluation Understudy): 생성문과 참조문의 n-gram 겹침을 측정하는 지표

  • 수정 n-gram 정밀도: 생성문과 참조문이 공유하는 n-gram의 비율
  • 짧음 벌점: 지나치게 짧은 생성문의 점수 감소
  • 로그 BLEU: 0에 가까울수록 높은 점수이며, 0은 BLEU 1에 해당

수정 n-gram 정밀도

같은 단어를 반복해 점수를 부풀리지 못하도록 참조문의 등장 횟수까지만 인정한다.

  • 생성문: the the the the the the
  • 참조문: the cat is on the mat
  • 단순 1-gram 정밀도:
  • 수정 1-gram 정밀도: 참조문에 나타난 the의 빈도인 2회까지만 인정하여

1-gram은 어순을 무시한다. BLEU는 여러 n-gram 길이를 함께 사용해 이 한계를 줄인다.

짧음 벌점

짧은 생성문은 정밀도의 분모가 작아 점수가 부풀 수 있다.

  • : 참조 문장의 길이
  • : 생성 문장의 길이
  • 참조문: the cat is on the mat
  • 생성문: the cat
  • 1-gram 정밀도:
  • : 짧음 벌점 적용
  • : 짧음 벌점 없음

참조문이 여러 개인 경우

  • 수정 n-gram 정밀도: 각 n-gram에 대해 참조문별 등장 횟수의 최댓값을 상한으로 사용
    • 여러 참조문의 등장 횟수를 합산하지 않음
  • 짧음 벌점: 생성문 길이 와 가장 가까운 참조문 길이를 로 선택
    • 길이 차이가 같으면 더 짧은 참조문 선택
  • 효과: 여러 정답 표현 가운데 하나와 일치해도 점수에 반영

평활화 smoothing

어떤 n-gram 정밀도가 0이면 BLEU 전체가 0이 된다. 문장 단위 BLEU에서는 평활화가 특히 중요하다.

  • 매우 작은 값으로 대체
  • 분자와 분모에 1 추가
  • 이전 차수 n-gram 정밀도를 이용한 백오프

더 알아보기: BLEU 계산식

수정 n-gram 정밀도

  • : 생성문에 나타난 n-gram 집합
  • : 차 수정 n-gram 정밀도
  • : 참조문의 수

짧음 벌점

로그 BLEU

  • : 각 n-gram 정밀도의 가중치
  • 일반적인 BLEU-4: ,

BLEU 실습

!pip install -q nltk
  • reference: 사람이 작성한 참조문. 평가 기준
  • hypothesis: 모형이 생성한 문장. 평가 대상

sentence_bleu()의 첫 번째 인자는 참조문 목록이다. 참조문이 하나이므로 [reference]로 전달한다. 여러 개라면 [reference1, reference2]처럼 전달한다.

from nltk.translate.bleu_score import SmoothingFunction, sentence_bleu

reference = """It is the guiding principle which guarantees the military forces
always being under the command of the Party""".strip().split()

hypothesis = """It is a guide to action which ensures that the military always obeys
the commands of the Party""".strip().split()

기본 설정: 4-gram까지 사용. 두 문장에 겹치는 4-gram이 없어 경고와 함께 0에 가까운 값 출력

sentence_bleu([reference], hypothesis)
실행 결과
3.6718992240469637e-78

3-gram까지만 같은 가중치로 반영한다.

sentence_bleu([reference], hypothesis, weights=(1 / 3, 1 / 3, 1 / 3))
실행 결과
0.20140621167558334

method2: 분자와 분모에 1을 더하는 평활화

sentence_bleu(
    [reference],
    hypothesis,
    smoothing_function=SmoothingFunction().method2,
)
실행 결과
0.18353610946423723
Previous
혼란도
Next
ROUGE