Top-p Sampling (aka. Nucleus Sampling)

nawnoes·2020년 4월 17일
0

NLP

목록 보기
19/45
post-custom-banner

Nucleus Sampling

GPT-2로 텍스트를 생성하다보면, 랜덤 샘플링이나 Top-k 샘플링 등을 사용해도 문맥이 잘 맞지 않는다고 생각이 된다. 추가로 다른 방법 중 Top-p, Nucleus 샘플링을 찾을 수 있다.

샘플링 방법중 가장 대중적인 방법은 temperature and top-k 샘플링이 있다.

1. Temperature sampling

통계 역학에서 영향을 받은 방법으로, 높은 온도(Temperature)는 낮은 에너지 상태가 발생할 가능성이 높다는 것을 의미한다. 확률 모델에서 로짓(logit)은 에너지를 의미하고, 소프트맥스로 로짓을 입력하기 전에 높은 온도(Temperature)에 따라 로짓을 나누면서 Temperature sampling을 수행한다. 그 후 샘플링된 확률값들을 얻을 수 있다.

import torch
import torch.nn.functional as F

a = torch.tensor([1,2,3,4])
F.softmax(a, dim=0) # tensor([0.0321, 0.0871, 0.2369, 0.6439])
F.softmax(a/.5, dim=0) # tensor([0.0021, 0.0158, 0.1171, 0.8650])
F.softmax(a/1.5, dim=0) # tensor([0.0708, 0.1378, 0.2685, 0.5229])
F.softmax(a/1e-6, dim=0) # tensor([0., 0., 0., 1.])

그림 1

Temp가 낮으면 상위 선택들에 대한 신뢰도는 높아지고, Temp가 1보다 높은 경우 신뢰도가 떨어지게 된다. 반면에 Temp가 1보다 더 큰 경우에는 신뢰도를 떨어뜨린다. 0 Temp에서는 argmax/max likelihood와 동일한 반면, 제한없는 Temp는 균일한 샘플링에 해당한다.

2. Top K 샘플링과 그 단점

Top-K 샘플링은 확률이 높은 순서에 따라 k개의 토큰을 뽑아 그 안에서 샘플링.

하지만 Top-k 샘플링의 경우 경우에 따라서 변하는 분포에도 고정된 k개를 샘플링하므로 적절하지 않은 경우가 존대한다.

3. Top P 샘플링 aka. Nucleus Sampling

위 단점을 해결하기 위해 Top p 샘플링이 제안. 누적분포를 계산하고, 누적 분포 함수가가 사용자가 지정한 PP 값을 초과하면 샘플링.

예를들어, top-p = 0.9 일 때, 그림1에서 위 그림을 보면 고르게 분포된 경우에서는 여러개의 토큰의 분포 값을 합하면 0.9가 될 수 있고, 아래 그림을 보면 'hot'과 'warm'을 합한 것만으로 0.9를 초과할 수 있다. 이런 방법으로 완전히 다른 토큰을 선택하게 되는 문제를 피할 수 있다.

Reference

How to sample from language models

post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 8월 18일

안녕하세요. LLMs을 이용하여 웹앱개발자 과정을 수련 중인 학생이지 AI전문가는 아니여서 질문드립니다.
글의 마지막 문장 "이런 방법으로 완전히 다른 토큰을 선택하게 되는 문제를 피할 수 있다"고 하셨는데요.
우선, 그림1의 가로축, 세로축, 색깔 별 그래프 옆에 있는 숫자들이 이 무얼 의미하는지 기재되어 있지 않기도 어렵기도 해서 캡션에 적힌 [그림 1: Temp가 낮으면 상위 선택들에 대한 신뢰도는 높아지고, Temp가 1보다 높은 경우 신뢰도가 떨어지게 된다. 반면에 Temp가 1보다 더 큰 경우에는 신뢰도를 떨어뜨린다. 0 Temp에서는 argmax/max likelihood와 동일한 반면, 제한없는 Temp는 균일한 샘플링에 해당한다] 이 내용을 이해하지 못한 상태입니다.

이런 상태에서 그 문장 속에서 '완전히 다른 토큰'은 문맥 상 hot과 warm을 제외한 다른 토큰들이라고 생각하는데요.
근데 "I ate the pizza while it was still"이란 미완성 문장을 어떤 사람에게 완성시켜보라고 설문지들을 돌린다면, 개연적으로 awful, disgusting, cold란 단어들도 나올 수 있지 않나요? 대개의 경우엔 hot/warm을 사람들이 쓴다고 해도, 경우에 따라선 "그 피자가 차가운 동안 난 그 피자를 먹었어"라고 말할 수도 있잖아요.
그래서 Top P sampling을 통해 완전히 다른 토큰을 선택하게 되는 문제를 피할 수 있다는 기제가 과연 괜찮은 기제인지 모르겠어요.

제 목적은 Top-p에 대한 같은 질문에 대해 chatgpt-4o-latest와 llama-3-70b-instruct가 상반된 대답을 해서 무엇이 진실인가 확인하고자 직접 웹검색을 하다가 이 글로 진입하게 되었습니다.
ChatGPT는 "If Top P is low, the model might generate more focused and conservative outputs. If Top P is high, the model might produce more varied and creative outputs."라고 하는 반면,
llama는 "A higher Top P value means the model will consider a smaller set of the most likely tokens, resulting in more predictable output. A lower Top P value allows the model to consider a broader range of tokens, leading to more diverse and potentially more creative output."라고 답변했습니다.

그런데 이 글에서 설명하는 원리를 적용해봐도 top-p = 0.9를 적용하더라도 완전히 다른 토큰을 선택하게 되는 문제를 피하니, 상식적이고 일반적인 다음 토큰만 나오게 되고 awful, disgusting, cold같이 완전히 다른 토큰이지만 개연적으론 나올 수는 있는 창의적인 토큰들은 안나온단 거잖아요.
그럼 대체 Top P가 0.9로 높더라도 결과는 보수적인데, 상대적인 0.8로 하면 warm조차도 안나오고 hot만 나올 거잖아요. 그럼 더 보수적이 된다는 거잖아요. 그럼 ChatGPT의 답변이 맞는 것 같긴 하면서도 이 또한 그닥 사실에 근접하게 알맞은 답변은 또 아닌 것 같아 석연치가 않습니다.
대체 ChatGPT가 맞나요, llama가 맞나요?

답글 달기