Обо мне
Привет, меня зовут Василий Техин. За последние 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²)?
Как селективность помогает анализировать ДНК?