모델은 다음 글자를 고르지 않는다
앞 시리즈는 모델을 만드는 이야기였다. 마지막 편에서 문자 하나를 예측하는 63만
개짜리를 훈련시켰고, 손실이 1.7510 까지 내려갔다.
그런데 그 모델에게 “다음 글자가 뭐야” 라고 물으면 글자가 나오지 않는다. 나오는 것은 100개짜리 확률 분포다. 거기서 글자 하나를 꺼내는 일은 모델이 하는 게 아니라 우리가 따로 정하는 규칙이고, 이 시리즈는 훈련이 끝난 뒤에 붙는 그런 것들을 잰다.
첫 편은 그 규칙이다. 같은 모델, 같은 가중치인데 규칙만 바꾸면 결과가 얼마나 달라지는지 본다. 모델은 13편에서 훈련한 것을 그대로 쓴다.
가장 그럴듯한 규칙이 가장 나쁘다
제일 자연스러운 규칙은 확률이 가장 높은 글자를 고르는 것이다. 매 자리에서 모델이 가장 믿는 답을 쓴다. 틀릴 이유가 없어 보인다.
돌려 보면 이렇게 된다.
탐욕(greedy) 되풀이 0.997
' '
공백만 나온다. 400글자를 뽑았는데 8글자짜리 조각이 99.7% 겹친다.
이유는 단순하다. 확률이 가장 높은 글자를 고르면 다음 자리의 문맥도 결정된다. 그 문맥에서 또 가장 높은 것을 고르면 또 같은 데로 간다. 한 번 자기 자신으로 돌아오는 고리에 들어가면 영원히 못 나온다. 무작위가 하나도 안 섞였으니 나올 방법이 없다.
가장 그럴듯한 다음 글자를 이어 붙인 것이 가장 그럴듯한 글이 아니다.
온도
그래서 확률대로 뽑는다. 그런데 분포를 그대로 쓸 필요는 없다. 로짓을 T 로
나누고 소프트맥스를 다시 태우면 분포의 뾰족함이 바뀐다.
p = softmax(logits / T)
T 가 작으면 뾰족해지고(1등에 몰리고), 크면 평평해진다. T=0 은 탐욕이고
T=1 은 모델이 낸 그대로다. 8편에서 sqrt(d) 로 나눠 소프트맥스의 뾰족함을
맞췄던 것과 같은 손잡이다.
탐욕 되풀이 0.997
온도 0.5 되풀이 0.438
온도 0.8 되풀이 0.000
온도 1.0 되풀이 0.010
온도 1.3 되풀이 0.000
0.5 까지는 아직 고리에 걸린다. 0.8 부터는 안 걸린다. 대신 온도를 올릴수록
글자 선택이 헐거워진다.
온도 0.5 '```\n 0.6621\n4 '
온도 0.8 '```\nFlattent `11 above the same\nrank 64 means - residu'
온도 1.3 '`16, a=0, 336.11 b=0.00350 steps\n`3.8203` wOth `t0`. He'
0.8 의 Flattent, 1.3 의 wOth 를 보면 온도가 무엇을 사고 무엇을 파는지
보인다. 되풀이를 피하는 값으로 오타를 낸다.
진짜 문제는 꼬리다
온도를 올리면 왜 오타가 나는가. 분포의 꼬리 때문이다. 100개 글자 중 모델이 사실상 0에 가까운 확률을 준 것들이 있는데, 온도를 올리면 그것들도 뽑힐 만큼 올라온다. 모델이 “이건 아니다” 라고 말한 것을 우리가 뽑는 셈이다.
해법은 꼬리를 자르는 것이다. 상위 k 개만 남기거나(top-k), 누적 확률이 p 가
될 때까지만 남긴다(top-p). 둘 중 무엇이 나은지는 자리마다 후보가 몇 개나
필요한지를 재 보면 답이 나온다.
검증 데이터 위 1024개 자리에서 누적 확률 0.9 를 채우는 데 필요한 후보 수를
셌다.
누적 0.90 에 필요한 후보 수 중앙값 2 1사분위 1 3사분위 5 범위 1 ~ 17
누적 0.99 에 필요한 후보 수 중앙값 5 1사분위 3 3사분위 12 범위 1 ~ 41
자리마다 완전히 다르다. 34.4% 의 자리에서는 후보 하나면 0.9 가 찬다.
모델이 확신하는 자리다 - 단어 중간이거나, 코드 펜스를 닫는 중이거나. 반대로
10.4% 의 자리에서는 열 개로도 모자란다. 문장이 막 시작하는 자리 같은 것이다.
엔트로피로 봐도 같다. 중앙값 0.804 인데 최소가 0.0003, 최대가 2.969 다.
균등하게 헷갈릴 때가 4.605 이니 거의 끝에서 끝까지 오간다.
그래서 고정 k 는 항상 틀리다
k=10 을 놓고 재 보자.
top-10 이 담는 평균 질량 0.9751
후보 1개면 되는 자리(34.4%)에서 2~10위가 갖는 질량 0.0316
10개로 모자란 자리(10.4%)에서 top-10 이 버리는 질량 0.1609
평균만 보면 0.9751 로 훌륭하다. 그런데 평균이 가리고 있는 것이 양쪽에 있다.
확신하는 자리에서는 2위부터 10위까지가 다 합쳐 0.0316 밖에 안 되는데, 그
쓰레기 아홉 개를 후보로 남긴다. 반대로 열 개로 모자란 자리에서는 정당한
0.1609 를 잘라 버린다.
k 는 자리마다 달라야 하는 값인데 상수로 박혀 있으니, 한쪽을 맞추면 다른 쪽이
틀린다. top-p 는 그 k 를 매 자리 분포에서 다시 계산한다. 그래서 확신하는
자리에서는 후보가 하나로 줄고 헷갈리는 자리에서는 스무 개까지 늘어난다.
top-k 10 되풀이 0.003 '```\n\n(16, 4)`, all scale mether the settyon: `(44n) + 1 '
top-p 0.9 되풀이 0.008 '```\nlambda = a @ Ws * in independent of a the minimum bu'
이 작은 모델에서는 둘 다 그럴듯하게 나온다. 어휘가 100개뿐이라 꼬리가 짧다 -
11위 이하 전부가 갖는 질량이 평균 0.0249 다.
여기서부터는 재지 않은 추정이다. 어휘가 5만 개인 모델이라면 꼬리에 있는 4만 9천 개가 다 더해져 더 큰 몫이 될 것이고 두 방식의 차이도 커질 것이라고 보는 게 자연스럽다. 다만 이 실험은 어휘 100 짜리 하나뿐이라 그 말을 확인해 주지 않는다.
그래서
- 모델이 내놓는 것은 글자가 아니라 분포다. 고르는 규칙은 훈련과 별개로 우리가 정한다
- 가장 높은 것을 고르면 고리에 걸린다. 되풀이
0.997, 사실상 한 글자만 반복한다 - 온도는 되풀이와 오타를 맞바꾼다.
0.5는 아직 고리에 걸리고1.3은wOth같은 것을 쓴다 - 후보가 몇 개 필요한지는 자리마다
1에서17까지 다르다. 엔트로피도0.0003에서2.969다 - 그래서 고정
k는 양쪽에서 틀린다.k=10은 확신하는 자리에 잡음0.0316을 들이고, 모자란 자리에서 정당한0.1609를 버린다
다음 편에서는 속도를 본다. 글자 하나를 뽑을 때마다 앞 문맥을 통째로 다시 계산하고 있는데, 그럴 필요가 없다는 것을 재 본다.
Comments