모든 챌린지
보통 0명 해결 정답률 0%

온도와 Top-K 샘플링

언어 모델처럼 다음 토큰을 고릅니다: 상위 k개 로짓을 남기고 온도를 적용한 뒤 샘플링합니다.

배우게 될 내용

  • 상위 k개 후보 토큰 남기기
  • 온도로 무작위성 조절하기
  • 확률 분포에서 샘플링하기

문제

원문 보기 (영어)

언어 모델은 확률 분포에서 다음 토큰을 고릅니다. 두 가지 설정이 분포의 모양을 정합니다.

  • 'Top-k: 로짓이 가장 높은 k개의 토큰만 남깁니다 (로짓이 같으면 인덱스가 작은 쪽이 더 높은 순위).'
  • '온도 T: 소프트맥스 전에 남긴 로짓을 T로 나눕니다. T가 낮으면 선택이 예측 가능해지고, T가 높으면 더 무작위가 됩니다.'

테스트할 수 있도록 난수가 주어집니다.

  1. 상위 k개 토큰을 남기고, 원래 인덱스의 오름차순으로 나열합니다.
  2. 남긴 토큰에 대해 softmax(logit / T)를 계산합니다 (e^x를 계산하기 전에 가장 큰 값을 뺍니다).
  3. 목록을 따라가며 확률을 더하고, 누적 합이 random_value보다 처음으로 커지는 토큰의 인덱스를 반환합니다. 아무것도 넘지 않으면(반올림 오차) 마지막으로 남긴 토큰을 반환합니다.

k = 1이면 탐욕적 디코딩, 즉 항상 가장 가능성 높은 토큰을 고릅니다.

sample_token(logits, temperature, k, random_value)를 구현하세요.

입력

logits: 어휘의 토큰마다 하나의 점수.

temperature: T, 0보다 큼.

k: 남길 상위 토큰 수.

random_value: [0, 1) 범위의 난수.

출력

선택된 토큰의 인덱스를 반환하세요.

제약 조건

1 ≤ k ≤ 로짓 수 ≤ 1,000

0 < temperature ≤ 100, 0 ≤ random_value < 1

-100 ≤ 각 로짓 ≤ 100

예시

예시 1
입력:
k = 1
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
random_value = 0.99

예상 출력:
expected = 1
입력:
long long k = 1;
std::vector<double> logits = {1.0, 3.0, 2.0, 0.5};
double temperature = 1.0;
double random_value = 0.99;

예상 출력:
long long expected = 1;
입력:
long k = 1;
double[] logits = new double[] {1.0, 3.0, 2.0, 0.5};
double temperature = 1.0;
double random_value = 0.99;

예상 출력:
long expected = 1;

설명

k = 1이면 가장 높은 로짓, 인덱스 1의 3.0만 남습니다. 확률이 1이므로 난수와 상관없이 선택됩니다: 탐욕적 디코딩입니다.

예시 2
입력:
k = 2
logits = [2.0, 1.0, 0.0]
temperature = 1.0
random_value = 0.8

예상 출력:
expected = 1
입력:
long long k = 2;
std::vector<double> logits = {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

예상 출력:
long long expected = 1;
입력:
long k = 2;
double[] logits = new double[] {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

예상 출력:
long expected = 1;

설명

Top-2는 인덱스 0과 1(로짓 2와 1)을 남깁니다. 소프트맥스는 약 0.731과 0.269입니다. 누적 합은 인덱스 0 다음에 0.731(0.8을 넘지 않음), 인덱스 1 다음에 1이므로 인덱스 1이 선택됩니다.

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.