От n-грамм к нейросетям: краткая предыстория

Короткий экскурс: идея предсказывать следующее слово старая, но способы это делать менялись радикально — и от них зависело качество.

N-грамма — это последовательность из n подряд идущих токенов; n-граммная модель предсказывает следующий токен только по последним n−1 токенам.

Эпоха n-грамм: считаем частоты

Самый ранний подход — чистая статистика. Берём огромный текст и считаем: после слов «съел вкусное» чаще всего идёт «яблоко». Это и есть n-граммная модель: вероятность следующего слова оценивается частотой в корпусе. Мы уже видели биграммную модель в прошлом уроке. Усложним до триграмм — учёта двух предыдущих слов.

from collections import defaultdict, Counter
import random
random.seed(7)

corpus = (
    "солнце светит ярко солнце греет землю ветер дует сильно "
    "ветер несёт тучи дождь идёт долго дождь поливает землю"
).split()

bigram = defaultdict(Counter)
for a, b in zip(corpus, corpus[1:]):
    bigram[a][b] += 1

def next_token(word):
    options = bigram.get(word)
    if not options:
        return None
    words = list(options.keys())
    weights = list(options.values())
    return random.choices(words, weights=weights, k=1)[0]

# Авторегрессия: начинаем с одного слова и дописываем по одному токену.
word = "солнце"
result = [word]
for _ in range(6):
    word = next_token(word)
    if word is None:
        break
    result.append(word)

print("Сгенерировано (токен за токеном):")
print(" ", " ".join(result))

Вывод:

Сгенерировано (токен за токеном):
  солнце светит ярко солнце светит ярко солнце

Обратите внимание на вывод: модель быстро зацикливается («солнце светит ярко солнце светит ярко»). Это типичная болезнь простых моделей — у них нет «памяти» дальше пары слов, поэтому связный длинный текст им не под силу.

Где n-граммы упёрлись в стену

У частотного подхода два смертельных недостатка:

ПроблемаСуть
Короткая памятьУчитываются лишь 1–2 предыдущих слова; связь между началом и концом предложения теряется.
Комбинаторный взрывЧисло возможных 5-грамм астрономическое; большинство сочетаний в корпусе вообще не встречалось — вероятность ноль.
Нет обобщения«кошка спит» и «котёнок дремлет» для модели — совершенно разные события, общего смысла она не видит.

Нейросети: от слов к векторам

Прорыв случился, когда слова заменили на векторы (эмбеддинги) — об этом будет целый раздел. Близкие по смыслу слова получили близкие векторы, и модель научилась обобщать: выучив «кошка спит», она лучше предсказывает и «котёнок дремлет». Рекуррентные сети (RNN, LSTM) добавили память: они пробегали текст слово за словом, накапливая «состояние». Но и у них была беда — длинные зависимости размывались, а обучение шло строго последовательно и медленно.

Трансформер всё изменил

В 2017 году появилась архитектура Transformer с механизмом внимания (attention). Она позволила каждому токену напрямую «смотреть» на любой другой токен в контексте, сколь угодно далёкий, и при этом обрабатывать всю последовательность параллельно. Это сняло оба ограничения RNN — и память, и скорость. Именно трансформер лежит в основе GPT, Claude и всех современных LLM. Ему посвящены разделы 3 и 4.

Итог

  • N-граммы предсказывают слово по частоте в корпусе — просто, но память короткая и нет обобщения.
  • Эмбеддинги дали словам «смысл» в виде близких векторов и способность обобщать.
  • RNN/LSTM добавили память, но обучались медленно и теряли длинные связи.
  • Трансформер с механизмом внимания снял оба ограничения и стал фундаментом LLM.
Проверьте себя
1. Главная слабость n-граммных моделей — это…
Aслишком большое потребление видеопамяти
Bочень короткая память: учитываются лишь несколько предыдущих слов
Cневозможность работать с английским языком
Dнеобходимость в GPU
2. Что дали эмбеддинги по сравнению с подсчётом частот слов?
AВозможность обобщать: близкие по смыслу слова получают близкие векторы
BУскорение записи на диск
CПолный отказ от обучения
DГарантию отсутствия ошибок
3. Чем трансформер принципиально превзошёл RNN?
AОн не требует данных для обучения
BКаждый токен может напрямую смотреть на любой другой, а вычисления идут параллельно
CОн работает без матриц
DОн меньше по размеру
Поддержать проект