Temperature, top-p, 그리고 샘플링: 모델 출력 제어하기
temperature와 top-p는 모델이 다음 단어를 고르는 방식을 정합니다. 각각의 역할을 알면 출력을 딱딱함에서 창의적으로 의도껏 조절할 수 있습니다.
같은 질문을 모델에 두 번 던졌는데 서로 다른 답을 받아본 적이 있다면, 당신은 이미 **샘플링(sampling)**을 만난 것입니다. 언어 모델은 결정론적으로 다음에 올 "정답" 단어를 내놓지 않습니다. 매 단계마다 서로 다른 가능성들을 각기 다른 확률과 함께 펼쳐 놓고, 그다음 무언가가 그중에서 골라야 합니다. 그 선택을 좌우하는 설정값들, 가장 흔하게는 temperature와 top-p는, 당신이 직접 제어할 수 있는 몇 안 되는 손잡이이며, 출력이 딱딱하게 느껴질지, 균형 잡혀 느껴질지, 거칠게 창의적으로 느껴질지에 막대한 영향을 미칩니다. 이들을 이해하면, 답답한 "왜 자꾸 무작위로 구는 거지?"가 의도껏 맞춰 놓을 수 있는 다이얼로 바뀝니다.
무작위성은 어디서 오는가
텍스트를 생성하는 매 단계에서, 모델은 가능한 다음 토큰 각각에 대해 확률을 계산합니다. 다음 토큰이 "blue"일 확률이 높고, "green"은 더 낮고, "purple"은 그보다 더 낮고, 이런 식으로 전체 어휘에 걸쳐 정한다고 해보죠. 이 펼쳐짐이 *분포(distribution)*입니다. 확률이 붙은 후보들을 순위 매긴 집합이죠.
모델은 스스로 그중 어느 것을 쓸지 정하지 않습니다. 그것이 샘플링 단계의 일입니다. 가장 단순한 규칙은 "언제나 가장 확률 높은 토큰 하나를 취한다"일 것입니다. 그 규칙을 그리디(greedy) 디코딩이라 부르며, 늘 최선의 추측을 고른다니 솔깃하게 들립니다. 하지만 실제로는 밋밋하고 반복적이며 때로는 이상하게 막혀버린 텍스트를 만들어내는 경향이 있습니다. 좋은 언어에는 보통 어느 정도의 변주가 들어 있고, 경직되게 늘 가장 확률 높은 것만 고른 텍스트는 좋은 글이 읽히는 방식이 아닙니다. 그래서 모델은 항상 최상위 후보를 낚아채는 대신, 보통 분포에서 표본을 뽑으며(sample), temperature와 top-p가 그 샘플링이 어떻게 동작하는지를 빚어냅니다.
Temperature: 확률을 평평하게 또는 날카롭게
Temperature는 모델이 고확률 후보를 저확률 후보보다 얼마나 선호할지를 제어합니다. 가장 깔끔하게 그려보는 방법은 이렇습니다. temperature는 토큰을 뽑기 전에 분포의 형태를 다시 빚습니다.
- 낮은 temperature는 분포를 날카롭게 만듭니다. 이미 확률 높은 토큰이 한층 더 지배적이 되고, 길게 늘어진 가능성 낮은 선택지들의 꼬리는 무의미해질 만큼 짓눌립니다. 출력은 더 집중되고, 더 예측 가능하며, 더 반복적이 됩니다. 극단적으로 매우 낮은 temperature는 그리디 동작에 가까워집니다. 거의 언제나 최상위 후보를 취하죠.
- 높은 temperature는 분포를 평평하게 만듭니다. 확률 높은 토큰과 낮은 토큰 사이의 간격이 좁아져, 덜 확률적이고 더 뜻밖인 토큰이 선택될 실질적 기회를 얻습니다. 출력은 더 다채롭고 더 창의적이 되지만, 어느 선을 넘으면 덜 일관되게 됩니다. 모델이 이제 스스로 가능성 낮다고 본 토큰까지 기꺼이 고르려 하기 때문입니다.
유용한 직관 하나. temperature는 모델에 새로운 아이디어를 주지 않습니다. 그저 모델이 가장 안전한 추측 너머로 손을 뻗을 의향을 얼마나 가질지를 바꿀 뿐입니다. 낮은 temperature는 늘 뻔한 단어를 고르는 신중한 작가이고, 높은 temperature는 뜻밖의 것을 향해 손을 뻗는 작가입니다. 때로는 빛나게, 때로는 말이 안 되게요.
Top-p: 고르기 전에 꼬리를 다듬기
Top-p는 핵 샘플링(nucleus sampling)이라고도 하며, 다르게 작동합니다. 모든 확률을 다시 빚는 대신, 애초에 어떤 후보가 자격을 가지는지를 제한합니다.
아이디어는 이렇습니다. 후보 토큰을 확률 높은 순에서 낮은 순으로 줄 세우고, 그 누적 확률이 임계값 p에 도달할 때까지 후보를 후보 명단에 계속 더해 갑니다. 그 명단 밖에 있는 모든 것은 이 단계에서 버려지고, 모델은 살아남은 것들에서만 표본을 뽑습니다. 가령 top-p를 높은 값으로 두면 넓은 명단을 유지하고, 낮은 값으로 두면 가장 확률 높은 몇 개만 남깁니다.
영리한 점은 이 명단이 스스로 크기를 자동 조절한다는 것입니다. 모델이 확신할 때, 즉 한두 개 토큰이 확률 대부분을 차지할 때 명단은 아주 작아지고, 출력은 정해진 궤도를 따릅니다. 모델이 정말로 불확실해서 확률이 그럴듯한 여러 토큰에 흩어져 있을 때는 명단이 커지며, 변주가 합리적인 바로 그 지점에서 다양성을 허용합니다. 사실상 top-p는, 정해진 선택지 개수를 강제하지 않으면서 그럴듯하지 않은 꼬리를 잘라내는 동적인 방식입니다.
둘은 어떻게 관련되는가
temperature와 top-p는 흔히 함께 제공되며, 서로 다른 두 질문에 답합니다.
- Temperature는 묻습니다. 확신하는 추측을 확신 없는 추측보다 얼마나 선호해야 할까?
- Top-p는 묻습니다. 가능성 낮은 꼬리를 도대체 얼마나 고려에 넣어야 할까?
둘은 결합할 수 있지만, 공격적으로 결합하면 따져보기 어려울 수 있습니다. 둘 다 같은 출력을 겹치는 방식으로 풀거나 조이기 때문이죠. 흔하고 합리적인 접근은, 하나를 주된 창의성 다이얼로 조정하고 다른 하나는 적당한 기본값에 두는 것이지, 둘 다를 한꺼번에 극단으로 밀어붙이는 것이 아닙니다. 정확한 수치 범위는 모델 제공자마다 다르므로, 동작 자체, 즉 날카롭게 대 평평하게, 좁게 대 넓게를 당신이 조율하는 대상으로 삼고, 구체적인 척도는 각 제공자의 문서를 확인하세요.
과제에 설정 맞추기
올바른 설정은 전적으로 당신이 무엇을 하느냐에 달려 있습니다.
일관성과 정확성을 원할 때, 즉 구조화된 데이터 추출, 사실 질문 답변, 텍스트 분류, 반드시 실행되어야 하는 코드 생성에서는 낮은 무작위성 쪽으로 치우치세요. 당신은 모델의 가장 확신에 찬, 분포 한가운데의 답을 원하고, 그것이 재현 가능하기를 원합니다. 여기서 높은 무작위성은 피할 수 있었을 실수를 불러들이고 실패의 디버깅을 더 어렵게 만들 뿐입니다.
다양성과 창의성을 원할 때, 즉 브레인스토밍, 마케팅 카피 초안, 서로 다른 여러 선택지 생성, 소설에서는 무작위성을 높이세요. 가끔 나오는 별난 선택은 결함이 아니라 기능입니다. 당신은 모델에서 폭을 캐내는 중이고, 서로 다른 여러 시도야말로 핵심이니까요.
아이디어 생성에 쓸 만한 실용적 패턴은, 더 높은 무작위성으로 같은 프롬프트를 일부러 여러 번 돌린 뒤 가장 좋은 결과를 고르는 것입니다. 단 하나의 완벽한 출력을 기대하기보다 말이죠. 반대로 안정적이고 시험 가능해야 하는 것이라면 정반대로 하세요. 무작위성을 최소화해 같은 입력이 같은 출력을 안정적으로 내놓게 하세요.
재현성에 관한 메모
매번 같은 출력이 필요하다면, 즉 테스트, 캐싱, 감사 가능성을 위해서라면 높은 무작위성은 방해가 됩니다. temperature를 바닥 쪽으로 낮추면 동작이 결정론적인 방향으로 밀리고, 일부 인터페이스는 재현성을 겨냥한 추가 제어 수단을 제공합니다. 다만 현실적이 되세요. 실행 간에 완벽히 동일한 출력이 늘 보장되는 것은 아니며, 가정하기보다 검증해야 합니다. 일반 원칙은 변함없이 통합니다. 무작위성이 적을수록 더 반복 가능하고 더 보수적인 출력이 나오고, 무작위성이 많을수록 더 다채롭고 덜 예측 가능한 출력이 나옵니다.
정리
샘플링은 모델이 내부에 펼쳐 놓은 가능한 다음 토큰들을 실제 선택으로 바꾸는 단계이며, temperature와 top-p는 당신이 그것을 조종하는 방법입니다. temperature는 분포 전체를 날카롭게 또는 평평하게 만듭니다. 모델이 가장 안전한 추측 너머로 얼마나 대담하게 손을 뻗을지를 정하죠. top-p는 고르기 전에 가능성 낮은 꼬리를 다듬으며, 모델이 정말로 불확실할 때만 선택지를 넓힙니다. 둘 다 지식을 더하지는 않고, 둘 다 표현을 빚습니다. 정확성과 일관성이 필요하면 낮은 무작위성으로, 폭과 뜻밖이 필요하면 높은 무작위성으로 손을 뻗으세요. 그리고 한 번에 다이얼 하나씩 조정해 무엇이 바뀌었는지 실제로 알 수 있게 하세요. 의도껏 쓰면, 이 설정들은 예측 불가능한 출력을 당신이 제어하는 도구로 바꿔줍니다.
