Tutte le sfide
Media 0 risolte 0% di accettazione

Campionamento con temperatura e top-k

Scegli il token successivo come un modello linguistico: tieni i k logit più alti, applica la temperatura e campiona.

Cosa imparerai

  • Tenere i k token candidati migliori
  • Controllare la casualità con la temperatura
  • Campionare da una distribuzione di probabilità

Problema

I modelli linguistici scelgono il token successivo da una distribuzione di probabilità. Due impostazioni le danno forma:

  • 'Top-k: tieni solo i k token con i logit più alti (a parità di logit, l''indice minore viene prima).'
  • 'Temperatura T: dividi i logit tenuti per T prima del softmax. Una T bassa rende la scelta più prevedibile, una T alta più casuale.'

Per rendere il campionamento verificabile, il numero casuale viene fornito:

  1. Tieni i token del top-k ed elencali per indice originale (crescente).
  2. Calcola softmax(logit / T) sui token tenuti (sottrai il maggiore prima di calcolare e^x).
  3. Scorri la lista sommando le probabilità; restituisci l'indice del primo token in cui il totale cumulato supera random_value. Se non succede mai (arrotondamento), restituisci l'ultimo token tenuto.

Con k = 1 è la decodifica greedy: sempre il token più probabile.

Implementa sample_token(logits, temperature, k, random_value).

Input

logits: Un punteggio per ogni token del vocabolario.

temperature: T, maggiore di 0.

k: Quanti token migliori tenere.

random_value: Un numero casuale in [0, 1).

Output

Restituisci l'indice del token scelto.

Vincoli

1 ≤ k ≤ numero di logit ≤ 1.000

0 < temperature ≤ 100, 0 ≤ random_value < 1

-100 ≤ ogni logit ≤ 100

Esempi

Esempio 1
Input:
k = 1
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
random_value = 0.99

Output atteso:
expected = 1
Input:
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;

Output atteso:
long long expected = 1;
Input:
long k = 1;
double[] logits = new double[] {1.0, 3.0, 2.0, 0.5};
double temperature = 1.0;
double random_value = 0.99;

Output atteso:
long expected = 1;

Spiegazione

k = 1 tiene solo il logit più alto, 3.0 all'indice 1. La sua probabilità è 1, quindi viene scelto qualunque sia il numero casuale: decodifica greedy.

Esempio 2
Input:
k = 2
logits = [2.0, 1.0, 0.0]
temperature = 1.0
random_value = 0.8

Output atteso:
expected = 1
Input:
long long k = 2;
std::vector<double> logits = {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

Output atteso:
long long expected = 1;
Input:
long k = 2;
double[] logits = new double[] {2.0, 1.0, 0.0};
double temperature = 1.0;
double random_value = 0.8;

Output atteso:
long expected = 1;

Spiegazione

Il top-2 tiene gli indici 0 e 1 (logit 2 e 1). Il softmax dà circa 0.731 e 0.269. Il totale cumulato è 0.731 dopo l'indice 0 (non supera 0.8) e 1 dopo l'indice 1, quindi viene scelto l'indice 1.

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.