Multimodal AI · Vision · Audio · Video

Мультимодальные
LLM

От ViT и CLIP до GPT-4o и Gemini 2.0 — полный разбор: как модели видят, слышат и понимают мир сразу из нескольких источников, как работает fusion, какие задачи решаются и как их оценивать.

👁 Vision
🔊 Audio / Speech
🎬 Video
📝 Language
// Fusion Architecture Visualizer — выбери паттерн

// фундаментальные концепции

Мультимодальность: основные идеи

Мультимодальность — способность модели принимать на вход и/или генерировать данные разных типов: текст, изображения, аудио, видео. Человек воспринимает мир именно так — через несколько сенсорных каналов одновременно. Мультимодальные LLM пытаются воспроизвести это свойство.

ТАКСОНОМИЯ ЗАДАЧ МУЛЬТИМОДАЛЬНЫХ МОДЕЛЕЙ Image изображение Audio речь/звук Video кадры+звук Text язык Document PDF, tables 3D / IMU глубина, сенсоры ↓ задачи на пересечении модальностей VQA (Image + Q → A) ASR (Audio → Text) Video Captioning Text-to-Image (DALL-E) Doc Understanding Image Captioning Speech Synthesis (TTS) Temporal Grounding Cross-modal Retrieval

// ЗАДАЧИ МУЛЬТИМОДАЛЬНЫХ МОДЕЛЕЙ · пунктиром = генеративные задачи

// vision encoder · история

ViT, CLIP и SigLIP:
как кодируется изображение

Vision Transformer (ViT) — 2020

ViT (Dosovitskiy et al., Google, 2020) — первая успешная прямая адаптация трансформера к изображениям. Идея проста: разбить изображение на патчи фиксированного размера (16×16 пикселей), развернуть каждый в вектор, и подать как «токены» в стандартный трансформер-энкодер.

ВХОД: изображение 224×224 14×14 = 196 патчей (16×16 px каждый) → Patch Embed Linear(P²·C, D) + CLS token prepended + pos embeddings → Transformer Encoder L слоёв: MSA + MLP + LN Каждый токен видит все ViT-B/16: L=12, D=768 ViT-L/14: L=24, D=1024 → Выход CLS → глоб. repr. Patch tokens → локальные repr. 197 × D тензор

// VIT PIPELINE · изображение → патчи → linear projection → трансформер-энкодер → patch embeddings

CLIP — Contrastive Language-Image Pretraining (OpenAI, 2021)

CLIP обучается одновременно на изображениях и текстовых описаниях через contrastive learning. Два энкодера (Image Encoder и Text Encoder) учатся проецировать соответствующие пары в одну точку пространства эмбеддингов. Это даёт нулевую инициализацию для любых задач классификации без дообучения.

CLIP CONTRASTIVE OBJECTIVE (батч из N пар) Image Encoder ViT-B/32 или ResNet-50 → I₁...Iₙ ∈ ℝᴰ L2-normalized Text Encoder Transformer [EOS] token → T₁...Tₙ ∈ ℝᴰ L2-normalized Similarity Matrix N × N = Iᵢ · Tⱼ / τ диагональ = matched pairs CrossEntropy по строкам + столбцам Обучение: 400M пар (изображение, alt-text) из интернета. Никакой разметки вручную!

// CLIP TRAINING · контрастивное обучение на 400M пар — совместить изображения с описаниями

SigLIP — Scale Image-Language Pre-training (Google, 2023)

SigLIP (Zhai et al., Google, 2023) заменяет softmax-based contrastive loss на sigmoid loss, убирая зависимость от размера батча. Каждая пара (image, text) независимо классифицируется как «matching/not matching». Это ускоряет обучение и улучшает качество, особенно при малых батчах. SigLIP-SO400M используется в LLaVA-Next, PaliGemma.

SigLIP vs CLIP: SigLIP-Loss(x,y) = −(1/|B²|) Σᵢⱼ log σ(zᵢⱼ·yᵢⱼ) где yᵢⱼ = +1 если matched, −1 иначе. Не нужно нормализовать по батчу → лучше параллелится, стабильнее при больших масштабах.

// vision-language models

VLM: LLaVA, Flamingo, BLIP-2, Qwen-VL

VLM (Vision-Language Model) — архитектура, объединяющая визуальный энкодер с языковой моделью. Ключевой вопрос: как именно соединить два пространства. Каждая из ключевых моделей предложила свой ответ.

2022 — DeepMind
Flamingo
Первая крупная VLM. Фиксирует LLM и визуальный энкодер (NFNet), добавляет Perceiver Resampler (cross-attention, 64 фиксированных visual tokens) и gated cross-attention слои внутри LLM. Работает в few-shot режиме на новых задачах без fine-tuning.
2023 — Salesforce
BLIP-2
Вводит Q-Former (Querying Transformer) — легковесный модуль из 32 обучаемых query токенов, которые через cross-attention извлекают релевантную визуальную информацию. LLM (FlanT5 или OPT) получает только 32 сжатых visual embedding вместо сотен патч-токенов. Эффективно и модульно.
2023 — Haotian Liu et al.
LLaVA (1.0 и 1.5)
Минималистичный подход: CLIP-ViT-L/14 + простой linear projection (MLP в 1.5) → Vicuna/LLaMA. Patch tokens напрямую конкатенируются с текстовыми. Обучается в 2 стадии: сначала только проекционный слой, потом вся модель. Стал стандартом de facto за простоту и воспроизводимость.
2023 — Alibaba
Qwen-VL
Добавляет visual re-sampler + поддержку интерлива изображений и текста. Поддерживает несколько изображений в одном промпте и высокое разрешение через динамический tile. Qwen2.5-VL (2024) — SOTA на многих бенчмарках, поддерживает видео.
2024 — Google
PaliGemma, InternVL-2
PaliGemma: SigLIP-SO400M + Gemma. Полностью open-source, отличный баланс размер/качество. InternVL-2: InternViT-6B (огромный vision encoder) + InternLM-2. SOTA на MMBench и MMMU в 2024.

Стадии обучения VLM

Стадия 1 Visual Pretraining Замораживаем LLM Учим connector только Стадия 2 Vision-Lang Alignment image-text пары Connector + часть LLM Стадия 3 Instruction Tuning VQA, caption, chat Весь pipeline разморожен Стадия 4 (опц.) RLHF / DPO Alignment, safety Human preference data

// VLM TRAINING STAGES · поэтапное обучение от изолированных компонентов до end-to-end

// fusion architecture

Fusion-паттерны в VLM

Early Fusion

Проекция перед LLM

Визуальные патч-токены проецируются в пространство LLM и конкатенируются с текстовыми. LLM видит image+text как единую последовательность. Примеры: LLaVA, InternVL.

Простота, полный контекст
Model-level (Q-Former)

Сжатие через cross-attention

Q-Former (BLIP-2) или Perceiver Resampler (Flamingo) — промежуточный модуль, извлекающий фиксированное число (32–64) ключевых токенов из тысяч патчей. Эффективнее по памяти.

Эффективность, сжатие
Late Fusion

Слияние после обработки

Каждая модальность обрабатывается своей башней независимо, результаты сливаются перед итоговым классификатором. Хорошо для задач без генерации (classification, retrieval).

Модульность, ретриевал

Детальное сравнение методов connector

ConnectorВизуальных токеновМодельПлюсМинус
Linear ProjectionN_patches (~256–1024)LLaVA-1.5Простота, полный визуальный контекстДлинный контекст → дорого
MLP 2-layerN_patches (~256)LLaVA-1.5Чуть лучше alignmentВсё ещё много токенов
Q-Former32 фиксированныхBLIP-2, InstructBLIPФиксированный контекст, эффективноИнформация может теряться
Perceiver Resampler64–256Flamingo, OtterГибкое число запросовСложнее обучать
Dynamic TilingN × M_tiles × patchesLLaVA-Next, Qwen2.5-VLВысокое разрешение!Контекст растёт с разрешением

Dynamic High-Resolution: как поддерживают 4K изображения

Стандартный ViT обучен на 224×224 — это 14×14 = 196 патчей. Для документов и высококачественных изображений этого катастрофически мало. Dynamic Tiling (LLaVA-Next, Qwen2.5-VL) делит изображение на тайлы, каждый тайл кодируется отдельно:

Python · dynamic tiling для высокого разрешения
import torch
from PIL import Image
import math

def dynamic_tile_encode(
    image: Image.Image,
    vision_encoder,          # ViT принимает 224×224
    max_tiles: int = 12,      # максимум тайлов
    tile_size: int = 224,
) -> torch.Tensor:
    """
    Делит изображение на тайлы + добавляет уменьшенный thumbnail.
    Результат: (1 + num_tiles) × num_patches × D
    """
    w, h = image.size
    # Определяем оптимальную сетку тайлов
    aspect = w / h
    num_tiles_w = min(int(math.ceil(w / tile_size)), max_tiles)
    num_tiles_h = min(int(math.ceil(h / tile_size)), max_tiles)
    # Ограничиваем общее число тайлов
    while num_tiles_w * num_tiles_h > max_tiles:
        if num_tiles_w > num_tiles_h: num_tiles_w -= 1
        else: num_tiles_h -= 1

    tiles = []
    # 1. Thumbnail: всё изображение сжатое до 224×224
    thumbnail = image.resize((tile_size, tile_size))
    tiles.append(vision_encoder(thumbnail))   # глобальный контекст

    # 2. Локальные тайлы (перекрытие 10% для continuity)
    stride_w = w // num_tiles_w
    stride_h = h // num_tiles_h
    for row in range(num_tiles_h):
        for col in range(num_tiles_w):
            x0 = col * stride_w
            y0 = row * stride_h
            tile = image.crop((x0, y0, x0 + tile_size, y0 + tile_size))
            tile_emb = vision_encoder(tile)
            tiles.append(tile_emb)

    # (1 + num_tiles) × 196 × D
    return torch.stack(tiles, dim=0)

# Для 1080p (1920×1080) с tile_size=224:
# num_tiles_w = 8, num_tiles_h = 4 → 32+1=33 тайла
# 33 × 196 = 6468 visual tokens → дорого, но качественно
# Qwen2.5-VL использует динамическое разрешение с сжатием

// audio modality

Аудио: Speech Encoders и мультимодальные модели

Аудио-модальность требует обработки сигнала во времени. Главные задачи: ASR (speech-to-text), TTS (text-to-speech), audio understanding (звуки, музыка, эмоции), multi-speaker обработка.

Whisper (OpenAI, 2022)

Whisper — seq2seq трансформер, обученный на 680k часов аудио из интернета. Входной сигнал конвертируется в log-mel spectrogram (80 mel bins, 25ms frames), кодируется Conv1D + трансформером. Декодер авторегрессивно генерирует текст.

Python · Whisper ASR
import whisper
import numpy as np

# Загружаем модель (tiny/base/small/medium/large-v3)
model = whisper.load_model("large-v3")

# Транскрибируем аудио файл
result = model.transcribe(
    "audio.mp3",
    language="ru",            # явно указываем язык
    task="transcribe",       # или "translate" для перевода
    word_timestamps=True,    # время каждого слова
    temperature=0,           # детерминизм
)
print(result["text"])

# Доступ к сегментам с временными метками:
for seg in result["segments"]:
    print(f"[{seg['start']:.1f}–{seg['end']:.1f}] {seg['text']}")

# Через HuggingFace (рекомендуется для батчей):
from transformers import pipeline

asr = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-large-v3",
    chunk_length_s=30,       # окно 30с для длинных записей
    stride_length_s=5,       # перекрытие 5с
    batch_size=8,
)
text = asr("long_audio.wav", return_timestamps=True)

Мультимодальные аудио-энкодеры

Для задач понимания аудио используются генерализованные аудио-энкодеры, обученные не только на речи.

МодельАрхитектураСильная сторона
WhisperCNN + Transformer seq2seqASR, перевод речи
wav2vec 2.0CNN + Transformer (CTC)Low-resource ASR
HuBERTCNN + BERT (offline labels)Speech SSL, emotion
CLAPAudio encoder + Text encoder (CLIP-like)Audio-text retrieval
EncodecCNN streaming codecNeural audio compression
CLAP (2022, Microsoft) — аудио-аналог CLIP. Обучен контрастивно на парах (аудио, описание). Поддерживает zero-shot классификацию звуков: AudioSet, ESC-50, FSD50K. Используется как аудио-энкодер в AudioLM, MusicGen.

// video modality

Видео: temporal understanding

Видео = изображения × время + аудио. Ключевая сложность: длинные видео могут содержать тысячи кадров. Обрабатывать все — слишком дорого. Нужен умный sampling.

VIDEO ENCODING СТРАТЕГИИ Uniform Sampling Каждые N кадров → ViT encode Простота, теряет детали Video Transformer (Space-Time) Tubelet embeddings 2×16×16 Temporal attention между кадрами VideoMAE, Video-LLaMA, Video-LLaVA Дорого, но улавливает движение Adaptive / Sparse Sampling Важные кадры (смена сцены, motion) LLM-based frame selection Qwen2.5-VL, LongVA, Video-R1 Эффективно для длинных видео

// VIDEO ENCODING · три основных подхода к обработке видеоряда

Video-LLM через HuggingFace: пример

Python · Qwen2.5-VL video inference
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

model = Qwen2VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2.5-VL-7B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct")

# ── Видео через URL или локальный файл ───────────────────────
messages = [{
    "role": "user",
    "content": [
        {
            "type": "video",
            "video": "video.mp4",           # или URL
            "max_pixels": 360 * 420,      # ограничение разрешения
            "fps": 1.0,                   # 1 кадр в секунду
        },
        {"type": "text", "text": "Опиши, что происходит на видео. Когда появляется человек?"},
    ],
}]

text_prompt = processor.apply_chat_template(messages, tokenize=False)
image_inputs, video_inputs = process_vision_info(messages)

inputs = processor(
    text=[text_prompt],
    images=image_inputs,
    videos=video_inputs,
    padding=True,
    return_tensors="pt",
).to(model.device)

with torch.no_grad():
    output_ids = model.generate(**inputs, max_new_tokens=512)

output_text = processor.batch_decode(
    output_ids[:, inputs.input_ids.shape[1]:],
    skip_special_tokens=True
)[0]
print(output_text)

// omni-modal

Омни-модальные модели

Омни-модальные модели — системы, принимающие любую комбинацию текста, изображений, аудио и видео в одном промпте и способные генерировать ответ в любой из этих модальностей. Это текущий frontier AI.

GPT-4o (OpenAI, 2024)

Нативная омни-модальность

Первая модель с нативной поддержкой всех модальностей (text, image, audio, video) в едином трансформере. Аудио не конвертируется в текст — модель работает напрямую с аудио-токенами. Поддерживает real-time voice с sub-300ms latency. Визуальная часть на основе ViT с динамическим разрешением.

Нативное аудио, low latency
Gemini 2.0 (Google, 2024–2025)

Multimodal natively designed

Gemini разрабатывался с нуля как мультимодальный (в отличие от GPT-4 который изначально текстовый). Gemini 2.0 Flash: vision, audio (native), video, documents, code. Поддерживает до 2M tokens context (включая видео). Gemini 2.5 Pro — добавляет extended thinking.

2M контекст, нативное аудио
Qwen2.5-Omni (Alibaba, 2025)

Thinker-Talker Architecture

Две компоненты: Thinker — LLM обрабатывающая все входные модальности и генерирующая текст; Talker — streaming autoregressive модель для генерации речи из текстового вывода Thinker. Модели работают параллельно — low latency TTS. Поддерживает video, audio, image, text ввод одновременно.

Open source, streaming TTS
R1-Omni / InternOmni (2025)

Reasoning + Omni

R1-Omni (2025): применяет GRPO-обучение (chain-of-thought reasoning) к мультимодальным задачам. Показывает улучшение на AV (audio-visual) emotion recognition через RL-trained reasoning chain перед ответом. Новый паттерн: reasoning + multimodality.

GRPO reasoning + multimodal
АРХИТЕКТУРНЫЕ ПОДХОДЫ К OMNI-МОДАЛЬНОСТИ Cascaded (каскад) ASR → Text → LLM → TTS Whisper ASR LLM (Qwen/LLaMA) TTS (edge-TTS, CosyVoice) Модульно, но latency высокая Shared Encoder (GPT-4o) Единый transformer всё видит Omni Transformer Text + Image + Audio tokens → unified space Low latency, сложно обучать Thinker-Talker (Qwen-Omni) Параллельные модели Thinker text + img + audio → text Talker text → speech streaming AR Лучший баланс latency + quality

// OMNI ARCHITECTURES · три подхода: каскад, unified encoder, thinker-talker

Компромиссы в омни-моделях: нативный аудио-режим (как в GPT-4o) убирает ASR-шаг, но сложнее обучать и требует специальных аудио-токенов. Каскадный подход (ASR → LLM → TTS) прост и модульно заменяем, но добавляет ~500ms latency. Thinker-Talker — компромисс: текстовое reasoning + параллельная речевая генерация.

// оценка

Бенчмарки мультимодальных моделей

Vision-Language бенчмарки

БенчмаркЗадачиПримеров
MMBenchPerception, reasoning, knowledge — 20 категорий4.3k
MMMUУниверситетские вопросы по 30 дисциплинам с изображениями11.5k
MMT-Bench162 задачи (VQA, OCR, science, chart, math)31k
MMStar«Сложные» примеры без text-only shortcuts1.5k
MathVistaМатематика с визуальным контекстом6.1k
DocVQAВопросы по документам (сканы, PDF)50k
ChartQAВопросы по графикам и диаграммам32k

Аудио и видео бенчмарки

БенчмаркТип
AIR-BenchAudio question answering (речь, звуки, музыка)
AudioBenchAudio understanding, instruction following
EgoSchemaEgocentric video QA, ~3 минуты видео
Video-MMEVideo QA: short/medium/long clips
MVBench20 задач на temporal understanding

Производительность: MMMU (Open-Ended)

Данные приведены по опубликованным техническим отчётам (2024–2025). MMMU — University-level multimodal understanding.

GPT-4o
69.1
Gemini 2.0 Flash
71.7
Claude 3.5 Sonnet
68.3
InternVL2.5-8B
70.1
Qwen2.5-VL-7B
58.6
LLaVA-1.5-13B
36.4
Предупреждение о бенчмарках: высокий MMMU ≠ хорошо решает твою задачу. Всегда создавай доменный eval set из реальных примеров твоей задачи. Модели часто тонко дообучены на бенчмарках, что завышает их публичные оценки.

// практика

Практические кейсы применения

Документ-понимание (OCR + Layout + VLM)

Python · document understanding с PaliGemma
from transformers import PaliGemmaForConditionalGeneration, PaliGemmaProcessor
from PIL import Image
import torch

# PaliGemma: SigLIP-SO400M + Gemma 2B — отличен для document tasks
model = PaliGemmaForConditionalGeneration.from_pretrained(
    "google/paligemma-3b-mix-448",   # 448 = высокое разрешение
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
processor = PaliGemmaProcessor.from_pretrained("google/paligemma-3b-mix-448")

def extract_from_document(image_path: str, question: str) -> str:
    image = Image.open(image_path).convert("RGB")

    inputs = processor(
        images=image,
        text=question,
        return_tensors="pt",
    ).to(model.device, torch.bfloat16)

    with torch.inference_mode():
        generated = model.generate(**inputs, max_new_tokens=256, do_sample=False)

    # Убираем входные токены из вывода
    output = processor.decode(
        generated[0][inputs.input_ids.shape[1]:],
        skip_special_tokens=True
    )
    return output

# Примеры использования на PDF/скан документах:
questions = [
    "Извлеки все суммы из таблицы. Верни JSON.",
    "Какова итоговая сумма в строке Total?",
    "Кто подписал этот договор?",
    "Что написано в колонке 'Описание работ'?",
    "ocr",  # PaliGemma понимает прямые задачи: ocr, detect, caption
]

for q in questions:
    answer = extract_from_document("invoice.png", q)
    print(f"Q: {q}\nA: {answer}\n")

Real-time voice assistant через Whisper + LLM + TTS

Python · voice assistant pipeline
import sounddevice as sd
import numpy as np
import whisper, edge_tts
from openai import OpenAI
import asyncio, tempfile

# Загружаем модели
asr_model = whisper.load_model("base")   # быстрее medium, для real-time
llm = OpenAI()
history = []

async def voice_turn():
    """Один цикл: записать → распознать → ответить → озвучить."""
    # 1. Запись аудио (VAD в реальном приложении)
    print("Говорите...")
    audio = sd.rec(int(5 * 16000), samplerate=16000, channels=1, dtype='float32')
    sd.wait()

    # 2. ASR: float32 array → текст
    audio_flat = audio.flatten()
    result = asr_model.transcribe(audio_flat, language="ru", fp16=False)
    user_text = result["text"].strip()
    print(f"Пользователь: {user_text}")

    if not user_text: return

    # 3. LLM генерация
    history.append({"role": "user", "content": user_text})
    resp = llm.chat.completions.create(
        model="gpt-4o-mini", messages=history,
        max_tokens=200, temperature=0.7,
    )
    assistant_text = resp.choices[0].message.content
    history.append({"role": "assistant", "content": assistant_text})
    print(f"Ассистент: {assistant_text}")

    # 4. TTS через edge-tts (Microsoft, бесплатно)
    communicate = edge_tts.Communicate(assistant_text, voice="ru-RU-SvetlanaNeural")
    with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f:
        await communicate.save(f.name)
        # воспроизводим через pygame или sounddevice

asyncio.run(voice_turn())

Практические кейсы по доменам

Медицина

Анализ медицинских изображений

CXR (рентген груди), патология, дерматология. Модели: BioViL-T (CLIP-based), Med-PaLM M, LLaVA-Med. Задачи: report generation, VQA, anomaly detection. Требует fine-tuning на доменных данных — общие VLM слабы.

Торговля / Ретейл

Product recognition + описание

Qwen-VL или PaliGemma для распознавания товаров на полке, генерации описаний для e-commerce. Поиск «найди похожий товар» = CLIP-based retrieval + multimodal reranking.

Безопасность / Мониторинг

Video surveillance QA

Video-LLM для ответов на вопросы по видеозаписям. «Когда человек взял предмет?» → temporal grounding. EfficientSAM + Video-LLaVA. Основная проблема: latency при длинных видео.

Финансы / Юриспруденция

Document intelligence

Извлечение данных из договоров, счетов, финансовой отчётности. GOT-OCR2 (OCR) → PaliGemma/Qwen-VL (structured extraction) → валидация через схему. Hit@1 на RVL-CDIP > 95% с современными VLM.