Pythonで学ぶ言語モデルのテキスト生成:TemperatureとTop-k
言語モデルは、次に来うるすべてのトークンにスコア(ロジット)を出します。サンプリングの設定がスコアから選択を決め、temperatureはランダムさを調整し、top-kは上位の候補だけを残します。
やさしい言葉で概念を理解する
言語モデルは、次に来うるすべてのトークンにスコア(ロジット)を出します。サンプリングの設定がスコアから選択を決め、temperatureはランダムさを調整し、top-kは上位の候補だけを残します。
言語モデルが次のトークンをどう選ぶかを、純粋なPythonでlayer normalization、temperature、top-kサンプリングを使って確かめます。
重要なポイント
- temperatureが1未満だと出力は予測しやすく、1より大きいと創造的になります。
- top-kサンプリングは起こりにくいトークンを除き、文章が話題から外れないようにします。
- テキストは1トークンずつ生成され、新しいトークンが毎回入力に戻されます。
- Layer normalizationは、多くの層を通る間も値を安定した範囲に保ちます。
どのような場面で使う?
- ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
- 対応するチャレンジで実装する前に考え方をつかむ。
- 機械学習の講座、面接、プロジェクトに備える。
動かして理解する
サイコロのボタンで次の単語をサンプリングします。temperatureやtop-kを下げると、選択が予測しやすくなります。
サンプルコード
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))
期待される出力
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']
仕組み
layer_norm()はベクトルを平均0・分散1に整えます。Transformerは各ブロックの中でこれを行います。probabilities()はロジットをtemperatureで割ってからSoftmaxを適用するので、temperatureが低いほど一番の単語が選ばれやすくなります。top-kは上位k個以外のスコアをSoftmaxの前にほぼ−∞にします。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- レイヤー正規化 各行を平均 0、分散 1 に正規化してからスケーリングとシフトを行います。すべての Transformer ブロックで使われます。 中級
- 温度と Top-K によるサンプリング 言語モデルと同じように、上位 k 個のロジットを残し、温度を適用してから次のトークンをサンプリングします。 中級