Концепции ИИ на Python

Как языковые модели генерируют текст: temperature и top-k на Python

Языковая модель выдаёт оценку (логит) для каждого возможного следующего токена. Настройки сэмплирования решают, как из этих оценок получается выбор; temperature управляет случайностью, а top-k оставляет только лучших кандидатов.

Суть простыми словами

Языковая модель выдаёт оценку (логит) для каждого возможного следующего токена. Настройки сэмплирования решают, как из этих оценок получается выбор; temperature управляет случайностью, а top-k оставляет только лучших кандидатов.

Посмотрите, как языковая модель выбирает следующий токен: layer normalization, temperature и top-k сэмплирование на чистом Python.

Главные идеи

  • Temperature меньше 1 делает вывод предсказуемее, больше 1 - креативнее.
  • Top-k сэмплирование отбрасывает маловероятные токены, чтобы текст не уходил от темы.
  • Текст генерируется по одному токену, и каждый новый токен снова подаётся на вход.
  • Layer normalization удерживает значения в стабильном диапазоне при прохождении через много слоёв.

Когда это использовать?

  • Понять, что происходит внутри нейронных сетей и библиотек ИИ.
  • Разобраться в идее до того, как реализовать её в соответствующих задачах.
  • Подготовиться к курсам по машинному обучению, собеседованиям и проектам.

Посмотрите в действии

Нажмите на кубик, чтобы выбрать следующее слово. Уменьшите temperature или top-k, чтобы выбор стал предсказуемее.

Пример кода

Запустить код →
main.py
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 перед softmax делает почти −∞ все оценки за пределами лучших k.

Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.

Практические задания

Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.

  1. Измените входные данные или веса и предскажите результат до запуска.
  2. Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
  3. Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Запустить в Python IDE →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи