루나에게 말 걸기: 같은 시작 문장에 왜 매번 다른 이야기가 나올까

온도: 확률표를 펴고 오므리기

서연이 말한 「온도」는 대화형 모델의 설정 화면에서 흔히 보는 그 설정으로, 온도를 0으로 내리면 그리디 선택이 되고, 올리면 같은 질문에도 답이 다양해진다. 그런데 확률표대로 뽑는 것이 가장 자연스러워 보이는데, 표를 일부러 바꿔서 뽑는 설정이 왜 필요할까? 그리고 그 설정에 하필 물리의 이름이 붙은 이유는 무엇일까?

로짓은 모델이 확률표를 만들기 직전에 토큰마다 매긴 점수이고, softmax 가 이 점수를 확률로 바꾼다. 로짓을 온도 τ로 나눈 뒤 softmax 를 씌우는 것은, 온도 1의 확률 p를 1/τ 제곱한 뒤 합이 1이 되게 다시 나누는 것과 같다. 확률은 로짓의 지수에 비례하므로, 로짓을 τ로 나누면 지수가 1/τ배가 되기 때문이다.

pτ(x)=p(x)1/τ∑x′p(x′)1/τ\textcolor{#c2408a}{p}_{\textcolor{#1f6066}{\tau}}(\textcolor{#1b9e77}{x}) = \frac{\textcolor{#c2408a}{p}(\textcolor{#1b9e77}{x})^{1/\textcolor{#1f6066}{\tau}}}{\sum_{\textcolor{#1b9e77}{x'}} \textcolor{#c2408a}{p}(\textcolor{#1b9e77}{x'})^{1/\textcolor{#1f6066}{\tau}}}
p(x)모델이 다음 토큰 x 에 준 확률 (온도 1)τ온도: 1보다 작으면 표가 오므라들고, 크면 펴진다pτ(x)온도 τ 로 바꾼 뒤 실제로 뽑는 확률x′어휘의 모든 토큰 (분모는 합을 1로 맞춘다)\begin{array}{ll} \textcolor{#c2408a}{p}(\textcolor{#1b9e77}{x}) & \text{모델이 다음 토큰 } \textcolor{#1b9e77}{x} \text{ 에 준 확률 (온도 1)} \\ \textcolor{#1f6066}{\tau} & \text{온도: 1보다 작으면 표가 오므라들고, 크면 펴진다} \\ \textcolor{#c2408a}{p}_{\textcolor{#1f6066}{\tau}}(\textcolor{#1b9e77}{x}) & \text{온도 } \textcolor{#1f6066}{\tau} \text{ 로 바꾼 뒤 실제로 뽑는 확률} \\ \textcolor{#1b9e77}{x'} & \text{어휘의 모든 토큰 (분모는 합을 1로 맞춘다)} \end{array}

우리 모델이 「Once upon a time, there was a little」 다음 자리에 매긴 표를 세 온도로 바꿔 보았다.

토큰 τ = 0.5 τ = 1.0 τ = 1.5
␣girl 0.6497 0.3983 0.1481
␣boy 0.3265 0.2823 0.1178
␣dog 0.0162 0.0629 0.0433
␣bird 0.0035 0.0290 0.0259
엔트로피 (nats) 0.767 2.441 5.230
확률 0.001 넘는 토큰 4개 57개 137개

(␣ 는 토큰 앞의 빈칸이다.) 온도를 0.5로 내리면 「girl」과 「boy」 둘이 확률의 97% 를 차지하고, 1.5로 올리면 1등의 확률이 0.15 로 떨어지면서 확률 0.001 을 넘는 토큰이 137개로 는다. 엔트로피는 표가 얼마나 퍼졌는지를 nat 으로 잰 값인데, 0.767 에서 5.230 까지 일곱 배 가까이 커졌다. 모델이 바뀐 것은 없고, 같은 표를 뽑기 직전에 오므리거나 편 것뿐이다. 온도는 뽑는 단계에만 쓰는 설정이라 학습할 때 계산하는 로그확률에는 끼어들지 않는다.

같은 자리(「Once upon a time, there was a little」 다음)의 위 10개 토큰 확률을 온도 0.5, 1.0, 1.5로 바꾼 것. 온도를 내리면 1등과 2등이 커지고, 올리면 막대들이 고르게 낮아진다(sources/sampling/sampling.py)
같은 자리(「Once upon a time, there was a little」 다음)의 위 10개 토큰 확률을 온도 0.5, 1.0, 1.5로 바꾼 것. 온도를 내리면 1등과 2등이 커지고, 올리면 막대들이 고르게 낮아진다(sources/sampling/sampling.py)

자리 하나에서 본 표의 변화가 글 전체에서는 어떻게 나타날까? 같은 시작 문장으로 온도마다 샘플 20개씩 200 토큰을 뽑아, 되풀이 비율과 평균 놀람을 쟀다. 평균 놀람은 뽑힌 토큰에 온도 1 모델이 준 확률의 −ln 을 평균한 것으로, 모델 자신이 보기에 얼마나 뜻밖의 토큰을 골랐는지를 nats/토큰으로 잰다.

설정 되풀이 비율 평균 놀람 (nats/토큰)
그리디 선택 (τ = 0, 샘플 1개) 0.056 0.577
τ = 0.7 0.065 0.971
τ = 1.0 0.033 1.812
τ = 1.5 0.001 5.851

온도를 올릴수록 평균 놀람이 커진다. 온도 1.5의 5.851 은 그리디 선택의 열 배이고, 모델 자신이 「여기에 이게 올 리 없다」고 본 토큰을 자주 골랐다는 뜻이다. 되풀이 비율은 온도 0.7 이 0.065 로 가장 높고 1.5 에서는 0.001 로 거의 사라진다. 샘플을 읽어 보면 숫자의 뜻이 보인다.

### τ=0.7 [2]  Minjune was three years old and very curious. Every day, Minjune would look up at the sky and watch the clouds. … Minjune quickly hid behind a big tree and waited for a moment. …
### τ=1.0 [1]  Minjun wanted to build a tall tower, so he packed his mattress, but it wasn't steady - it was too hard for Minjret to work. He asked his dad, "Can you help me with the blocks?" … So Minjit and his dad gathered the blocks …
### τ=1.5 [1]  Minjun wanted to build a tall tower like the others. A day of craft fell for and Min foc math laughed only few hours.\nMinjit asked him dad, "Can I build an airport wall thoughNo one else can". Dad smiled and kindly adjusted -That Tiny stayed from tw radish pushed even parade. …

온도 0.7 의 루나는 매끄럽게 쓰지만 같은 낱말을 자주 다시 살펴보고, 온도 1.0 의 루나는 이야기가 다양해지는 대신 Minjun 이름이 Minjret, Minjit 으로 흔들린다. 온도 1.5 에서는 둘째 문장부터 낱말이 문법 없이 흩어진다. 되풀이 비율이 0.001 로 떨어진 것은 다양해서가 아니라 말이 안 되는 토큰을 골랐기 때문이다.

김민준 M11
김민준

0.7 이 제일 루나답다. 1.0 은 내 이름을 자꾸 바꾸고.

이서연 S01
이서연

1.5 는 루나가 아니라 키보드에 고양이가 올라간 거고.

문제 3. 제곱해서 고르는 점심 메뉴

점심 메뉴 셋을 좋아하는 정도가 비빔밥 0.6, 국수 0.3, 돈가스 0.1 이고, 그 비율대로 날마다 메뉴를 뽑는다. (가) 좋아하는 정도를 제곱한 뒤 합이 1이 되게 다시 나눠서 뽑으면 메뉴마다의 확률은? (나) 제곱근으로 바꾸면? (다) 두 경우는 온도가 각각 얼마인 경우인가?

이서연 S01
이서연

제곱하면 0.36, 0.09, 0.01 이고 합이 0.46 이니까, 나누면 0.7826, 0.1957, 0.0217. 비빔밥이 거의 매일이고 돈가스는 한 달에 한 번도 안 나오겠다.

김민준 M01
김민준

제곱근은 0.7746, 0.5477, 0.3162 에 합이 1.6385. 나누면 0.4727, 0.3343, 0.1930 이야. 돈가스가 열 번에 두 번은 나와.

선생님 T01
선생님

(다)는 식에서 지수를 맞춰 보면 돼요.

이서연 S01
이서연

지수가 1/τ 니까 제곱은 τ = 0.5, 제곱근은 τ = 2 예요. 좋아하는 순서는 그대로 두고 차이만 키우거나 줄이네요.

김민준 M01
김민준

순서가 안 바뀌니까 τ 를 0 쪽으로 끝까지 내리면 비빔밥만 남겠다. 그게 그리디 선택이고.

문제 4. 표의 숫자로 온도를 거꾸로 확인하기

표에서 τ = 1.0 일 때 「girl」과 「boy」의 확률은 0.3983, 0.2823 이다. (가) 온도의 식을 쓰면 τ = 0.5 와 τ = 1.5 에서 두 확률의 비는 각각 얼마가 되어야 하나? 표의 값으로 맞는지 확인하라. (나) 두 확률의 비는 분모의 합을 몰라도 계산할 수 있는가? (다) τ = 1.5 에서 「girl」의 확률이 0.3983 에서 0.1481 로 줄어든 것은 비만으로는 설명되지 않는다. 무엇이 더 필요한가?

김민준 M01
김민준

일단 τ = 1 의 비는 0.3983 ÷ 0.2823 = 1.411. 표에서 τ = 0.5 는 0.6497 ÷ 0.3265 = 1.990 이고, 1.5 는 0.1481 ÷ 0.1178 = 1.257 이야.

이서연 S01
이서연

식으로는 비가 1/τ 제곱이 돼. τ = 0.5 면 1.411² 이고, 음, 1.991 쯤. 1.5 면 1.411 의 2/3 제곱인데, 로그로 하면 ln 1.411 이 0.344 니까 2/3 를 곱해서 0.230, 지수로 돌리면 1.258.

선생님 T01
선생님

표와 끝자리까지 맞네요. (나)는요?

이서연 S01
이서연

비를 내면 분모가 위아래에서 지워져요. 두 토큰만 알면 나머지 4,094 개를 몰라도 되고요.

선생님 T02
선생님

그럼 (다)는 어디서 왔을까요? 비만 보면 girl 은 boy 보다 1.257 배로 여전히 앞서는데, 확률 자체는 반 넘게 줄었어요.

김민준 M08
김민준

음… 분모 아닐까요? τ = 1.5 에서 꼬리의 토큰들이 다 같이 커져서, 0.001 넘는 토큰이 57개에서 137개로 늘었잖아요. 둘 사이의 비는 조금만 줄었는데, 분모에 백 개 넘는 꼬리의 확률이 더해지니까 둘 다 작아진 거예요.

선생님 T01
선생님

온도를 올리면 위쪽 토큰끼리의 순서는 그대로인데 꼬리 전체가 함께 올라와요. 온도 1.5 샘플이 무너진 것도 그 꼬리에서 토큰이 뽑혔기 때문이고요.