ChatGPT의 temperature 이해하기
OpenAI의 ChatGPT, 구글의 Gemini, 메타의 Llama2 등 다양한 LLM이 쏟아져 나오는 시대다. 여러 LLM을 테스트해 보면서 생성 관련 파라미터의 값도 조정해 보기 마련인데, 이 파라미터들의 의미가 무엇일까?
파라미터의 값을 조정하면 기대할 수 있는 결과는 API 문서에도 잘 정리되어 있다. ChatGPT API 문서에 따르면, temperature는 값을 높이면 좀 더 랜덤한 문장이, 낮추면 좀 더 정제된 문장이 생성된다고 한다.
https://platform.openai.com/docs/api-reference/chat/create#chat-create-temperature
그게 어떻게 가능할까?
LLM은 문장을 생성할 때 한 번에 한 단어(토큰)씩 생성한다. 지금까지 주어진 문맥을 고려하여 그다음에 올 단어를 하나씩 예측하는데, 이때 그 모델이 알고 있는 모든 단어를 고려한다. 주어진 문맥 다음에 각 단어가 나올 확률을 고려하여 가장 적절한 단어를 선택해 문장을 이어나가는 방식이다.
이때 각 단어가 나올 확률을 조금씩 조정하면 색다른 문장이 만들어질 수 있다. 이를 조정하는 방식 중 하나가 temperature이다.
LLM이 내뱉는 raw 반환값은 모델이 알고 있는 모든 단어의 logits값이다. 확률이 아니라는 의미다. 이 logits 값을 확률로 만들어주기 위해 softmax라는 함수를 적용해 준다. softmax 함수는 logits값들 사이의 대소관계를 유지하며, 합은 1로 바꿔준다. 그러면 LLM은 이 확률에 따라 단어를 고른다. 단어 A의 확률이 0.85, 단어 B의 확률이 0.06이라면, 0.85의 확률로 단어 A가 선택되고, 0.06의 확률로 단어 B가 선택되도록 하면서 랜덤하게 단어를 선택한다는 의미다.
temperature는 이 softmax 함수에 적용되어 단어들의 확률 분포를 조금씩 조정해 준다. 각 단어의 logits 값을 temperature로 나눈 후 softmax를 적용해 조정된 확률 분포를 만드는 것이다. 따라서 temperature 값이 1이면 원래의 확률 분포와 같은 결과가 나온다. 그래서인지 ChatGPT API에서 temperature의 디폴트 값도 1이다.
위의 수식은 기본적인 softmax, 아래 수식은 softmax에 temperature를 적용한 버전이다. 파란색으로 쓴 t가 temperature를 의미한다. x_i가 i번째 단어의 logits이고 이를 softmax에 넣어 나온 반환값이 i번째 단어의 (조정된) 확률이라고 보면 된다. n은 모델이 알고 있는 단어의 개수이다.
temperature 값은 작을수록 확률 분포가 더 양극화된다. temperature 값이 작으면 안 그래도 나올 확률이 높았던 단어의 확률은 더 높아지고, 안 그대로 나올 확률이 낮았던 단어의 확률은 더 낮아진다는 의미다. 그래서 좀 더 뻔하고 확실한 문장이 생성될 수 있다. ChatGPT API 문서에 따르면 temperature 0.2 정도는 작은 값으로 본다.
반면 temperature 값이 커지면 각 단어의 확률이 비슷비슷해진다. 나올 확률이 높았던 단어의 확률과 나올 확률이 낮았던 단어의 확률이 고만고만해진다는 것이다. 그래서 temperature 조정 전에는 정말 뽑히기 어려웠던 단어도 좀 더 쉽게 뽑히고, 더 랜덤하고 창의적이고 새로운 문장이 생성될 수 있다. ChatGPT API 문서에 따르면 temperature 0.8 정도는 큰 값으로 본다.
참고
• https://huggingface.co/blog/how-to-generate
• https://medium.com/mlearning-ai/softmax-temperature-5492e4007f71
Thumbnail Image by freestocks on Unsplash