0Pricing
AI Prompt Engineering · レッスン

Top-kサンプリング

選択肢を確率の高いk個のトークンに限定し、出力の多様性に与える影響を学びます。

「Top-kサンプリング」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

Top-kサンプリングとは

Top-kサンプリングでは、各ステップで最も確率の高いk個のトークンだけを対象にサンプリングします。top-kの外側にあるすべてのトークンには確率0が割り当てられ、選択できなくなります。

k=1はgreedy decoding(最も確率の高いトークン1つだけを選ぶ方法)です。k=50はクリエイティブな生成で一般的な範囲です。k=vocabulary_sizeは制限なしのサンプリングと同等です。

Top-kアルゴリズム

アルゴリズムはtop-pより単純です。

  1. 語彙全体に対するsoftmax確率を計算する
  2. 確率の降順にトークンを並べ替える
  3. 上位k個のトークンだけを残し、それ以外をすべて0にする
  4. 上位k個の確率の合計が1になるよう再正規化する
  5. 再正規化した分布からサンプリングする
import numpy as np

def softmax(logits, temperature=1.0):
    scaled = logits / temperature
    e = np.exp(scaled - np.max(scaled))
    return e / e.sum()

def top_k_sample(logits, k=50, temperature=1.0):
    probs = softmax(logits, temperature)

    # Find top-k indices
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]

    # Renormalize
    top_k_probs = top_k_probs / top_k_probs.sum()

    # Sample
    chosen = np.random.choice(top_k_indices, p=top_k_probs)
    return chosen

# With a 10-token vocabulary:
logits = np.random.randn(10)
print('Chosen token:', top_k_sample(logits, k=3))

k=1:Greedy Decoding

k=1の場合、候補集合に含まれるのは最も確率の高い1つのトークンだけです。サイズ1の集合からのサンプリングは決定的であり、モデルは常にそのトークンを選択します。これはgreedy decoding(temperature=0)と同じです。

logits = np.array([3.0, 2.0, 1.0, 0.5, -1.0])

# k=1: greedy
top_1 = top_k_sample(logits, k=1)
print(f'k=1 always picks: {np.argmax(logits)}')  # index 0, the highest logit
print(f'top_k_sample result: {top_1}')  # always 0

# Multiple runs
for _ in range(5):
    print(top_k_sample(logits, k=1), end=' ')
# Output: 0 0 0 0 0 — perfectly deterministic

典型的なクリエイティブ範囲:k=50

k=50は、クリエイティブなテキスト生成でよく使われるデフォルト値です。各ステップで50個のトークンを探索できる一方、モデルの確信度が非常に低いトークンを選択することを防ぎます。

語彙が50,000トークンの場合、k=50では各ステップで上位0.1%のトークンだけをモデルが考慮します。これは大幅な制限であり、語彙の大部分が除外されます。

import openai
client = openai.OpenAI(api_key='sk-...')

# Note: OpenAI API does not expose top_k directly in chat completions.
# Top-k is primarily a parameter in Hugging Face Transformers and Anthropic's API.

# Hugging Face example:
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
output = generator(
    'Once upon a time',
    max_new_tokens=100,
    do_sample=True,
    top_k=50,
    temperature=1.0
)
print(output[0]['generated_text'])

AnthropicのClaude APIでのTop-k

AnthropicのClaude APIでは、直接指定できるパラメーターとして top_k が公開されています。これにより、固定された語彙の切り詰めがClaudeの出力に与える影響を簡単に試すことができます。

import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')

# top_k limits the number of tokens considered
message = claude.messages.create(
    model='claude-opus-4-5',
    max_tokens=256,
    temperature=1.0,
    top_k=50,  # sample from top 50 most probable tokens
    messages=[{
        'role': 'user',
        'content': 'Write a short poem about debugging code.'
    }]
)
print(message.content[0].text)

固定kの問題

Top-kの根本的な制限は、そのステップでのモデルの確信度に関係なく、kが固定されていることです。

モデルの確信度が非常に高い場合(1つのトークンの確率が95%の場合)でも、k=50ではほとんど無関係な49個のトークンが含まれます。モデルが非常に不確かな場合(50個のトークンがそれぞれ約2%の確率を持つ場合)には、k=50が実際に適切なこともあります。

問題は、文脈によってk=50が制限しすぎる場合と、許容しすぎる場合の両方があることです。Top-pは、nucleusのサイズを動的にすることでこの問題に対処します。

# Illustrating the fixed-k problem
logits_confident = np.array([5.0] + [0.1] * 9)  # model is very sure
logits_uncertain = np.array([1.0] * 10)           # model has no idea

probs_conf = softmax(logits_confident)
probs_unc = softmax(logits_uncertain)

print('Confident — top 3 tokens cover:', np.sort(probs_conf)[::-1][:3].sum().round(3))
# ~0.998 — k=50 is extremely wasteful, includes near-zero probability tokens

print('Uncertain — top 3 tokens cover:', np.sort(probs_unc)[::-1][:3].sum().round(3))
# ~0.30 — k=50 may actually be needed to cover a reasonable nucleus

分布の裾野におけるTop-k

Top-kとtop-pの違いが最も大きく現れるのは、分布の裾野です。

  • top-k=50では、50番目のトークンの確率が0.001%である可能性があります(極めて低確率ですが、候補集合には含まれます)
  • top-p=0.9では、90%のnucleusの外側にあるトークンはすべて除外されます — top-kなら含まれるトークンも含まれます

Top-pは、順位上の位置ではなく確率に基づいて低確率のトークンを除外するため、裾野の扱いにおいてより原理に忠実です。

# Tail behavior comparison
import numpy as np

# Highly skewed distribution (one dominant token)
skewed_logits = np.array([4.0, 2.0, 1.5, 1.0, 0.5,
                           0.1, 0.0, -0.1, -0.5, -1.0])
probs = softmax(skewed_logits)

print('Probability of tokens 6-9 (tail):')
for i in range(6, 10):
    print(f'  Token {i}: {probs[i]:.4%}')
# These tokens are very unlikely but are included in top-k=10
# Top-p=0.9 would exclude them entirely

Top-kとTop-pの組み合わせ

実装によっては、top-kとtop-pの両方を適用します。まずtop-kに切り詰め、その集合内でtop-p nucleus samplingを適用します。これにより、語彙サイズに対する厳格な上限(top-k)と、確率に基づくフィルタリング(top-p)を同時に適用できます。

def top_k_top_p_sample(logits, k=50, p=0.9, temperature=1.0):
    probs = softmax(logits, temperature)

    # First apply top-k
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]

    # Then apply top-p within top-k
    sorted_k = np.sort(top_k_probs)[::-1]
    cumulative = np.cumsum(sorted_k)
    nucleus_size = np.searchsorted(cumulative, p) + 1

    final_indices = top_k_indices[:nucleus_size]
    final_probs = top_k_probs[:nucleus_size]
    final_probs = final_probs / final_probs.sum()

    return np.random.choice(final_indices, p=final_probs)

Top-pよりTop-kが好まれる場合

Top-pには理論上の利点がありますが、次のような状況ではtop-kが好まれます。

  • 語彙が制約されたタスク: モデルが固定された集合からのみ出力すべき場合(例:A/B/C/Dの選択肢問題)、小さなtop-k(4)でこれを直接強制できる
  • 再現性: top-kの動作は「常に正確に50個のトークンを考慮する」と説明しやすい
  • ハードウェア最適化された実装: 一部の推論エンジンでは、top-pよりもtop-kのほうが効率的に実装されている
# Constrained output with top-k=4
# For a multiple choice task (A, B, C, D)
# If A/B/C/D tokens have indices 32, 33, 34, 35
# top-k=4 with those as the top-4 logits forces selection from those 4 only

multiple_choice_prompt = (
    'Answer with only A, B, C, or D.\n'
    'What is the capital of France?\n'
    'A) Berlin\n'
    'B) Paris\n'
    'C) Rome\n'
    'D) Madrid\n'
    'Answer:'
)

# With temperature=0, top_k=1: always picks the highest logit token

Top-kの実用的なガイドライン

top-kを使用する場面と値の選び方:

  • k=1: greedy/事実に関するタスク
  • k=5–20: 集中的なクリエイティブ・タスク、変化は最小限
  • k=40–100: ほとんどの言語モデルで標準的なクリエイティブ範囲
  • k=500以上: 非常に開かれた探索(必要になることはまれで、代わりにtop-pを使用する)

現代のほとんどのLLM APIでは、top-pが推奨されるパラメーターです。語彙数に厳格な上限が必要な場合や、APIがtop-pではなくtop-kを公開している場合にtop-kを使用してください。

TOP_K_GUIDELINES = {
    'factual_qa': 1,           # greedy
    'code_generation': 10,     # near-greedy, correct syntax
    'summarization': 20,       # slightly varied but focused
    'chat': 50,                # natural variation
    'creative_writing': 100,   # wider vocabulary exploration
    'poetry': 200,             # unusual word choices encouraged
}

def call_with_top_k(task, prompt, model='claude-opus-4-5'):
    k = TOP_K_GUIDELINES.get(task, 50)
    claude = anthropic.Anthropic(api_key='sk-ant-...')
    return claude.messages.create(
        model=model,
        max_tokens=512,
        top_k=k,
        messages=[{'role': 'user', 'content': prompt}]
    )

Top-kとtemperatureの併用

Top-kとtemperatureは順番に適用されます。まずtemperatureでロジット分布の形を変え、その後top-kで確率の高いk個のトークンに切り詰めます。両方を組み合わせて使う方法は、Hugging Face Transformersのパイプラインで一般的です。

典型的な組み合わせは、temperature=0.9(適度な多様性)+ top_k=50(語彙に対する厳格な上限)です。これにより、高いtemperatureだけを使った場合の平坦化と、確率分布の裾からサンプリングする問題の両方を避けられます。

from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')

# Combined top-k + temperature
output = generator(
    'The future of AI is',
    max_new_tokens=80,
    do_sample=True,
    top_k=50,
    temperature=0.9
)
print(output[0]['generated_text'])

# Compare: top-k=1 (greedy)
greedy_output = generator(
    'The future of AI is',
    max_new_tokens=80,
    do_sample=False  # greedy, equivalent to top_k=1
)
print(greedy_output[0]['generated_text'])

理解度チェック

top-kサンプリングでk=1に設定した場合、モデルはどのような動作をしますか?

まとめ:Top-kサンプリング

Top-kサンプリングでは、サンプリングの前に語彙を確率の高いk個のトークンに切り詰めます。

  • k=1:貪欲デコード — 決定論的に、常に最上位のトークンを選択します
  • k=50:一般的な創造性の範囲 — 多様性と一貫性のバランスが取れます
  • 主な制限:モデルの確信度に関係なくkが固定されるため、許容範囲が広すぎたり狭すぎたりする場合があります
  • top-pとの違い:top-pの動的なnucleusは確信度に適応しますが、top-kは適応しません

語彙に厳格な上限を設ける必要がある場合はtop-kを使用してください。ほとんどの本番アプリケーションではtop-pを優先してください。次のレッスンでは、具体的なユースケースに合わせたパラメータの選び方を学びます。

よくある質問

「Top-kサンプリング」レッスンは無料ですか?

はい。「Top-kサンプリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。

「Top-kサンプリング」で何を学びますか?

選択肢を確率の高いk個のトークンに限定し、出力の多様性に与える影響を学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Prompt Engineeringを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Top-kサンプリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. LLMにおけるTemperatureとは
  2. Top-p(Nucleus)サンプリング
  3. Top-kサンプリング
  4. ユースケースに合わせたパラメータ選択
← AI Prompt Engineeringに戻る