Перейти к содержанию
Educora

Формулы и лайфхаки

Python · 97

Все формулы этого курса и простые способы их запомнить — на одной странице.

1Функции и модулиСредний

Функции

К уроку
F = C · 9/5 + 32F = C · 9/5 + 32
где:
  • Fтемпература в градусах Фаренгейта
  • Cтемпература в градусах Цельсия

Превратим эту формулу в функцию

2Python в деталяхПродвинутый

Итераторы и генераторы

К уроку

Декораторы и замыкания

К уроку

Контекстные менеджеры и оператор with

К уроку

Аннотации типов и dataclasses

К уроку

Продвинутое ООП: специальные методы, свойства и MRO

К уроку

Регулярные выражения: модуль re

К уроку

Асинхронный Python: async и await

К уроку

Пакеты, модули и виртуальные окружения

К уроку

Производительность, O-большое и модуль collections

К уроку

3Веб и автоматизацияПродвинутый

Работа с JSON и CSV

К уроку

Веб-API и библиотека requests

К уроку

Веб-сервис на FastAPI

К уроку

Скрипты автоматизации

К уроку

4Наука о данных: NumPy, pandas, matplotlibУниверситет

Основы NumPy: массивы

К уроку
size = d₁ · d₂ · … · dₙ nbytes = size · itemsize
где:
  • nчисло осей (ndim)
  • dₖдлина по k-й оси (элемент shape)
  • itemsizeразмер одного элемента в байтах: 8 для float64 и int64, 4 для float32 и int32, 1 для bool и int8

Для m формы (2, 3): size = 2 · 3 = 6. Для temps: nbytes = 4 · 8 = 32 байта.

h = (stop − start) / (num − 1) n = ⌈(stop − start) / step⌉h = (stop − start) / (num − 1) n = ⌈(stop − start) / step⌉
где:
  • hшаг между точками linspace
  • nчисло элементов, которые даёт arange
  • ⌈ ⌉округление вверх

np.linspace(0, 1, 5): h = 1 / 4 = 0,25. np.arange(0, 10, 2): n = ⌈10 / 2⌉ = 5 элементов.

x̄ = (1/n) · ∑ xᵢ σ = √( ∑ (xᵢ − x̄)² / (n − ddof) )x̄ = (1/n) · ∑ xᵢ σ = √( ∑ (xᵢ − x̄)² / (n − ddof) )
где:
  • x̄среднее арифметическое (mean)
  • nчисло значений
  • σстандартное отклонение (std): насколько значения в среднем удалены от среднего
  • ddof0 — для генеральной совокупности (по умолчанию в NumPy), 1 — для выборки (несмещённая дисперсия)

np.std по умолчанию делит на n, а учебники статистики и Series.std в pandas — на n − 1. Чтобы получить тот же результат, передай ddof=1.

NumPy: векторизация и линейная алгебра

К уроку
zᵢⱼ = (xᵢⱼ − μⱼ) / σⱼzᵢⱼ = (xᵢⱼ − μⱼ) / σⱼ
где:
  • xᵢⱼj-й признак i-го примера
  • μⱼ, σⱼсреднее и стандартное отклонение j-го столбца
  • zᵢⱼстандартизованное значение (z-оценка): среднее 0, стандартное отклонение 1
cᵢⱼ = ∑ₖ₌₁ⁿ aᵢₖ · bₖⱼ (m × n) @ (n × p) → (m × p)
где:
  • aᵢₖэлемент A в строке i, столбце k
  • bₖⱼэлемент B в строке k, столбце j
  • nобщее число столбцов A и строк B
A = [[a, b], [c, d]]: det A = a·d − b·c A⁻¹ = (1 / det A) · [[d, −b], [−c, a]]A = [[a, b], [c, d]]: det A = a·d − b·c A⁻¹ = (1 / det A) · [[d, −b], [−c, a]]
где:
  • det Aопределитель; если он равен 0, матрица вырождена и обратной нет
  • A⁻¹обратная матрица: A · A⁻¹ = I (единичная матрица)
A · v = λ · v det(A − λ · I) = 0
где:
  • vсобственный вектор (v ≠ 0)
  • λсобственное значение
  • Iединичная матрица

Второе равенство — характеристическое уравнение: система (A − λI)v = 0 имеет ненулевое решение, только если определитель равен 0.

w = (Xᵀ X)⁻¹ Xᵀ y
где:
  • Xматрица признаков n × d (первый столбец — единицы)
  • yвектор целевых значений
  • wкоэффициенты, минимизирующие сумму квадратов ошибок

Основы pandas: Series и DataFrame

К уроку
h = (n − 1) · q Q(q) = x₍ₖ₎ + (h − k) · (x₍ₖ₊₁₎ − x₍ₖ₎), k = ⌊h⌋
где:
  • qуровень: 0,25 (первый квартиль), 0,5 (медиана), 0,75 (третий квартиль)
  • x₍ₖ₎k-е значение после сортировки по возрастанию (счёт с 0)
  • h«дробная позиция» в отсортированных данных

По умолчанию pandas и NumPy вычисляют квантили линейной интерполяцией между двумя соседними значениями.

Анализ данных в pandas

К уроку
x̄_w = ∑ wᵢ · xᵢ / ∑ wᵢx̄_w = ∑ wᵢ · xᵢ / ∑ wᵢ
где:
  • xᵢсреднее i-й группы (например, средний чек)
  • wᵢвес группы — обычно число наблюдений

Взвешенное среднее. В pandas: np.average(x, weights=w) или просто общая сумма, делённая на общее количество.

Δ% = (xₜ − xₜ₋₁) / xₜ₋₁ · 100%Δ% = (xₜ − xₜ₋₁) / xₜ₋₁ · 100%
где:
  • xₜпоказатель текущего периода
  • xₜ₋₁показатель предыдущего периода

Темп роста; в pandas его вычисляет pct_change() (без умножения на 100). У первого периода нет предыдущего значения, поэтому там NaN.

Визуализация в matplotlib

К уроку
k = ⌈log₂ n⌉ + 1 h = 2 · IQR · n^(−1/3)
где:
  • kчисло интервалов (правило Стёрджеса)
  • hширина интервала (правило Фридмана–Диакониса), в единицах данных
  • nчисло наблюдений
  • IQRмежквартильный размах Q3 − Q1

Правило Стёрджеса хорошо для примерно нормальных и не слишком больших данных; правило Фридмана–Диакониса устойчиво к выбросам. ax.hist(x, bins='fd') применяет второе автоматически.

fᵢ = nᵢ / (n · h) ∑ fᵢ · h = 1fᵢ = nᵢ / (n · h) ∑ fᵢ · h = 1
где:
  • nᵢнаблюдения в i-м интервале
  • fᵢвысота столбца при density=True (плотность)
  • hширина интервала

ax.hist(x, density=True) делает сумму площадей столбцов равной 1 — такую гистограмму можно сравнивать с кривой плотности вероятности.

Статистика на Python

К уроку
x̄ = (1/n) · ∑ xᵢ s² = ∑ (xᵢ − x̄)² / (n − 1) s = √s²x̄ = (1/n) · ∑ xᵢ s² = ∑ (xᵢ − x̄)² / (n − 1) s = √s²
где:
  • nобъём выборки
  • s²выборочная дисперсия (единица — квадрат единицы данных)
  • sвыборочное стандартное отклонение (в единицах данных); в NumPy std(ddof=1)
[Q1 − 1,5 · IQR; Q3 + 1,5 · IQR]
где:
  • Q1, Q3первый и третий квартиль (25% и 75%)
  • IQRQ3 − Q1, ширина средней половины данных

Правило Тьюки: значения вне этого интервала считаются выбросами. Здесь: 14,75 + 1,5 · 1,75 = 17,375, значит, 45 — выброс.

f(x) = 1 / (σ · √(2π)) · e^(−(x − μ)² / (2σ²)) z = (x − μ) / σf(x) = 1 / (σ · √(2π)) · e^(−(x − μ)² / (2σ²)) z = (x − μ) / σ
где:
  • μсреднее распределения
  • σстандартное отклонение (σ > 0)
  • f(x)плотность вероятности; P(a < X < b) — площадь под кривой между a и b
  • zz-оценка: положение в стандартном нормальном распределении (μ = 0, σ = 1)
SE = σ / √n ≈ s / √nSE = σ / √n ≈ s / √n
где:
  • SEстандартная ошибка среднего
  • σ, sстандартное отклонение генеральной совокупности и выборки
x̄ ± t* · s / √n, t* = t₁₋α/₂(n − 1)x̄ ± t* · s / √n, t* = t₁₋α/₂(n − 1)
где:
  • t*критическое значение t-распределения; для 95% α = 0,05
  • n − 1число степеней свободы

95%-й доверительный интервал для среднего. stats.t.ppf(0.975, df=n - 1) возвращает t*, а stats.t.interval — весь интервал.

t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)
где:
  • x̄₁, x̄₂средние групп
  • s₁², s₂²выборочные дисперсии групп
  • n₁, n₂объёмы групп

t-статистика Уэлча: разность средних, делённая на её стандартную ошибку. Чем больше |t|, тем меньше p.

r = ∑ (xᵢ − x̄)(yᵢ − ȳ) / √( ∑ (xᵢ − x̄)² · ∑ (yᵢ − ȳ)² )r = ∑ (xᵢ − x̄)(yᵢ − ȳ) / √( ∑ (xᵢ − x̄)² · ∑ (yᵢ − ȳ)² )
где:
  • r−1 ≤ r ≤ 1; знак показывает направление, |r| — силу
  • x̄, ȳсреднее каждой переменной

Машинное обучение в scikit-learn

К уроку
MSE = (1/n) · ∑ (yᵢ − ŷᵢ)² RMSE = √MSE R² = 1 − ∑ (yᵢ − ŷᵢ)² / ∑ (yᵢ − ȳ)²MSE = (1/n) · ∑ (yᵢ − ŷᵢ)² RMSE = √MSE R² = 1 − ∑ (yᵢ − ŷᵢ)² / ∑ (yᵢ − ȳ)²
где:
  • yᵢ, ŷᵢистинное значение и предсказание
  • RMSEтипичная ошибка в единицах целевой переменной (здесь тысячи манатов)
  • R²доля объяснённой вариации: 1 — идеально, 0 — уровень модели, всегда предсказывающей среднее

Модель нашла коэффициенты 1,48 и 11,06 — близко к истинным 1,5 и 12. RMSE ≈ 9,8 — это уровень добавленного шума (σ = 10): модель полностью уловила сигнал, а шум предсказать невозможно.

p = σ(z) = 1 / (1 + e^(−z)), z = w · x + bp = σ(z) = 1 / (1 + e^(−z)), z = w · x + b
где:
  • σ(z)сигмоида: переводит любое число в интервал (0; 1), σ(0) = 0,5
  • pвероятность принадлежности примера к положительному классу; при p ≥ 0,5 предсказывается «1»
G = 1 − ∑ₖ pₖ² Gsplit = (nL / n) · GL + (nR / n) · GRG = 1 − ∑ₖ pₖ² Gsplit = (nL / n) · GL + (nR / n) · GR
где:
  • pₖдоля класса k в узле
  • G0 — узел чистый (один класс); для двух классов максимум 0,5
  • nL, nRчисло примеров в левом и правом дочерних узлах
Accuracy = (TP + TN) / N Precision = TP / (TP + FP) Recall = TP / (TP + FN) F1 = 2 · P · R / (P + R)Accuracy = (TP + TN) / N Precision = TP / (TP + FP) Recall = TP / (TP + FN) F1 = 2 · P · R / (P + R)
где:
  • Precisionкакая доля названных спамом писем действительно спам
  • Recallкакую долю всего спама удалось поймать
  • F1гармоническое среднее precision и recall
  • Nобщее число примеров
CV = (1/k) · ∑ᵢ₌₁ᵏ scoreᵢCV = (1/k) · ∑ᵢ₌₁ᵏ scoreᵢ
где:
  • kчисло блоков, обычно 5 или 10
  • scoreᵢрезультат, когда i-й блок служит тестом

5ИИ и глубокое обучение на PyTorchУниверситет

Основные понятия машинного обучения

К уроку
MSE = (1/n) · ∑ᵢ₌₁ⁿ (yᵢ − ŷᵢ)²MSE = (1/n) · ∑ᵢ₌₁ⁿ (yᵢ − ŷᵢ)²
где:
  • nчисло примеров
  • yᵢистинное значение (метка) i-го примера
  • ŷᵢпредсказание модели

Среднеквадратичная ошибка (mean squared error). Возведение в квадрат сильнее наказывает большие ошибки; единица измерения — квадрат единицы метки.

CE = −∑ₖ₌₁ᴷ yₖ · ln pₖ = −ln pₜ
где:
  • Kчисло классов
  • yₖ1, если класс k правильный, иначе 0 (one-hot)
  • pₖвероятность, которую модель даёт классу k
  • pₜвероятность правильного класса

Перекрёстная энтропия (cross-entropy). Для двух классов: BCE = −[y · ln p + (1 − y) · ln(1 − p)]. Когда вероятность правильного класса стремится к 1, потери стремятся к 0.

θ ← θ − η · ∇L(θ)
где:
  • θвсе параметры модели (веса и смещения)
  • ηскорость обучения, обычно 0,0001–0,1
  • ∇L(θ)градиент — вектор частных производных потерь по каждому параметру

Правило обновления градиентного спуска. Каждое повторение — один шаг; один полный проход по обучающей выборке называется эпохой.

∂L/∂w = (2/n) · ∑ᵢ (ŷᵢ − yᵢ) · xᵢ ∂L/∂b = (2/n) · ∑ᵢ (ŷᵢ − yᵢ)∂L/∂w = (2/n) · ∑ᵢ (ŷᵢ − yᵢ) · xᵢ ∂L/∂b = (2/n) · ∑ᵢ (ŷᵢ − yᵢ)
где:
  • w, bугловой коэффициент (вес) и свободный член (смещение) прямой
  • ŷᵢ − yᵢошибка на i-м примере
E[(y − f̂(x))²] = Bias[f̂(x)]² + Var[f̂(x)] + σ²
где:
  • f̂(x)предсказание модели, обученной на случайной обучающей выборке
  • Biasсмещение: средняя ошибка из-за слишком простых предположений модели
  • Varдисперсия: насколько предсказание зависит от конкретной обучающей выборки
  • σ²неустранимый шум в данных

Разложение MSE на смещение и дисперсию. С ростом сложности модели смещение падает, а дисперсия растёт; лучшая модель минимизирует сумму.

J(θ) = L(θ) + λ · ∑ⱼ θⱼ²
где:
  • λсила регуляризации (гиперпараметр, подбирается на валидации)
  • ∑ⱼ θⱼ²сумма квадратов весов — штрафует большие веса

L2-регуляризация (weight decay): модель предпочитает более «гладкие» функции и меньше склонна запоминать шум.

PyTorch: тензоры

К уроку
numel = d₁ · d₂ · … · dₖ memory = numel · s
где:
  • d₁ … dₖразмеры из shape
  • numelчисло элементов (x.numel())
  • sразмер одного элемента в байтах (x.element_size())
C = A @ B, Cᵢⱼ = ∑ₖ Aᵢₖ · Bₖⱼ, (m × n) @ (n × p) → (m × p)
где:
  • A, Bматрицы размеров m × n и n × p
  • nвнутренний размер — должен совпадать у обеих матриц
  • Cᵢⱼскалярное произведение i-й строки A и j-го столбца B

Матричное умножение — главная операция нейросетей: умножая входы размера (N, D) на матрицу весов (D, K), мы обрабатываем весь пакет за один раз. Для тензоров с большим числом осей @ действует на две последние оси, а остальные считаются пакетными.

PyTorch: autograd и автоматическое дифференцирование

К уроку
dL/dx = dL/dy · dy/dx ∂L/∂w = ∂L/∂ŷ · ∂ŷ/∂wdL/dx = dL/dy · dy/dx ∂L/∂w = ∂L/∂ŷ · ∂ŷ/∂w
где:
  • Lпотери (корень графа)
  • y, ŷпромежуточные значения (внутренние узлы графа)
  • x, wлистья: входы и параметры

Производная сложной функции равна произведению локальных производных. Если переменная влияет на потери по нескольким путям, произведения по всем путям складываются: ∂L/∂x = ∑ₖ ∂L/∂yₖ · ∂yₖ/∂x.

σ(z) = 1 / (1 + e⁻ᶻ) σ′(z) = σ(z) · (1 − σ(z))σ(z) = 1 / (1 + e⁻ᶻ) σ′(z) = σ(z) · (1 − σ(z))
где:
  • σ(z)сигмоида, значения в интервале (0; 1)
  • σ′(z)её производная; максимум 0,25 при z = 0

Доказательство: σ′(z) = e⁻ᶻ / (1 + e⁻ᶻ)² = σ(z) · e⁻ᶻ / (1 + e⁻ᶻ), а последняя дробь равна 1 − σ(z).

PyTorch: построение нейронных сетей

К уроку
z = w · x + b = ∑ᵢ₌₁ⁿ wᵢxᵢ + b a = φ(z)
где:
  • xвходной вектор (n признаков)
  • wвеса — важность каждого входа
  • bсмещение (bias) — сдвигает порог активации
  • φфункция активации (ReLU, сигмоида…)
  • aвыход нейрона (активация)
ReLU(z) = max(0, z) σ(z) = 1 / (1 + e⁻ᶻ) tanh(z) = (eᶻ − e⁻ᶻ) / (eᶻ + e⁻ᶻ)ReLU(z) = max(0, z) σ(z) = 1 / (1 + e⁻ᶻ) tanh(z) = (eᶻ − e⁻ᶻ) / (eᶻ + e⁻ᶻ)
где:
  • ReLUобнуляет отрицательные значения; производная 1 при z > 0 и 0 при z < 0
  • σсигмоида: значения в (0; 1), трактуются как вероятность
  • tanhгиперболический тангенс: значения в (−1; 1), симметричен относительно нуля
softmax(z)ᵢ = eᶻⁱ / ∑ⱼ₌₁ᴷ eᶻʲsoftmax(z)ᵢ = eᶻⁱ / ∑ⱼ₌₁ᴷ eᶻʲ
где:
  • zсырые оценки (логиты) для K классов
  • softmax(z)ᵢвероятность класса i; все положительны и в сумме дают 1

В многоклассовой классификации softmax превращает логиты последнего слоя в распределение вероятностей.

Y = X · Wᵀ + b params = (nin + 1) · nout
где:
  • Xпакет входов, форма (N, nin)
  • Wвеса, форма (nout, nin) — layer.weight
  • bсмещения, форма (nout,) — layer.bias
  • Yвыходы, форма (N, nout)

У каждого выходного нейрона nin весов и одно смещение, поэтому в полносвязном слое (nin + 1) · nout параметров.

PyTorch: цикл обучения модели

К уроку
steps per epoch = ⌈N / B⌉ updates = epochs · ⌈N / B⌉steps per epoch = ⌈N / B⌉ updates = epochs · ⌈N / B⌉
где:
  • Nчисло примеров в обучающей выборке
  • Bразмер пакета (batch size)
  • ⌈ ⌉округление вверх: последний неполный пакет — тоже шаг
L = −zₜ + ln ∑ⱼ₌₁ᴷ eᶻʲ
где:
  • zсырые логиты модели
  • tномер правильного класса

nn.CrossEntropyLoss объединяет log-softmax и перекрёстную энтропию: −ln softmax(z)ₜ = −zₜ + ln ∑ eᶻʲ. Для пакета потери усредняются.

mₜ = β₁·mₜ₋₁ + (1 − β₁)·gₜ vₜ = β₂·vₜ₋₁ + (1 − β₂)·gₜ² θₜ = θₜ₋₁ − η · m̂ₜ / (√v̂ₜ + ε)mₜ = β₁·mₜ₋₁ + (1 − β₁)·gₜ vₜ = β₂·vₜ₋₁ + (1 − β₂)·gₜ² θₜ = θₜ₋₁ − η · m̂ₜ / (√v̂ₜ + ε)
где:
  • gₜградиент на шаге t
  • mₜ, vₜскользящие средние градиента и его квадрата (импульс и масштаб)
  • m̂ₜ, v̂ₜзначения с поправкой на смещение: mₜ/(1 − β₁ᵗ), vₜ/(1 − β₂ᵗ)
  • β₁, β₂, ε, ηв PyTorch по умолчанию 0,9; 0,999; 10⁻⁸; 0,001

Оптимизатор Adam. Каждый параметр получает свой размер шага: параметр с постоянно большими градиентами обновляется осторожно, с маленькими — смелее. SGD с импульсом (momentum) работает по формуле v ← μ·v + g, θ ← θ − η·v.

accuracy = (1/N) · ∑ᵢ [argmax(zᵢ) = yᵢ]accuracy = (1/N) · ∑ᵢ [argmax(zᵢ) = yᵢ]
где:
  • argmax(zᵢ)класс с наибольшим логитом для i-го примера — предсказание
  • [ … ]1, если условие выполнено, иначе 0

Свёрточные нейронные сети (CNN)

К уроку
x′ = (x − μ) / σx′ = (x − μ) / σ
где:
  • xзначение пикселя в [0; 1]
  • μ, σсреднее и стандартное отклонение канала по обучающей выборке (для MNIST 0,1307 и 0,3081)

После нормализации входы примерно центрированы около нуля и имеют единичный масштаб — это ускоряет градиентный спуск.

Y[i, j] = ∑ₘ ∑ₙ X[i + m, j + n] · K[m, n] + b
где:
  • Xвходное изображение (или карта предыдущего слоя)
  • Kфильтр K × K — обучаемые веса
  • bсмещение фильтра
  • Y[i, j]элемент (i, j) карты признаков

Двумерная свёртка для одного канала. При нескольких входных каналах сумма берётся и по каналам.

O = ⌊(W − K + 2P) / S⌋ + 1O = ⌊(W − K + 2P) / S⌋ + 1
где:
  • Wширина (или высота) входа в пикселях
  • Kразмер ядра
  • Pдополнение (padding): нулевые пиксели по краям
  • Sшаг (stride): на сколько пикселей сдвигается фильтр
  • Oширина выхода; ⌊ ⌋ — округление вниз

Формула размера выхода; для высоты — то же самое. Для пулинга обычно P = 0 и S = K.

params = (K · K · Cin + 1) · Cout
где:
  • Cin, Coutчисло входных и выходных каналов

Число параметров свёрточного слоя не зависит от размера изображения — веса общие для всех позиций.

Трансформеры и большие языковые модели

К уроку
Q = X · WQ K = X · WK V = X · WV
где:
  • Xвекторы токенов формы (T, d)
  • WQ, WK, WVобучаемые матрицы (d, dₖ)
Attention(Q, K, V) = softmax(Q · Kᵀ / √dₖ) · VAttention(Q, K, V) = softmax(Q · Kᵀ / √dₖ) · V
где:
  • Q · Kᵀматрица оценок (T, T): сходство каждого запроса с каждым ключом
  • √dₖмасштабный множитель, dₖ — размерность ключа
  • softmaxприменяется по строкам: веса внимания положительны и в сумме дают 1
  • Vзначения; результат — их взвешенное среднее

Масштабированное скалярное внимание (scaled dot-product attention).

MultiHead(X) = Concat(head₁, …, headₕ) · WO, headᵢ = Attention(X·WQⁱ, X·WKⁱ, X·WVⁱ)
где:
  • hчисло голов; размер каждой головы d / h
  • WOматрица (d, d), смешивающая объединённые выходы голов

Каждая голова может научиться следить за своим типом связи: одна — за грамматическими связями, другая — за тем, к чему относится местоимение. Параметры: 4 · d² весов и 4 · d смещений для WQ, WK, WV, WO.

PE(pos, 2i) = sin(pos / 10000^(2i/d)) PE(pos, 2i + 1) = cos(pos / 10000^(2i/d))PE(pos, 2i) = sin(pos / 10000^(2i/d)) PE(pos, 2i + 1) = cos(pos / 10000^(2i/d))
где:
  • posпозиция токена: 0, 1, 2, …
  • iномер пары компонент; малые i колеблются быстро, большие — медленно
  • dразмерность эмбеддинга
L = −(1/T) · ∑ₜ₌₁ᵀ ln p(xₜ₊₁ | x₁, …, xₜ) PPL = eᴸL = −(1/T) · ∑ₜ₌₁ᵀ ln p(xₜ₊₁ | x₁, …, xₜ) PPL = eᴸ
где:
  • xₜt-й токен текста
  • p(xₜ₊₁ | x₁, …, xₜ)вероятность, которую модель даёт правильному следующему токену при известных предыдущих
  • PPLперплексия; чем меньше, тем лучше модель
pᵢ = exp(zᵢ / τ) / ∑ⱼ exp(zⱼ / τ)pᵢ = exp(zᵢ / τ) / ∑ⱼ exp(zⱼ / τ)
где:
  • τтемпература: τ < 1 — более уверенный и однообразный текст, τ > 1 — более разнообразный и рискованный

Выбор следующего токена через softmax с температурой.