Flamingo y Gated Cross-Attention para VLMs de pocos disparos
Type: Learn
Languages: Python (stdlib, gated cross-attention + Perceiver resampler demo)
Prerequisites: Phase 12 · 03 (BLIP-2 Q-Former)
Time: ~120 minutes
Objetivos de aprendizaje
- Explica cómo la atención cruzada cerrada preserva la capacidad de texto de un LLM congelado en la inicialización a través de tanh(gate) = 0.
- Caminar a través de un nuevo modelo de perceptor: N parches de imagen → K fijas consultas "latentes" a través de la atención cruzada.
- Describa cómo Flamingo maneja secuencias de texto-imagen entrelazadas con enmascaramiento causal que respete la colocación de la imagen.
- Reproduce una estructura de instancias multimodal de algunas tomas (3 ejemplos de captura de imagen y luego una imagen de consulta).
El problema
BLIP-2 alimenta 32 tokens visuales en la capa de entrada de un LLM congelado. Funciona para una imagen por pedido. Pero ¿qué pasa si quieres alimentar muchas imágenes entrelazadas con texto, como en "aquí está la imagen A, subtítalo; aquí está la imagen B, subtítalo; ahora aquí está la imagen C, subtítalo"? La autoatención del LLM tendría que manejar tokens de imagen y tokens de texto en un solo flujo, y la pregunta de qué posiciones pueden asistir a qué imágenes se vuelve agitada.
La respuesta de Flamingo: no cambies en absoluto el flujo de entrada del LLM. Insertar capas de atención cruzada adicionales entre los bloques de LLM existentes. Los tokens de texto siguen fluyendo a través de la autoatención causal del LLM como siempre. Entre cada pocos bloques de LLM, los tokens de texto también atenden a las características de la imagen a través de una nueva capa cerrada. La puerta (iniciada a cero) significa que en el paso cero las nuevas capas no funcionan el modelo se comporta exactamente como el LLM pre-entrenado. A medida que avanza el entrenamiento, la puerta se abre y la información visual comienza a fluir.
La segunda pregunta Flamingo respondió: ¿cómo manejar un número variable de imágenes (0, 1 o muchas) por pedido? Un re-sampler Perceptor un pequeño módulo de atención cruzada que toma cualquier número de parches que tenga y produce un número fijo de fijos tokens visuales latentes. La capa de atención cruzada LLM ve la misma forma independientemente de cuántas imágenes estén en el pedido.
El concepto
El LLM congelado
Flamingo comienza con un LLM congelado de Chinchilla 70B. Todos los pesos de 70B no se han tocado.
Re-muestreo del receptor
Para cada imagen en el prompt, el ViT produce N parches de tokens. El resampler Perceptor tiene K fijas latencias de aprendizaje (Flamingo utiliza K=64).
- Atención cruzada: los latences K se presentan sobre los tokens de parches N (Q de los latences, K/V de los parches).
- Autoatención + FFN dentro de los latences.
Después de 6 bloques de resampler, la salida es K = 64 tokens visuales de dim 1024, independientemente de cuántos parches haya producido el ViT. Una imagen de 224x224 (196 parches) y una imagen de 480x480 (900 parches) salen como 64 tokens de resampler.
Para el vídeo, el resampler se aplica temporalmente: los parches de cada marco producen 64 latencias, y una codificación posicional temporal permite que el modelo distinga t=0 de t=N. El video completo se convierte en tokens visuales T * 64.
La atención cruzada
Entre cada capa M del LLM congelado (Flamingo utiliza M=4), insertar un nuevo bloque de atención cruzada cerrado:
x_after_llm_block = llm_block(x_before)
cross = cross_attn(x_after, resampler_output)
gated = tanh(alpha) * cross + x_after
x_before_next_block = gatedalphaes un escalar aprendible iniciado a cero.tanh(0) = 0, por lo que en init la rama cerrada contribuye cero.- Como
alphaSi se aleja de cero, la contribución de atención cruzada crece sin problemas. - La conexión residual significa que incluso una puerta completamente abierta no sobrescribe la representación de texto del LLM; solo añade información visual en la parte superior.
Esta es la elección de diseño más importante en Flamingo: el acondicionamiento visual es aditivo, cerrado y cero al iniciar.
Atención cruzada enmascarada para entradas entrelazadas
En un mensaje de respuesta como "<imagen A> subtítulo A <imagen B> subtítulo B <imagen C> ?", cada token de texto solo debe ver imágenes que se presentaron antes que él en la secuencia. La máscara de atención cruzada aplica: token de texto en posición tsólo se atiende a las fichas de resampler de imagen cuyo índice de imagen i < i_tdondei_tes la imagen más reciente antes de la posición t"Vea sólo la última imagen anterior" o "ve todas las imágenes anteriores" son ambas opciones válidas; Flamingo eligió la primera.
Aprendizaje en pocos disparos en contexto
Un mensaje de Flamingo parece:
<image1> A photo of a cat. <image2> A photo of a dog. <image3> A photo of aEl modelo ve el patrón de finalización y las salidas "pájaro" (o lo que sea que la imagen3 muestra). No hay pasos de gradiente. La capacidad de aprendizaje en el contexto congelado del LLM lleva a través de la atención cruzada cerrada.
Datos de formación
Flamingo entrenado en tres conjuntos de datos:
- MultiModal MassiveWeb (M3W): 43 millones de páginas web con imágenes y texto entrelazados, reconstruyendo el orden de lectura.
- Parejas de imagen y texto (ALIGN + LTIP): 4.4B.
- Parejas de vídeo-texto (VTP): 27 millones de cortos clips de vídeo.
OBELICS (2023) es una reproducción abierta del corpus web entrelazado, en el que entrenan Idefics, Idefics2 y los modelos más abiertos "como Flamingo".
OpenFlamingo y Otter
OpenFlamingo (2023) es la reproducción abierta. La arquitectura es idéntica (re-sampler del receptor + atención cruzada cerrada en LLaMA congelada o MPT).
Otter (2023) se basa en OpenFlamingo con la sintonización de instrucciones en MIMIC-IT (un conjunto de datos de instrucciones multimodal), mostrando trabajos de atención cruzada cerrada para instrucciones que siguen también.
Los descendientes
- Idefics / Idefics2 / Idefics3: El linaje de atención cruzada cerrado de Hugging Face, progresivamente más simple (Idefics2 dejó caer el resampler a favor de tokens de parches directos con pooling adaptativo).
- Transición de Flamingo a Camelio: para 2024 muchos equipos se trasladaron a la fusión temprana (lección 12.11); la atención cruzada cerrada al estilo Flamingo sigue en producción donde se requiere congelamiento de la columna vertebral.
- La entrada entrelazada de Géminis: conceptualmente hereda la flexibilidad de formato entrelazado de Flamingo, aunque el mecanismo exacto es propietario.
Comparación con BLIP-2
| BLIP-2 | Flamingo | |
|---|---|---|
| Visual bridge | Q-Former once at input | Gated cross-attention at every M layers |
| Visual tokens | 32 per image | 64 per image per cross-attn layer |
| Frozen LLM | Yes | Yes |
| Few-shot in-context | Weak | Strong — the paper's centerpiece |
| Interleaved inputs | No native support | Yes, the design target |
| Training data | 130M pairs | 1.3B pairs + 43M interleaved pages |
| Parameter count | 188M trained | ~10B trained (cross-attn layers) |
| Compute | Days on 8 A100s | Weeks on thousands of TPUv4 |
Elija BLIP-2 para una imagen única VQA en un presupuesto. Elija Flamingo/Idefics2 para el razonamiento intercalados, pocos disparos o múltiples imágenes.
Usalo
code/main.pydemuestra:
- Un nuevo modelo de Perceptor en 36 tokens de parches falsos con 8 latencias aprendizables (pura atención cruzada de Python).
- Un paso de atención cruzada cerrado con
alpha = 0→ salida es igual a entrada (LLM sin cambios), entoncesalpha = 2.0→ contribución visual mezclado. - Un constructor de máscaras entrelazadas que produce la máscara de atención 2D para una secuencia "(imagen 1) (texto 1) (imagen 2) (texto 2)".
Envío
Esta lección produceoutputs/skill-gated-bridge-diagnostic.md. Dado la configuración de un VLM abierto (resampler Y/N, frecuencia de acceso cruzado, esquema de puertas), identifica los elementos del linaje Flamingo y explica la estrategia de congelación.
Los ejercicios
- Computa el número de parámetros visuales de Flamingo-9B: 9B LLM + 1.4B capas de atención cruzada cerradas + 64M resampler. ¿Qué fracción de los parámetros totales se entrenan?
- Implementar el residuo cerrado
y = tanh(alpha) * cross + xEn PyTorch. Muestre experimentalmente que conalpha=0¿ Qué ?y==xexactamente en el inicio.
- Lea la sección 3.2 de OpenFlamingo (arXiv:2308.01390) sobre cómo manejan múltiples imágenes en un lote cuando cada mensaje tiene un conteo de imágenes diferente.
- ¿Por qué la máscara de atención cruzada de Flamingo permite que un token de texto atenda a sólo a la imagen anterior más reciente en lugar de todas las imágenes anteriores?
- En el contexto de pocas fotos: construye un prompt con 4 ejemplos de "imagen → color del objeto principal" para una nueva variante de Flamingo. Describa el patrón de precisión esperado a medida que varía el número de ejemplos de 0 a 8.
Términos clave
| Term | What people say | What it actually means |
|---|---|---|
| Perceiver resampler | "Fixed-latent cross-attention" | Module that produces K fixed tokens from a variable number of input patches |
| Gated cross-attention | "Tanh-gated bridge" | Residual layer y = tanh(alpha)*cross + x, learnable alpha, init 0 |
| Interleaved input | "Mixed sequence" | Prompt format with images and text mixed freely in reading order |
| Frozen LLM | "No LLM gradients" | The text LLM's weights do not update; only resampler + cross-attn layers train |
| Few-shot | "In-context examples" | Give a few (image, answer) pairs in the prompt; model generalizes without finetuning |
| OBELICS | "Interleaved web corpus" | Open dataset of 141M web pages with images and text in reading order |
| Chinchilla | "70B frozen base" | Flamingo's frozen text LLM, from DeepMind's Chinchilla paper |
| Gate schedule | "How alpha moves" | The rate at which the cross-attention gate opens during training |
| Cross-attn frequency | "Every M layers" | How often a gated cross-attention block is inserted; Flamingo uses M=4 |
| OpenFlamingo | "Open reproduction" | MosaicML/LAION open checkpoint at 3-9B; architecture-identical to Flamingo |
Leer más
- Alayrac et al. — Flamingo (arXiv:2204.14198) el papel original.
- Awadalla et al. — OpenFlamingo (arXiv:2308.01390) reproducción abierta.
- Laurençon et al. — OBELICS (arXiv:2306.16527) corpus de la red entrelazado.
- Jaegle et al. — Perceiver IO (arXiv:2107.14795) la arquitectura general del Perceptor.
- Li et al. — Otter (arXiv:2305.03726)Descendiente flamingo con instrucciones.
- Laurençon et al. — Idefics2 (arXiv:2405.02246) simplificación moderna del enfoque Flamingo.
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.