Engram от DeepSeek, как O(1) лукап в памяти на эмбеддингах.
Осторожно длинопост.
Команда DeepSeek продолжает радовать новыми хинтами для архитектуры. Почему это стоит обозреть, думаю, что в v4 эта фишка обязательно появится. Действуем привентивно.
Немного вводных. Напомню, что MoE работает с роутингом FFN слоев. А FFN является местом, где хранятся «знания о мире» языковой модели. Как вы понимаете, данные знания являются статичными, т.е. они не изменяются во времени. И как вы можете понять, чтобы внести новые знания модель надо доучивать на актуальные вещи и в т.ч. поэтому RAG всегда требует актуальных источников, а модели из весов говорят чушь, что сегодня 2 декабря 2023 года. Это просто слепок данных претрена на такую дату.
В общем, в работе нам представлен ещё один вариант развития фичи с статичной памятью. Увы, научиться на лету делать её темпоральной без внешней инженерии а-ля RAG, и постоянного дотюна и ретрена не выйдет.
🔍 Основная концепция и мотивация.
Текущие LLM, включая модели MoE, вынуждены производить поиск знаний за compute – к сожалению, вы платите памятью за sparsed inference, тк надо всех экспертов держать на готове. При этом для обработки статической информации: именованные сущности, формулы и др., они также тратят compute и емкость весов для реконструкции паттернов, которые можно было бы получить простым поиском по памяти.
Авторы предлагают ввести в архитектуру LLM новую, дополнительную ось разреженности – условную память ака Conditional Memory (далее CM). Если MoE реализует условные вычисления (динамически активируемые параметры), то условная память обеспечивает разреженный доступ к статическим знаниям через механизм быстрого поиска. Практической реализацией этой идеи стал модуль Engram (репо тут), который модернизирует классические N-граммные эмбеддинги для эффективного поиска за время O(1).
🏗️ Архитектура Engram
Модуль Engram встраивается в блок трансформера в архитектуру с несколькими ветвями, на подобие новинки mHC и работает в два этапа:
1. Извлечение и поиск. На основе локального контекста (суффиксных N-грамм, где N=2,3) производится поиск статических векторных представлений из большой таблицы эмбеддингов. Чтобы работать с огромным комбинаторным пространством N-грамм, используется детерминированное хеширование с несколькими головами, что снижает коллизии. Для повышения семантической плотности применяется предварительное сжатие токенов, это прям как в lattent attention (было про это тут), которое нормализует разные написания одних и тех же слов.
2. Слияние. Извлеченные статические векторы на лету интегрируются в скрытые состояния модели. Для этого используется контекстно-зависимое просеивание, зовут это gating, но напоминает механизм внимания (а ещё гейты в GRU, ну и роутинг в МоЕ). По сути все как в attention — текущее скрытое состояние выступает в роли «запроса», который определяет, насколько релевантен/важен извлеченный «ключ» путем механизма dot-prod. Это позволяет модели игнорировать зашумленные или неуместные в контексте N-граммы. А ещё в конце стоит conv слой, т.е. свертка, которая, по сути берет итоговые эмбеддинги n-gramm и делает над ними то самое слияние в эмбеддинг фраз. Дядя напомнит, что слова и словосочетания составляют предложения. Ранее (где-то в 2014-2017годах) для такого сложения и использовали Conv1D свертки над эмбеддингами токенов, это давало эмбеддинги N-грамм, а pooling от этого даёт уже эмбеддинги текстов.
Добавить комментарий