본문 바로가기
NLP/LLM

LLM에서의 temperature, Top-k, Top-p, Penalties

by 아르카눔 2025. 5. 11.

 

우선 LLM의 생성 과정을 알아야 하니 간단하게 짚고 넘어간다.

 

입력 쿼리 → LLM → logits 계산 → logits에 softmax를 취해서 token에 대한 확률 계산 → 답변 생성

 

이때 token의 숫자는 tokenzier에서 설정한 Vocab size와 같다. 

 

Vocab size가 32000이라면, 입력된 쿼리를 바탕으로 32,000개의 token들을

 

각각이 가진 softmax에 의한 확률을 가지고 multinomial 방법으로 샘플링을 하여 답변을 생성하게 된다. 

 

이때 가장 큰 값만을 사용하면 매번 확정적으로 고정된 token을 생성하겠지만 샘플링 방법을 사용함으로써 답변의 다양성을 확보할 수 있다.

 

 

이때 답변의 다양성을 조절할 수 있는 방법들이 몇가지 존재하게 된다.

 

  1. temperature
  2. top-k
  3. top-p
  4. penalty

 

1. temperature

 

token $i$에 대한 softmax는 다음과 같이 구할 수 있다.

 

$x_i$는 토큰 $i$의 logit이다.

 

softmax($x_i$) = $\frac{exp(x_i)}{\sum_{i} exp(x_i) }$

 

 

이때 temperature를 조정하는 변수 $T$를 활용해 logit $x_i$에 스케일링을 가하면 다음과 같다. 

 

softmax($x_i / T$) = $\frac{exp(x_i / T)}{\sum_{i} exp(x_i / T) }$

 

이제 T의 값의 범위에 따라서 3가지 변화로 나눌 수 있다. 

 

 

1. T가 1이면 원래의 softmax와 동일하다. 

 

 

2. T가 1보다 크면 logit의 크기가 작아지므로 토큰간의 softmax의 값의 차이가 줄어든다.  

따라서 상대적으로 더 다양한 토큰들이 뽑힐 확률이 커진다. 

 

예) 2개의 logit이 2과 3이고 T가 1.5라면 각각 1.3과 2가 되어 차이가 1에서 0.7로 줄어든다. 

 

 

3. T가 1보다 작으면 logit의 크기가 커지므로 토큰간의 softmax의 값의 차이가 커진다.  

따라서 상대적으로 확률이 큰 토큰들이 뽑힐 확률이 커진다. 

 

예) 2개의 logit이 2과 3이고 T가 0.5라면 각각 4과 6가 되어 차이가 1에서 2로 커진다. 

 

 

2. top-k

 

logits의 값을 상위 k개만 남긴다. 그 다음 k개 중에서 하나를 샘플링해서 생성한다. 

 

뽑힐 확률이 높은 토큰만 k개 남기므로 다소 보수적인 방법이다.

 

 

3. top-p

 

top-k와 달리 softmax를 큰 것부터 누적하여 확률 p가 될 때 까지 선택된 토큰들만을 활용해서 샘플링을 통해 다음 토큰을 생성한다.

 

top-k는 k를 임의로 사람이 정해줘야 한다. 즉 가능성이 높은 토큰의 개수를 미리 지정한다.

하지만 top-p의 경우 p의 값에 따라서 모델이 알아서 가능성이 높은 토큰의 집합을 선정하므로 유연하게 토큰의 집합의 카디널리티를 설정할 수 있다. 

 

예를 들어서 p = 0.8이고,

A라는 상황에서는 상위 토큰 2개를 합해서 0.81인 경우가 있다고 가정하자.

그렇다면 이는 주어진 쿼리에 대해서 2가지 경우를 답변해야 정확하고 나머지는 정확하지 않을 확률이 높다고 생각할 수 있다.

 

반면에 B라는 상황에서는 상위 토큰이 10개를 합쳐서 확률이 0.81이라고 가정해본다.

이 경우 주어진 쿼리에 대해서 동의어 혹은 선택지가 많은 상황이라고 생각할 수 있다. 

 

4. penalty

 

length penalty와 repetition penalty가 있다.

 

length penalty는 너무 짧거나, 너무 긴 문장을 방지하는 방법이다.

 

repetition penalty는 이미 등장한 토큰에 패널티를 주어서 반복적인 표현을 방지하는 방법이다.

 

repetition penalty는 다시 2가지로 분류할 수 있다.

 

presence penalty는 토큰이 이전에 등장했는지 아닌지만 고려한다. 즉 2회 중복이나 10회 중복 모두 같은 페널티를 받는다.

 

반면에 frequency penalty는 토큰의 등장 빈도를 고려하며, 10회 중복 토큰 A에 대해서 2회 중복인 토큰 B 보다 더 큰 패널티를 부여한다.  

 

 

In API, LangChain and Huggingface 

 

1. LangChain with ChatOpenAI 

 

LangChain에서 제공하는 ChatOpenAI는 temperature와 top_p, presence_penalty와 frequency_penalty를 지정할 수 있다. 

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2,
    # top_p = 0.8
    # api_key="...",  # if you prefer to pass api key in directly instaed of using env vars
    # base_url="...",
    # organization="...",
    # other params...
)

 

위 temperature에서 변형된 소프트맥스롤 보면 알겠지만 $T$ 값은 분모에 들어가므로 0이 될 수 없다.

하지만 ChatOpenAI도 그렇고 OpenAI의 API에서도 temperature 변수를 0으로 설정할 수 있다.

이는 모델이 가장 consistent하게 차이가 없이 보수적으로 혹은 안정적으로 답변을 하는 설정이라고 한다.  

temperature을 1로 하고 top_k를 1로 놓으면 같은 결과인가 싶어서 확인하고 싶어도 top_k를 지원하지 않아서 불가능한게 아쉽다. 

 

 

 

2. LangChain with ChatGoogleGenerativeAI 

 

LangChain에서 제공하는 ChatGoogleGenerativeAI는 temperature, presence_penalty, frequency_penalty를 지원한다.

 

Gemini API의 GenerationConfig (링크)를 보면 presence_penalty와 frequency_penalty를 모두 지원하던데 이를 활용하려면 커스텀 함수를 사용해야할 것 같다.

 

 

 

3. LangChain with ChatAnthropic 

 

LangChain에서 제공하는 ChatAnthropic 역시 temperature, presence_penalty, frequency_penalty를 지원한다.

 

Anthropic의 presence_penalty와 frequency_penalty는 아직 못 찾았는데 추가로 확인해봐야겠다.

 

 

4. Huggingface의 Generation Config

 

class transformers.GenerationConfig에서 temperature, top_k, top_p, repetition_penalty를 지원한다.

 

repetition_penalty가 presence_penalty인지 frequency_penalty인지는 나와있지 않아서 추가로 확인이 필요하다. 

 

 

 

 

여담

 

OpenAI의 경우 Playground에서 temperature, max tokens, top_p를 변경하면서 확인할 수 있는 웹 UI가 있어서 편하게 각각의 값들의 조정하고 그 결과를 확인할 수 있다. 

 

 

 

 

 

 

References:

https://wikidocs.net/278304

https://www.sktenterprise.com/bizInsight/blogDetail/skt/9622

https://www.ibm.com/think/topics/llm-temperature

https://www.promptingguide.ai/kr/introduction/settings

https://docs.mistral.ai/guides/sampling/

https://platform.openai.com/docs/api-reference/introduction

https://python.langchain.com/api_reference/google_genai/chat_models/langchain_google_genai.chat_models.ChatGoogleGenerativeAI.html

https://python.langchain.com/api_reference/openai/chat_models/langchain_openai.chat_models.base.ChatOpenAI.html

https://ai.google.dev/api/generate-content?hl=ko#v1beta.GenerationConfig
https://ai.google.dev/gemini-api/docs/text-generation?hl=ko

https://python.langchain.com/api_reference/anthropic/chat_models/langchain_anthropic.chat_models.ChatAnthropic.html

https://huggingface.co/docs/transformers/main_classes/text_generation

https://sozerodev.tistory.com/216

https://city-kim.tistory.com/12

 

 

 

 

'NLP > LLM' 카테고리의 다른 글

LLM 서빙 관련 글 모음  (0) 2025.04.27
Mistral 7B (2023) 논문 리뷰  (0) 2025.04.27
GPT 4 (2023) 리뷰  (0) 2025.04.26
Self-Instruct (2022) 논문 리뷰  (0) 2025.04.17
LLaMA 2 (2023) 논문 리뷰  (0) 2025.04.17