자연어 문장을 생성할 때 동어 반복 문제를 해결하는 방법으로 알려진 것은
n-gram penalty와 함께 top-k sampling, top-p sampling 등이 있다.
이 중 후자 2가지에 대해서 살펴본다.
일반적으로 자연어 문장을 생성할 때는 greedy search를 이용한다.
가장 높은 확률값을 갖는 하나의 토큰을 선택해가면서 다음 토큰을 예측하는 것이다.
top-k sampling은 가장 높은 확률값의 토큰 하나를 선택하는 게 아니라
가장 높은 확률값의 토큰 '여러 개'를 선택한 다음
그 중에서 확률값에 따라 랜덤하게 토큰을 하나 선택한다.
그런 면에서 greedy search는 top-1 sampling이라고 말할 수 있다.
예를 들어 확률 분포에서
다음 토큰이 '나는'이 될 확률은 0.3
'어제'가 될 확률은 0.2
'그리고'가 될 확률은 0.1
나머지 다른 단어가 다음 토큰이 될 확률은 0.1보다 더 작다고 해 보자.
일반적인 greedy search였다면 다음 토큰이 '나는'이 될 확률이 100%가 된다.
top-1의 하나만 뽑기 때문이다.
top-3 sampling이라면 다음 토큰은 '나는', '어제', '그리고' 중에 하나가 된다.
이 셋 각각의 새로운 확률값은 다음과 같다.
p('나는') = 0.3 / 0.3+0.2+0.1 = 0.5
p('어제') = 0.2 / 0.3+0.2+0.1 = 0.3333
p('그리고') = 0.1 / 0.3+0.2+0.1 = 0.1666
greedy search였을 때는 top-1 sampling으로서 다음 토큰이 무조건 '나는'이었을 텐데
top-k sampling을 함으로써
같은 '나는' 토큰만 계속해서 나올 확률값이 1에서 0.5로 낮아졌다.
top-p sampling은
top 몇 개를 개수로 결정하는게 아니라 확률값으로 결정하는 방법이다.
예를 들어 p=0.3이면 위의 경우에서는 '나는'만이 후보로 들어올 것이고
p=0.5이면 '나는'과 '어제'가 후보로 들어올 것이다.