Мультимодальные языковые модели: как нейросети учатся видеть и слышать

Мультимодальные языковые модели представляют собой самый прогрессивный класс нейросетевых архитектур, объединяющих способность воспринимать и обрабатывать различные типы данных одновременно — текст, изображения, аудио и видео. Это похоже на то, как наш мозг интегрирует информацию из разных органов чувств, чтобы создать полную картину мира. Как сказал философ Марсель Пруст, «Настоящее открытие не в том, чтобы увидеть новые земли, а в том, чтобы иметь новые глаза».

Фундаментальные принципы мультимодальных моделей

Традиционные языковые модели работают исключительно с текстом, преобразуя последовательности токенов в векторные представления. Мультимодальные модели идут дальше — они способны создавать единое векторное пространство для нескольких модальностей, обеспечивая возможность межмодального перехода и рассуждения.

Общая концепция:

• Создание специализированных кодировщиков (энкодеров) для каждой модальности • Проекция данных из разных модальностей в единое векторное пространство • Разработка механизмов для взаимодействия и слияния информации из разных модальностей • Обучение системы на мультимодальных данных с использованием специализированных задач

Важным преимуществом мультимодальных моделей является их способность выполнять задачи, недоступные отдельным одномодальным системам. Например, они могут отвечать на вопросы по изображениям или преобразовывать аудио в текст с учетом инструкций.

Архитектурные решения

Каждая модальность требует собственного энкодера, оптимизированного для извлечения признаков определенного типа данных:
1. Текстовые энкодеры — обычно основаны на архитектуре трансформера (BERT, RoBERTa, T5) и преобразуют последовательности токенов в контекстуальные эмбеддинги
2. Визуальные энкодеры — чаще всего используются свёрточные нейронные сети (CNN) или Vision Transformer (ViT), преобразующие изображения в векторные представления
3. Аудио энкодеры — специализированные архитектуры вроде Wav2Vec2, которые кодируют аудиосигналы в векторное пространство

# Простой пример кодировщиков разных модальностей

class TextEncoder(nn.Module):
    def __init__(self, vocab_size, hidden_dim):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, hidden_dim)
        self.transformer = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(
                d_model=hidden_dim, 
                nhead=8,
                dim_feedforward=hidden_dim*4
            ), 
            num_layers=6
        )
        
    def forward(self, text_tokens):
        x = self.embedding(text_tokens)
        return self.transformer(x)

class VisionEncoder(nn.Module):
    def __init__(self, hidden_dim, patch_size=16):
        super().__init__()
        # Простая реализация Vision Transformer
        self.patch_embedding = nn.Conv2d(
            3, hidden_dim, 
            kernel_size=patch_size, 
            stride=patch_size
        )
        self.transformer = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(
                d_model=hidden_dim, 
                nhead=8,
                dim_feedforward=hidden_dim*4
            ), 
            num_layers=6
        )
        
    def forward(self, images):
        # images: [batch_size, 3, H, W]
        patches = self.patch_embedding(images)
        batch, channels, h, w = patches.shape
        patches = patches.flatten(2).transpose(1, 2)  # [batch, seq_len, channels]
        return self.transformer(patches)

Существует несколько основных стратегий для объединения информации из разных модальностей:
1. Ранняя интеграция (Early Fusion) — объединение необработанных или частично обработанных данных перед основным этапом анализа
2. Поздняя интеграция (Late Fusion) — объединение результатов независимых моделей для каждой модальности
3. Гибридная интеграция (Hybrid Fusion) — сочетание ранней и поздней интеграции на разных уровнях
Математически, самая простая форма слияния — конкатенация:

hmulti  =[h  text  ;h  image]

Однако в современных архитектурах используются более сложные методы, такие как cross-attention:

\text{CrossAttention}(Q, K, V) = \text{softmax} \left( \frac{Q K^{T}}{\sqrt{d_k}} \right) V

где Q (запрос) может быть получен из одной модальности, а K (ключи) и V (значения) из другой.

Математические основы: трансформация пространств представлений
Ключевой проблемой в мультимодальных моделях является согласование векторных пространств различных модальностей. Рассмотрим формальную модель для объединения текстовой и визуальной информации.
Пусть T — пространство текстовых представлений, а V — пространство визуальных представлений. Наша задача заключается в нахождении отображений:

fT: T → ZfT: V → Z

где Z — общее семантическое пространство, в котором связанные текстовые и визуальные концепты расположены близко друг к другу.
В CLIP (Contrastive Language-Image Pretraining), например, это достигается путем максимизации косинусного сходства между соответствующими парами текста и изображений и минимизации сходства между несоответствующими парами:

\mathcal{L} = -\log \frac{\exp\left( \text{sim}(f_T(t_i), f_V(v_i)) / \tau \right)}{\sum_{j=1}^{N} \exp\left( \text{sim}(f_T(t_i), f_V(v_j)) / \tau \right)}

где sim — функция косинусного сходства, — температурный параметр, ti и Vi — соответствующие пары текста и изображений.

def contrastive_loss(text_features, image_features, temperature=0.07):
    # Нормализация признаков
    text_features = F.normalize(text_features, dim=1)
    image_features = F.normalize(image_features, dim=1)
    
    # Матрица логитов [batch, batch]
    logits = torch.matmul(text_features, image_features.t()) / temperature
    
    # Метки: диагональная матрица (соответствие текст-изображение)
    labels = torch.arange(len(logits), device=logits.device)
    
    # Потери для текст->изображение и изображение->текст
    loss_i2t = F.cross_entropy(logits, labels)
    loss_t2i = F.cross_entropy(logits.t(), labels)
    
    # Среднее значение двух направлений
    return (loss_i2t + loss_t2i) / 2.0

Архитектуры современных мультимодальных моделей
CLIP: Contrastive Language-Image Pretraining

CLIP, разработанный OpenAI в 2021 году, использует контрастное обучение для создания совместного пространства для текста и изображений. Его архитектура состоит из:
1. Текстового энкодера на основе трансформера
2. Визуального энкодера (ResNet или Vision Transformer)
3. Проекционных слоев для отображения обеих модальностей в общее пространство
CLIP обучается на 400 миллионах пар текст-изображение, собранных из интернета, и демонстрирует возможность выполнения широкого спектра задач без дополнительного обучения (zero-shot).

LLaVA: Large Language and Vision Assistant LLaVA объединяет возможности больших языковых моделей (LLM) с визуальным пониманием, позволяя вести диалог на основе визуального контекста. Архитектура LLaVA включает: 1. Предобученный визуальный энкодер (обычно CLIP ViT-L/14) 2. Проекционный слой, преобразующий визуальные признаки в токены для LLM 3. Большую языковую модель (например, LLaMA) Ключевым инновационным аспектом LLaVA является метод проецирования визуальных признаков в языковое пространство через линейный слой:

visualtokens = W * visualfeatures + b

Где W и b — обучаемые параметры

Flamingo: Few-shot Learning with Multimodal Models
Flamingo, разработанный DeepMind, представляет собой архитектуру, специализированную для few-shot обучения с мультимодальными данными. Ключевые компоненты:
1. Визуальный энкодер на основе предобученных моделей (например, Perceiver Resampler)
2. Большая языковая модель (Chinchilla)
3. Специальные кросс-модальные слои внимания, интегрированные в языковую модель
Один из главных архитектурных элементов Flamingo — Perceiver Resampler, который преобразует переменное количество визуальных токенов в фиксированное небольшое множество. Это решает проблему вычислительной сложности при обработке длинных последовательностей визуальных токенов:

Z = PerceiverResampler(X)

где X — исходные визуальные токены (потенциально много), а Z — сжатое представление (обычно 64 или 128 токенов)

Применение мультимодальных моделей на практике
Обучение от нуля: сложно, но возможно
Обучение мультимодальной модели с нуля требует огромных вычислительных ресурсов и больших наборов данных. Для примера, CLIP обучался на 400 миллионах пар текст-изображение с использованием 256 графических процессоров A100 в течение нескольких недель.

Более практичный подход — использование предобученных моделей с дообучением на специфических задачах. Например, можно взять предобученную CLIP и адаптировать ее для задачи VQA (Visual Question Answering):

# Загрузка предобученной CLIP модели
import torch
from transformers import CLIPModel, CLIPProcessor

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

# Создание VQA надстройки
class VQAModel(nn.Module):
    def __init__(self, clip_model, num_answers=1000):
        super().__init__()
        self.clip_model = clip_model
        # Заморозим параметры CLIP
        for param in self.clip_model.parameters():
            param.requires_grad = False
            
        # Создадим слои для объединения текстовых и визуальных признаков
        hidden_dim = 512  # Размерность CLIP
        self.fusion = nn.Sequential(
            nn.Linear(hidden_dim*2, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, num_answers)
        )
        
    def forward(self, input_ids, attention_mask, pixel_values):
        # Получение признаков из CLIP
        with torch.no_grad():
            text_features = self.clip_model.get_text_features(
                input_ids=input_ids, 
                attention_mask=attention_mask
            )
            image_features = self.clip_model.get_image_features(
                pixel_values=pixel_values
            )
        
        # Конкатенация признаков
        combined = torch.cat([text_features, image_features], dim=1)
        
        # Предсказание ответа
        logits = self.fusion(combined)
        return logits

Заключение: куда движется мультимодальный AI
Мультимодальные языковые модели представляют следующий рубеж в развитии искусственного интеллекта. Они постепенно приближаются к человеческому восприятию мира, где разные источники информации естественным образом дополняют друг друга.

Мультимодальные модели представляют собой значительный шаг в направлении создания более общего искусственного интеллекта, способного воспринимать и взаимодействовать с миром во всей его сложности и многообразии.
В этой статье мы рассмотрели ключевые архитектурные компоненты, математические основы и практические аспекты мультимодальных языковых моделей. Надеюсь, это помогло вам лучше понять, как современные системы ИИ учатся объединять различные типы информации для более глубокого понимания мира.

© Habrahabr.ru