Обо мне
Привет, меня зовут Василий Техин. За последние 6 лет я прошёл путь от новичка в ML который ни в чем не разбирается, до человека, который может помочь разобраться другим не используя сложной математике и приправляя обьяcнение наглядными примерами. В этой серии статей я разбираю прорывные модели "на пальцах":
Vision Transformer (ViT) — Когда трансформеры научились видеть
Diffusion Transformer (DiT) — Stable Diffusion 3 как она есть Сегодня: Mamba — революция в обработке длинных последовательностей!
Пролог: Почему Mamba?
Представьте тусовку ученых исследователей, где каждый должен переговорить со всеми. Для 10 человек — 100 диалогов (да, мы считаем, что разговоры первый со вторым и второй с первым отличаются и да да мы будем считать, что он и сам с собой говорит, кто поймет этих ученых!). Для 1000 — 1 000 000! Это квадратичная сложность (O(n²)) внимания в трансформерах.
Mamba (State Space Models) решает это:
Замена внимания на линейную рекуррентную сеть (O(n)).
Селективность: динамический выбор важной информации.
Ускорение в 5 раз на длинных текстах.

Ключевые компоненты Mamba

1. State Space Models (SSM)
State Space Models (SSM) — семейство линейных моделей для последовательностей, основанных на дифференциальных уравнениях. Их ключевые особенности:
Линейность: состояние обновляется линейно (
s(t) = A·s(t-1) + B·x(t)
), без нелинейных активаций.Дискретизация: параметры выводятся из непрерывных уравнений для работы с дискретными токенами.
Сжатое состояние: вся история последовательности сжимается в вектор фиксированного размера.
Отличия от других моделей
Модель |
Ключевые особенности |
Отличие от SSM |
---|---|---|
RNN/GRU/LSTM |
Нелинейные активации (tanh, sigmoid) |
SSM — полностью линейны |
Трансформеры |
Внимание (O(n²)) |
SSM — рекуррентные (O(n)) |
S4 SSM |
Линейность + инвариантность во времени |
Mamba добавляет селективность (B, C, Δt зависят от входа) |
Mamba |
SSM + селективность + параллельный scan |
Динамическая адаптация к важности токенов |
Ядро архитектуры:
ds(t)/dt = A·s(t) + B·x(t)
y(t) = C·s(t) + D·x(t)
Где:
x(t) — входной сигнал (токен) в момент времени t
s(t) — скрытое состояние (память модели)
ds(t)/dt — скорость изменения состояния
A — матрица переходов (определяет "забывание" прошлого)
B — матрица входа (влияние нового токена на состояние)
C — матрица выхода (преобразует состояние в выход)
D — сквозная связь (прямое влияние входа на выход)
y(t) — выходной сигнал
Дискретизация для токенов:
A_d = exp(-Δt * A) # Дискретная матрица переходов
B_d = (A⁻¹)(exp(Δt·A) - I)B # Дискретная матрица входа
s_t = A_d · s_{t-1} + B_d · x_t
Где:
A_d — дискретный аналог матрицы A (определяет "сохранение памяти")
B_d — дискретный аналог матрицы B (влияние входа на обновление состояния)
Δt — шаг дискретизации (учится: большой = долгая память, маленький = быстрое забывание)
2. Селективность
Уникальность Mamba:
B = Linear(x_t) # Линейное преобразование входа
Δt = softplus(Linear(x_t)) # Активация softplus: log(1 + exp(x))
Где:
Linear() — полносвязный слой (y = Wx + b)
softplus() — гладкая версия ReLU, гарантирует Δt > 0
Модель динамически решает:
"Важный токен? Запомню надолго (↑ Δt)"
"Шум? Проигнорирую (↓ Δt)"
3. Параллельный Scan
Решение проблемы RNN:
state = cumprod(A) * cumsum(B) # O(log n) вместо O(n)
Где:
cumprod() — кумулятивное произведение (a1, a1a2, a1a2*a3, ...)
cumsum() — кумулятивная сумма (b1, b1+b2, b1+b2+b3, ...)
Как работает:
Разбиваем последовательность на блоки
Вычисляем промежуточные состояния внутри блоков параллельно
Объединяем результаты между блоками
Повторяем иерархически (дерево слияний)
Разберём на простом примере
Обработка фразы "Мама мыла раму"
1. Токенизация
"М"→10, "а"→11, " "→12, "м"→13, "ы"→14, "л"→15, "р"→16, "у"→17
Последовательность: [10, 11, 13, 11, 12, ...]
2. Эмбеддинг
Каждый токен → вектор:
10 → [0.2, -0.1, 0.4, 1.1]
11 → [0.7, 0.3, -0.2, 0.5]
3. Блок Mamba
Для токена "м" (позиция 2):
-
Локальный контекст (Conv1D):
conv("Ма") = [0.5, 0.1, 0.3, 0.9] # Смешение соседей
-
Селективное обновление состояния:
Δt = sigmoid("м") → 0.7 # Высокая важность new_state = (1 - 0.7*A) * state + 0.7*B * x_token
-
Gating механизм:
gate = sigmoid(Linear(x)) # Решает, какую информацию передать output = gate * (C * state + D * x_token)
Выход:
y = output
4. Предсказание
После 12 блоков:
logits = linear_layer(output) # Вероятности символов
next_token = argmax(logits) → "а" # "Мама..."
Код: Сердце Mamba
Ядро SSM
class MambaBlock(nn.Module):
def forward(self, x):
# Локальный контекст
x_conv = depthwise_conv1d(x)
# Селективные параметры
Δ, B, C = self.x_proj(x_conv)
A_d = exp(-Δ * self.A)
# Параллельный scan
state = cumprod(A_d) * cumsum(B * x_conv)
y = einsum('btd,btd->bt', state, C) + self.D * x_conv
# Gating механизм
return y * torch.sigmoid(self.gate_proj(x))
Параллельный Scan
def parallel_scan(A, B):
A_cum = torch.cumprod(A, dim=1) # Продукт: [a0, a0*a1, a0*a1*a2, ...]
B_cum = torch.cumsum(B * A_cum, dim=1) # Взвешенная сумма
return B_cum / (A_cum + 1e-7) # Нормализация
Сравнение: Mamba vs Трансформер
Критерий |
Трансформер |
Mamba |
---|---|---|
Сложность |
O(n²) |
O(n) |
Память (инференс) |
O(n) |
O(1) |
Длина контекста |
~128K |
>1M токенов |
Качество |
SOTA |
Сопоставимо |
Селективность |
Жёсткое внимание |
Динамический выбор |
Сильные стороны Mamba:
Анализ ДНК/белковых последовательностей.
Работа на edge-устройствах (телефоны).
Слабые стороны:
Короткие тексты (трансформеры эффективнее).
Мультимодальные задачи (пока).
Примеры применения
-
? BioMamba:
Анализ генома человека (3 млрд пар оснований).
-
?️ Vim (Vision Mamba):
На 30% быстрее ViT на ImageNet.
Резюме
Mamba — прорыв для длинных последовательностей:
State Space Model с селективностью.
Сложность O(n) vs O(n²) у трансформеров.
Применения: геномика, длинные тексты, edge-устройства.
Ограничения: мультимодальность, короткие контексты.
Ссылки:
Философский итог
Mamba не заменяет трансформеры, а расширяет инструментарий ИИ:
Для длинных данных — оптимальный выбор.
Для мультимодальности — трансформеры сохраняют преимущество. Будущее: Гибридные архитектуры, где Mamba обрабатывает историю, а внимание — кросс-модальные связи.
Проверь себя
Почему сложность Mamba O(n), а не O(n²)?
Как селективность помогает анализировать ДНК?
ioleynikov
Очень интересно. Из математического анализа известно, что представление произвольной функции линейными составляющими дает только первое приближение и не может обеспечить заданную точность. Именно по этому все ряды Тейлора, Фурье и нейронные сети неизбежно содержат нелинейные компоненты. Как точно представить сложную функцию линейной комбинацией мне трудно понять. Вполне возможно, что для длинных хвостов истории последовательностей вполне достаточно начальных, линейных приближений но это все надо точно проверят.