← CS Lab AI & Machine Learning / Beam vs Greedy Search Open standalone ↗

Greedy decoding takes the single best token at every step; beam search keeps the k best partial sequences alive. A language model gives you a probability for every next token — these are two ways to turn that into a finished sentence.

Where you meet it

What it does

It picks which sequence the model actually emits. The model only scores tokens; the decoding strategy searches the exploding tree of continuations and commits to one path. Greedy and beam are the two classic maximization strategies — both try to find the highest-probability sentence, they just search differently wide.

For creative text the high-probability path is the boring one — there you sample, not maximize.

How it works

Greedy is one line of logic: at each step take the argmax token, append it, repeat. Fast, but it commits early — a tempting first token can lock you into a path whose total probability is poor, and it can never take it back.

Beam search hedges. It keeps the k best partial hypotheses (the beam width). Each step it expands all of them by every possible token, scores each new sequence by its total log-probability, then prunes back to the k best. At the end it returns the highest-scoring complete sequence. A slightly weaker start can win if its continuation is strong.

# greedy = argmax at each step
for step in sentence:
    next = argmax(model(tokens))   # local best only

# beam search, width k
beams = [[]]
for step in sentence:
    cand = expand(beams)           # extend each beam by every token
    beams = top_k(cand, key=total_logprob)   # keep k best
best = max(beams, key=total_logprob)

Greedy is exactly beam search with k = 1. Scores use log-probabilities so the products of per-token probabilities become stable sums.

Watch out

  • Beam ≠ global optimum. It is still a heuristic — a wider, not exhaustive, search. Pruning can drop the true best sequence early.
  • Longer = lower score. Each extra token multiplies in another probability, so raw scores favor short sequences. You need a length penalty / normalization to compare hypotheses of different lengths fairly.
  • Bigger beams can get worse. For open-ended generation, maximizing probability yields bland, repetitive text — the high-probability path is generic. Larger beams amplify this.
  • For creative text, don't maximize — sample. Use temperature, top-k, or nucleus (top-p) sampling instead; reserve beam search for input-grounded tasks like translation.

Go deeper

Greedy-Decoding nimmt in jedem Schritt das einzelne Top-Token; Beam Search hält die k besten Teilsequenzen am Leben. Ein Sprachmodell liefert für jedes nächste Token eine Wahrscheinlichkeit — das sind zwei Wege, daraus einen fertigen Satz zu machen.

Wo es vorkommt

Was es tut

Es entscheidet, welche Sequenz das Modell tatsächlich ausgibt. Das Modell bewertet nur Tokens; die Decoding-Strategie durchsucht den explodierenden Baum der Fortsetzungen und legt sich auf einen Pfad fest. Greedy und Beam sind die zwei klassischen Maximierungs-Strategien — beide suchen den wahrscheinlichsten Satz, nur unterschiedlich breit.

Bei kreativem Text ist der hochwahrscheinliche Pfad der langweilige — dort wird gesampelt, nicht maximiert.

Wie es funktioniert

Greedy ist eine Zeile Logik: in jedem Schritt das argmax-Token nehmen, anhängen, wiederholen. Schnell, aber es legt sich früh fest — ein verlockendes erstes Token kann dich auf einen Pfad mit schlechter Gesamt­wahrscheinlichkeit zwingen, ohne Rückweg.

Beam Search hält sich offen. Es behält die k besten Teil-Hypothesen (die Beam-Weite). Pro Schritt erweitert es alle um jedes mögliche Token, bewertet jede neue Sequenz nach ihrer Gesamt-Log-Wahrscheinlichkeit und kürzt auf die k besten. Am Ende gibt es die bestbewertete vollständige Sequenz zurück. Ein etwas schwächerer Start gewinnt, wenn die Fortsetzung stark ist.

# greedy = argmax pro Schritt
for step in sentence:
    next = argmax(model(tokens))   # nur lokales Optimum

# Beam Search, Weite k
beams = [[]]
for step in sentence:
    cand = expand(beams)           # jeden Beam um jedes Token erweitern
    beams = top_k(cand, key=total_logprob)   # k beste behalten
best = max(beams, key=total_logprob)

Greedy ist exakt Beam Search mit k = 1. Gerechnet wird mit Log-Wahrscheinlichkeiten, damit aus den Produkten der Token-Wahrscheinlichkeiten stabile Summen werden.

Worauf achten

  • Beam ≠ globales Optimum. Es bleibt eine Heuristik — eine breitere, keine vollständige Suche. Das Pruning kann die wirklich beste Sequenz früh verwerfen.
  • Länger = schlechterer Score. Jedes weitere Token multipliziert eine weitere Wahrscheinlichkeit hinein, rohe Scores bevorzugen also kurze Sequenzen. Du brauchst eine Length-Penalty / Normalisierung, um verschieden lange Hypothesen fair zu vergleichen.
  • Größere Beams können schlechter werden. Bei offener Generierung liefert Wahrscheinlichkeits-Maximierung faden, wiederholten Text — der hochwahrscheinliche Pfad ist generisch. Breitere Beams verstärken das.
  • Für kreative Texte nicht maximieren — sampeln. Stattdessen Temperature, Top-k oder Nucleus (Top-p) Sampling; Beam Search für input-gebundene Aufgaben wie Übersetzung reservieren.

Mehr dazu

Next up
AI & Machine LearningText Chunking AI & Machine LearningCosine Similarity All concepts →