От 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.