LLM(대규모 언어 모델)에서 마지막 토큰의 출력을 생성할 때, 다양한 샘플링 기법이 사용됩니다. 이러한 기법은 모델의 출력을 제어하여 보다 자연스럽거나 특정한 특징을 가지는 텍스트를 생성하도록 돕습니다. 아래는 주요 샘플링 기법과 그 예시에 대한 구체적인 설명입니다.
설명: 확률이 가장 높은 토큰을 반복적으로 선택하는 방법입니다.
특징: 단순하고 빠르지만, 항상 동일한 결과를 생성하고 다양성이 부족할 수 있습니다. 로컬 최적화로 인해 비문법적이거나 의미가 없는 문장이 나올 가능성도 있습니다.
예시:
logits = [0.1, 0.3, 0.6] # 토큰 확률
selected_token = argmax(logits) # 확률이 가장 높은 토큰 선택 (2번째 토큰)
설명: 여러 개의 후보 시퀀스(빔)를 유지하며 확장하는 방법입니다. 각 단계에서 가장 높은 확률을 가진 ( k )개의 시퀀스를 선택하여 다음 단계로 이어갑니다.
특징: 보다 최적화된 시퀀스를 생성하지만, 다양성이 부족하고 계산 비용이 큽니다.
예시:
설명: 확률이 상위 ( k )개에 해당하는 토큰만 고려하고, 나머지는 확률을 0으로 만들어 샘플링합니다.
특징: 낮은 확률 토큰을 제거하여 비문법적인 출력을 줄이고, 높은 확률 토큰 내에서 무작위성을 유지합니다.
예시:
logits = [0.1, 0.3, 0.6] # 토큰 확률
k = 2
top_k_logits = [0.0, 0.3, 0.6] # 상위 2개의 확률만 남김
selected_token = sample(top_k_logits)
설명: 누적 확률이 ( p ) (예: 0.9)를 넘을 때까지의 토큰만 고려합니다. 즉, 가장 중요한 확률 질량을 유지하며 나머지는 제거합니다.
특징: 동적으로 토큰을 선택하므로, 텍스트의 다양성과 품질 간 균형을 맞출 수 있습니다.
예시:
logits = [0.1, 0.2, 0.3, 0.4] # 토큰 확률
p = 0.8
sorted_logits = [0.4, 0.3, 0.2, 0.1]
cumulative_probs = [0.4, 0.7, 0.9, 1.0]
selected_tokens = [0.4, 0.3] # 누적 확률 0.8 이하인 토큰만 선택
설명: 확률 분포를 조정하여 출력을 더 창의적이거나 더 결정적으로 만듭니다. 온도 ( T )를 사용하여 확률 분포를 다음과 같이 변환합니다:
[
P_i = \frac{\exp\left(\frac{\log P_i}{T}\right)}{\sum_j \exp\left(\frac{\log P_j}{T}\right)}
]
특징: 모델의 출력 스타일을 제어할 수 있습니다.
예시:
logits = [0.1, 0.3, 0.6] # 토큰 확률
T = 0.5
adjusted_logits = [0.1**(1/0.5), 0.3**(1/0.5), 0.6**(1/0.5)]
selected_token = sample(adjusted_logits)
현대의 LLM에서는 Top-k, Top-p, Temperature 등을 결합하여 최적의 출력을 생성합니다.
logits = [0.1, 0.3, 0.6] # 원래 확률
p = 0.8
T = 0.7
filtered_logits = apply_top_p(logits, p)
adjusted_logits = adjust_temperature(filtered_logits, T)
selected_token = sample(adjusted_logits)
이런 다양한 기법은 모델의 목적, 응용 사례, 요구 사항에 따라 유연하게 선택됩니다.