Flamingo e Atensão cruzada por porta para VLMs com poucas tiros
Type: Learn
Languages: Python (stdlib, gated cross-attention + Perceiver resampler demo)
Prerequisites: Phase 12 · 03 (BLIP-2 Q-Former)
Time: ~120 minutes
Objetivos de aprendizagem
- Explique como a atenção cruzada por gate preserva a capacidade de texto do LLM congelado na inicialização via tanh(gate) = 0.
- Passe por um resampler Perceptor: N patches de imagem → K fixa "latentes" consultas através da atenção cruzada.
- Descreva como Flamingo lida com sequências de imagem-texto entrelaçadas com mascaramento causal que respeita a colocação da imagem.
- Reproduzir uma estrutura de prompt multimodal de algumas fotos (3 exemplos de captura de imagem e depois uma imagem de consulta).
O problema
BLIP-2 alimenta 32 tokens visuais na camada de entrada de um LLM congelado. Funciona para uma imagem por pedido. Mas e se quiserem alimentar muitas imagens entrelaçadas com texto, como em "aqui está a imagem A, subtítulo; aqui está a imagem B, subtítulo; agora aqui está a imagem C, subtítulo"? A auto-atenção do LLM precisaria lidar com tokens de imagem e tokens de texto em um único fluxo, e a questão de quais posições podem atender a quais imagens se torna agitada.
A resposta do Flamingo: não alterem o fluxo de entrada do LLM. Insira camadas de atenção cruzada extra entre os blocos de LLM existentes. Os tokens de texto ainda fluem através da auto-atenção causal do LLM como sempre. Entre cada poucos blocos de LLM, tokens de texto também atendam às características da imagem através de uma nova camada fechada. O portal (iniciado para zero) significa que no passo zero as novas camadas são sem operações o modelo se comporta exatamente como o LLM pré-treinado. À medida que o treinamento progride, o portão abre-se e a informação visual começa a fluir.
A segunda pergunta Flamingo respondeu: como você lida com um número variável de imagens (0, 1 ou muitas) por prompt? Um resampler Perceptor um pequeno módulo de atenção cruzada que toma qualquer número de patches que você tem e produz um número fixo de tokens visuais latentes. A camada de atenção cruzada LLM vê a mesma forma independentemente de quantas imagens estão no prompt.
O conceito
O LLM congelado
Flamingo começa com um LLM congelado Chinchilla 70B. Todos os pesos 70B intactos.
Re-estampilador de percepção
Para cada imagem no prompt, o ViT produz N patch tokens. O resampler Perceptor tem K latentes fixas aprendíveis (Flamingo usa K=64).
- Atensão cruzada: os K latentes atendem aos tokens de patches N (Q dos latentes, K/V dos patches).
- Auto-atenção + FFN dentro dos latentes.
Após 6 blocos de resampler, a saída é K = 64 tokens visuais de dim 1024, independentemente do número de patches produzidos pela ViT. Uma imagem 224x224 (196 patches) e uma imagem 480x480 (900 patches) ambos saem como 64 tokens de resampler.
Para o vídeo, o resampler é aplicado temporalmente: os patches de cada quadro produzem 64 latentes, e uma codificação posicional temporal permite que o modelo distingua t=0 de t=N. O vídeo completo se torna T * 64 tokens visuais.
Atensão transversal
Entre cada camada M do ML congelado (Flamingo usa M=4), inserir um novo bloco de atenção cruzada fechado:
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 = gatedalphaé um escalar aprendizagem iniciado em zero.tanh(0) = 0, então no init o ramo fechado contribui com zero.- Como ...
alphaSe a contribuição de atenção cruzada se afastar do zero, a contribuição cresce sem problemas. - A conexão residual significa que mesmo um portal totalmente aberto não sobreescreve a representação do texto do LLM; apenas adiciona informações visuais no topo.
Esta é a escolha de design mais importante no Flamingo: o condicionamento visual é aditivo, fechado e zero na inicialização.
A atenção cruzada mascarada para entradas entrelaçadas
Em um prompt como "<imagem A> legenda A <imagem B> legenda B <imagem C> ?", cada token de texto deve ver apenas imagens que vieram antes dele na sequência. A máscara de atenção cruzada impõe: token de texto na posição tAtende apenas a imagem resampler tokens cujo índice de imagem i < i_tondei_té a imagem mais recente antes da posição t"Vede apenas a última imagem anterior" ou "veja todas as imagens anteriores" são ambas opções válidas; Flamingo escolheu a primeira.
Aprendizagem em poucos tiros no contexto
Um sinal do Flamingo parece:
<image1> A photo of a cat. <image2> A photo of a dog. <image3> A photo of aO modelo vê o padrão de conclusão e produz " pássaro" (ou o que a imagem 3 mostra). Não há passos de gradiente. A capacidade de aprendizagem no contexto do LLM congelado leva através da atenção cruzada fechada.
Dados de formação
Flamingo treinado em três conjuntos de dados:
- MultiModal MassiveWeb (M3W): 43 milhões de páginas web com imagens e texto entrelaçados, reconstruindo a ordem de leitura.
- Pares de imagem-texto (ALIGN + LTIP): 4,4B pares.
- Pairagem de vídeo-texto (VTP): 27 milhões de clips de vídeo curtos.
OBELICS (2023) é uma reprodução aberta do corpus web entrelaçado, que Idefics, Idefics2 e os modelos mais abertos "como Flamingo" treinam.
OpenFlamingo e Otter
O OpenFlamingo (2023) é a reprodução aberta. Arquitetura idêntica (re-sampler do perceptor + atenção cruzada fechada em LLaMA congelado ou MPT).
Otter (2023) baseia-se no OpenFlamingo com sintonização de instruções no MIMIC-IT (um conjunto de dados de instruções multimodal), mostrando também funções de atenção cruzada fechada para instruções seguidas.
Os descendentes
- Idefics / Idefics2 / Idefics3: A linhagem de atenção cruzada fechada do Hugging Face, progressivamente mais simples (Idefics2 deixou cair o resampler em favor de tokens de parche direto com pooling adaptativo).
- Transição Flamingo-Chameleon: até 2024, muitas equipes mudaram para fusão precoce (Lessão 12.11); A atenção cruzada fechada no estilo Flamingo permanece em produção onde é necessária a congelação da espinha dorsal.
- A entrada entrelaçada de Gémeos: conceitualmente herda a flexibilidade de formato entrelaçado do Flamingo, embora o mecanismo exato seja proprietário.
Comparar com 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 |
Escolha BLIP-2 para VQA de imagem única em um orçamento. Escolha Flamingo/Idefics2 para raciocínio interligado, de poucas fotos ou de imagem múltipla.
Usá-lo
code/main.pydemonstra:
- Um resampler Perceptor em 36 tokens de patch falsos com 8 latentes aprendizes (pura atenção cruzada Python).
- Um passo de atenção cruzada com um portão .
alpha = 0→ saída é igual a entrada (LLM inalterado), entãoalpha = 2.0→ contribuição visual misturada. - Um construtor de máscaras entrelaçadas que produz a máscara de atenção 2D para uma sequência "(imagem 1) (texto 1) (imagem 2) (texto 2)".
Envia-o
Esta lição produzoutputs/skill-gated-bridge-diagnostic.md. Dada a configuração de um VLM aberto (resampler Y/N, frequência de atn, esquema de gate), ele identifica os elementos da linhagem Flamingo e explica a estratégia de congelamento. Útil para depurar por que um ajuste fino degradou o desempenho do texto (resposta: o gate se alargou demais e rapidamente).
Exercícios
- Compute o número de parâmetros visuais do Flamingo-9B: 9B LLM + 1,4B camadas de atenção cruzada fechadas + 64M resampler. Que fração dos parâmetros totais é treinada?
- Implementar o resíduo fechado
y = tanh(alpha) * cross + xDemonstre experimentalmente que comalpha=0- Não .y==x- Exactamente no início.
- Leia a Seção 3.2 do OpenFlamingo (arXiv:2308.01390) sobre como eles tratam várias imagens em um lote quando cada prompt tem uma contagem de imagens diferente. Descreva a estratégia de enchimento.
- Por que a máscara de atenção cruzada do Flamingo permite que um token de texto atenda apenas à imagem anterior mais recente do que a todas as imagens anteriores?
- Pouco-choque no contexto: construa um prompt com 4 exemplos de "imagem → cor do objeto principal" para uma nova variante do Flamingo. Descreva o padrão de precisão esperado ao variar o número de exemplos de 0 a 8.
Termos-chave
| 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 |
Mais leitura
- Alayrac et al. — Flamingo (arXiv:2204.14198)- O papel original.
- Awadalla et al. — OpenFlamingo (arXiv:2308.01390) Reprodução aberta.
- Laurençon et al. — OBELICS (arXiv:2306.16527) Corpus de telas entrelaçadas.
- Jaegle et al. — Perceiver IO (arXiv:2107.14795)A arquitetura geral do Perceptor.
- Li et al. — Otter (arXiv:2305.03726)- Descendente flamingo com instruções.
- Laurençon et al. — Idefics2 (arXiv:2405.02246) simplificação moderna da abordagem 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.