Come i modelli linguistici generano testo: temperature e top-k in Python
Un modello linguistico produce un punteggio (logit) per ogni possibile token successivo. Le impostazioni di campionamento decidono come quei punteggi diventano una scelta; la temperature controlla la casualità e top-k tiene solo i candidati migliori.
Il concetto in parole semplici
Un modello linguistico produce un punteggio (logit) per ogni possibile token successivo. Le impostazioni di campionamento decidono come quei punteggi diventano una scelta; la temperature controlla la casualità e top-k tiene solo i candidati migliori.
Guarda come un modello linguistico sceglie il token successivo: layer normalization, temperature e campionamento top-k in Python puro.
Idee chiave
- Una temperature sotto 1 rende l'output più prevedibile; sopra 1 più creativo.
- Il campionamento top-k elimina i token improbabili così il testo resta in tema.
- Il testo si genera un token alla volta, e ogni nuovo token torna come input.
- La layer normalization mantiene i valori in un intervallo stabile attraverso molti strati.
Quando si usa?
- Capire cosa succede dentro le reti neurali e le librerie di IA.
- Imparare l'idea prima di implementarla nelle sfide corrispondenti.
- Prepararti a corsi di machine learning, colloqui e progetti.
Guardalo in azione
Premi il dado per estrarre la parola successiva. Abbassa temperature o top-k per rendere la scelta più prevedibile.
Codice di esempio
import math
import random
# Layer normalization rescales a vector to mean 0 and variance 1.
def layer_norm(x, eps=1e-5):
mean = sum(x) / len(x)
var = sum((v - mean) ** 2 for v in x) / len(x)
return [(v - mean) / math.sqrt(var + eps) for v in x]
print("layer norm:", [round(v, 3) for v in layer_norm([2.0, 4.0, 6.0, 8.0])])
# Next-token scores from a model; temperature and top-k shape the choice.
words = ["cat", "dog", "car", "sky"]
logits = [2.0, 1.5, 0.3, -1.0]
def probabilities(temperature=1.0, top_k=None):
scores = [l / temperature for l in logits]
if top_k: # keep only the k best scores
cutoff = sorted(scores, reverse=True)[top_k - 1]
scores = [s if s >= cutoff else -1e9 for s in scores]
exps = [math.exp(s - max(scores)) for s in scores]
return [e / sum(exps) for e in exps]
for t, k in [(1.0, None), (0.5, None), (1.0, 2)]:
print(f"temperature={t} top_k={k}:", [round(p, 2) for p in probabilities(t, k)])
random.seed(7)
print("sampled:", random.choices(words, weights=probabilities(0.8, 3), k=5))
Output previsto
layer norm: [-1.342, -0.447, 0.447, 1.342]
temperature=1.0 top_k=None: [0.54, 0.33, 0.1, 0.03]
temperature=0.5 top_k=None: [0.71, 0.26, 0.02, 0.0]
temperature=1.0 top_k=2: [0.62, 0.38, 0.0, 0.0]
sampled: ['cat', 'cat', 'dog', 'cat', 'cat']
Come funziona
layer_norm() riscala un vettore a media 0 e varianza 1, come fanno i Transformer in ogni blocco. probabilities() divide i logit per la temperature e applica softmax, quindi una temperature bassa rende più probabile la parola migliore. Top-k porta quasi a −∞ tutti i punteggi fuori dai migliori k prima del softmax.
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi pratici
Modifica gli input e verifica i casi limite prima di usare dataset più grandi.
- Cambia gli input o i pesi e prevedi l'output prima di eseguire.
- Stampa i valori intermedi per seguire ogni passo del calcolo.
- Risolvi le sfide collegate qui sotto per implementare l'idea da solo.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Normalizzazione di layer Normalizza ogni riga a media 0 e varianza 1, poi scala e trasla, come fa ogni blocco Transformer. Media
- 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. Media