В первой части мы остановились на том, что первые 20 слоёв читают промпт и готовят внутреннее представление контекста. Из него для последней половины модели строится глобальная K/V-память.
Как именно: после 20-го слоя у каждого токена уже есть контекстное внутреннее представление. Первый слой верхней половины через обученные линейные проекции превращает эти представления в глобальный K/V-кэш.
А дальше начинается главное — следующие слои не обязаны строить такую память заново: CSA2 позволяет им переиспользовать уже готовый глобальный K/V. У каждого слоя при этом остаётся свой запрос внимания, поэтому разные слои всё равно могут извлекать из общей памяти разную информацию.
Но тут возникает следующая проблема.
Допустим, контекст — 1 миллион токенов. Модель генерирует очередное слово, и слою нужно понять, какие куски этого миллиона сейчас вообще имеют отношение к делу.
Можно заставить каждый слой самостоятельно просмотреть всю память и выбрать нужное. Можно. И так работает полное внимание в классическом подходе.
DeepSeek сделал CSA2 — Compressed Sparse Attention 2 (сжатое разреженное внимание второго поколения).
Идея на пальцах: один слой делает дорогую разведку по всему контексту, остальные получают от него уже сильно сокращённую карту местности.
Последние 20 слоёв разбиты на 5 групп по 4 слоя.
Первый слой верхней половины работает в полном режиме. Он берёт глобальную память, просматривает весь доступный контекст и выбирает 512 наиболее интересных позиций.
Но параллельно он делает ещё одну вещь: выбирает перспективные блоки контекста и формирует из них расширенный список кандидатов — максимум 16 384 позиции.
Получается:
1 000 000 токенов → 16 384 кандидата → 512 реально читаемых позиций.
А дальше начинается экономия.
Следующие три слоя даже не выполняют новый поиск. Они используют те же выбранные 512 позиций.
Важно: это не значит, что три слоя делают абсолютно одинаковое внимание. У каждого остаётся свой запрос внимания и собственная локальная память последних 128 токенов. Они просто не спорят заново о том, где искать в огромной истории.
Условно первый слой говорит:
«Парни, я перелопатил миллион токенов. Смотреть имеет смысл вот сюда».
Остальные отвечают:
«Спасибо. Что именно взять из этих мест, мы уже решим сами».
Следующая группа из четырёх слоёв работает ещё интереснее.
Её первый слой уже может сказать:
«Предыдущая группа, конечно, старалась, но мне нужны немного другие места».
Однако заново миллион токенов он не просматривает. Он ищет только внутри тех самых 16 384 кандидатов, выбранных первым слоем. Из них формирует свои 512 позиций.
Следующие три слоя опять используют этот выбор. И так дальше.
Схематично последняя половина получается примерно такой:
Слой 21: полный поиск по всему контексту → 512 позиций
Слои 22–24: используют его выбор
Слой 25: заново выбирает 512, но уже из сокращённого списка
Слои 26–28: используют его выбор
Слой 29: новый выбор из того же списка
Слои 30–32: используют
…и так до 40-го слоя.
Причём сама глобальная K/V-память между этими последними слоями тоже переиспользуется. Первый слой строит её из итогового состояния первой половины модели, а последующие слои используют уже готовую память вместо двадцати отдельных копий. Некоторые слои только заново выбирают, какие позиции из неё им нужны.
Получается три уровня лени:
1. Не строй глобальную память заново.
2. Не ищи по миллиону токенов, если предыдущий слой уже сократил область поиска.
3. Если сосед только что выбрал хорошие 512 позиций — иногда вообще не ищи, просто используй его выбор.
И вот это, на мой взгляд, самая красивая идея CSA2: слои начинают делиться не только памятью, но и результатами поиска по этой памяти.
Эффект хорошо видно на длинном контексте. При увеличении контекста с 4 тысяч до 1 миллиона токенов — в 256 раз — стоимость генерации одного токена у DeepSeek V4.1 Flash вырастает примерно только на четверть.
Плюс CSA2 вместе с хранением глобального K/V в FP4 (формат чисел такой) уменьшает глобальный K/V-кэш примерно до 890 байт на токен — около четверти от DeepSeek V4 Flash.
То есть разработчики перестали заставлять каждый слой самостоятельно искать иголку в одном и том же стоге сена.
В следующей части Engram.