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