За счет чего трансформеры получили преимущество
Что проверяют
Понимаете ли вы, какие ограничения RNN и LSTM сняла архитектура 2017 года, и можете ли назвать её цену. Следом обычно просят объяснить self-attention на пальцах или спрашивают, откуда у трансформера квадратичная сложность по длине.
Как отвечать
Преимущество складывается из нескольких вещей, и полезно разделять обучение и инференс:
- параллельность при обучении: RNN обрабатывает токены по одному, состояние шага
tзависит от шагаt-1. Трансформер считает все позиции сразу матричными умножениями, а это ровно то, что хорошо загружает GPU; - короткий путь между токенами: в self-attention любой токен напрямую смотрит на любой другой, путь сигнала O(1). В RNN информация идёт через всю цепочку, отсюда затухание градиентов и потеря дальнего контекста;
- глубина: residual-связи и LayerNorm позволяют стабильно обучать десятки слоёв;
- масштабирование: качество предсказуемо растёт с числом параметров, данных и вычислений, это описано в работах о scaling laws (Kaplan и др., Chinchilla). Вместе с предобучением на неразмеченных текстах (MLM у BERT, предсказание следующего токена у GPT) это и дало скачок;
- универсальность: та же архитектура работает с изображениями (ViT), аудио и мультимодальными данными.
Назовите и цену. Attention стоит O(n²) по памяти и вычислениям от длины контекста, отсюда FlashAttention, скользящие окна и другие приёмы. Порядок токенов модель сама не видит, нужны позиционные кодировки (синусоидальные, обучаемые, RoPE). Слабый индуктивный bias требует много данных: в исходной работе ViT обогнал CNN только после предобучения на очень больших датасетах.
Где спотыкаются
Говорят, что внимание придумали в трансформерах. Механизм внимания появился раньше, в seq2seq-моделях на RNN (Bahdanau и др., 2014), а новым стал отказ от рекуррентности.
Утверждают, что трансформер быстрее во всём. Генерация остаётся последовательной, токен за токеном, и растущий KV-кеш упирается в память.
Забывают про позиционные кодировки и не могут объяснить, как модель отличает «кошка съела мышь» от «мышь съела кошку».