2026-07-27

SigLIP expliqué : pourquoi une perte plus simple a surpassé celle de CLIP

AIMachine Learning🌍 Global

CLIP apprenait aux encodeurs d'images et de texte à s'accorder entre eux en faisant s'affronter chaque paire d'un batch contre toutes les autres. SigLIP pose une question bien plus modeste, paire par paire : cette paire image-texte correspond-elle, oui ou non ? C'est toute l'idée, et c'est pourquoi SigLIP — d'abord proposé par Google DeepMind en 2023, aujourd'hui à sa deuxième génération — est devenu discrètement l'encodeur visuel par défaut d'une large part des modèles vision-langage open source récents, PaliGemma en tête.

Les deux modèles partagent par ailleurs la même architecture. Tout, jusqu'à la dernière étape — les encodeurs, les embeddings, le score de similarité — est identique ; seule l'étape de la perte, mise en évidence ci-dessous, diverge :

Pipeline diagram showing CLIP and SigLIP share identical image and text encoders and the same pairwise similarity logit computation, and diverge only at the final loss stage: CLIP uses a softmax cross-entropy normalized over every row and column of the batch matrix, while SigLIP uses a sigmoid cross-entropy that scores each pair independently

Le problème que SigLIP devait résoudre

CLIP (2021) entraîne deux encodeurs distincts — un pour les images, un pour le texte — de sorte que les paires image-texte qui correspondent se retrouvent proches dans un espace d'embedding partagé, et que les paires qui ne correspondent pas se retrouvent éloignées. Il le fait avec une perte contrastive de type softmax : pour un batch de NN paires image-texte, on construit la matrice complète N×NN \times N des scores de similarité, puis on normalise chaque ligne et chaque colonne avec un softmax, en traitant cela comme un problème de classification à NN classes — « laquelle de ces NN légendes correspond à cette image ? »

Cela fonctionne, mais la normalisation softmax fait que la perte de chaque paire dépend de toutes les autres paires du batch à cette étape. Il faut avoir matérialisé la matrice entière avant de pouvoir calculer quoi que ce soit, ce qui coûte une mémoire qui croît avec la taille du batch et crée une asymétrie entre lignes et colonnes qu'il faut gérer avec deux passes (un softmax images-vers-textes, un autre textes-vers-images).

La solution : traiter chaque paire indépendamment

SigLIP — Sigmoid Loss for Language Image Pre-Training, Xiaohua Zhai, Basil Mustafa, Alexander Kolesnikov et Lucas Beyer, Google DeepMind, ICCV 2023 — remplace le softmax par une perte de type sigmoïde. Chaque paire image-texte, qu'elle corresponde ou non, est évaluée seule, comme un problème de classification binaire : pour la paire (j,k)(j, k), le logit est

sj,k=t(ijtk)+bs_{j,k} = t \cdot (\mathbf{i}_j \cdot \mathbf{t}_k) + b

ij\mathbf{i}_j et tk\mathbf{t}_k sont les embeddings (normalisés) de l'image et du texte, tt est une température apprise, et bb est un biais appris. La perte n'est alors qu'une entropie croisée binaire par rapport à une étiquette de +1+1 pour la vraie paire (j=kj = k) et 1-1 pour chaque paire non correspondante — pas de ligne, pas de colonne, pas de terme de normalisation partagé :

L=1BjBkBlog11+ezj,k(t(ijtk)b),zj,k={1j=k1jk\mathcal{L} = -\frac{1}{|B|}\sum_{j \in B}\sum_{k \in B} \log \frac{1}{1+e^{z_{j,k}(-t(\mathbf{i}_j \cdot \mathbf{t}_k)-b)}}, \quad z_{j,k} = \begin{cases} 1 & j = k \\ -1 & j \ne k \end{cases}

Diagram comparing CLIP's softmax loss, which normalizes similarity scores across every row and column of the batch matrix, with SigLIP's sigmoid loss, which scores each image-text pair independently as a binary classification problem

Le biais appris bb compte plus qu'il n'y paraît : avec N1N-1 négatifs pour chaque positif dans un batch, la perte est au départ dominée par les négatifs, donc les auteurs initialisent bb fortement négatif pour contrebalancer ce déséquilibre en début d'entraînement.

Comme aucune paire n'a besoin d'informations provenant d'une autre paire pour calculer sa propre perte, on ne construit jamais la matrice normalisée dense — chaque appareil peut calculer son lot local de paires et n'a besoin d'échanger que les embeddings bruts, pas des statistiques softmax intermédiaires. C'est une opération plus petite, plus facilement parallélisable, et c'est toute la raison des gains d'efficacité présentés ci-dessous.

Ce que cela leur a rapporté

Les résultats phares de l'article, d'après le résumé et la présentation à l'ICCV :

  • Meilleur sur de petits batchs, et passe encore mieux à l'échelle sur les grands. La perte sigmoïde supprime la dépendance du softmax à de très grands batchs pour obtenir un signal fiable, tout en se parallélisant à moindre coût quand on monte en échelle.
  • La taille de batch sature autour de 32k, bien en dessous des configurations à la CLIP qui poussaient vers des centaines de milliers ; les gains à aller jusqu'à un batch d'1M sont marginaux.
  • Un modèle SigLiT — la perte de SigLIP combinée au Locked-image Tuning — a atteint 84,5 % de précision zero-shot sur ImageNet en entraînant sur seulement quatre puces TPUv4 pendant deux jours.

Ce dernier chiffre est celui qui comptait en pratique : un résultat de cet ordre ne nécessitait plus un cluster d'entraînement à l'échelle d'un laboratoire.

Une architecture délibérément simple

Rien n'est novateur dans les encodeurs — c'est précisément le propos de l'article. SigLIP est un double encodeur standard : un Vision Transformer pour les images, un encodeur de texte Transformer pour le texte, chacun produisant un unique embedding agrégé, comparés par produit scalaire. Tout l'effort de conception porte sur la perte, pas sur les tours.

L'implémentation dans transformers de Hugging Face expose exactement cette séparation — SiglipVisionModel, SiglipTextModel, et un SiglipModel combiné — plus SiglipForImageClassification pour le cas d'une tête de classification, ainsi que le support de FlashAttention/SDPA et de la quantification int4 via bitsandbytes. Deux détails d'usage que la documentation signale comme faciles à mal faire : toujours passer padding="max_length" au tokenizer (SigLIP a été entraîné sans la convention de longueur variable basée sur [EOS] dont dépend CLIP), et pour la classification zero-shot, utiliser le gabarit de prompt littéral "This is a photo of {label}.", celui sur lequel le modèle a été calibré.

from PIL import Image
import requests
from transformers import AutoProcessor, AutoModel
import torch

model = AutoModel.from_pretrained("google/siglip-so400m-patch14-384")
processor = AutoProcessor.from_pretrained("google/siglip-so400m-patch14-384")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
texts = ["a photo of 2 cats", "a photo of 2 dogs"]

inputs = processor(text=texts, images=image, padding="max_length", return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)
    probs = torch.sigmoid(outputs.logits_per_image)  # independent probabilities, not a softmax distribution

Remarquez la dernière ligne : comme la perte est une sigmoïde, les scores au moment de l'inférence sont des probabilités indépendantes par étiquette, plutôt qu'une distribution qui doit sommer à 1 sur l'ensemble de vos légendes candidates — une différence petite mais réelle par rapport à la manière de lire les logits de CLIP.

Le so400m dans ce nom de checkpoint mérite une note : c'est un ViT « à forme optimisée » (SoViT-400m) issu d'un article séparé de Google sur les formes de vision transformer optimales en calcul, pas quelque chose introduit par SigLIP lui-même — SigLIP l'a simplement adopté comme l'une de ses variantes publiées, aux côtés de dorsaux ViT-B et ViT-L classiques.

SigLIP 2 : la même idée, généralisée

SigLIP 2: Multilingual Vision-Language Encoders with Improved Semantic Understanding, Localization, and Dense Features (Tschannen et al., Google DeepMind, février 2025) conserve la perte sigmoïde comme objectif de base et y ajoute plusieurs éléments de recette d'entraînement : un pré-entraînement basé sur le sous-titrage, des pertes auto-supervisées (auto-distillation et prédiction masquée, dans l'esprit de DINO/BEiT), et une curation de données en ligne. Il est entraîné sur WebLI, environ 10 milliards d'images associées à 12 milliards de textes alternatifs dans 109 langues, et se décline en quatre tailles — B (86M), L (303M), So400m (400M), et une nouvelle g (1B) — plus une variante NaFlex qui accepte les ratios d'aspect natifs et plusieurs résolutions plutôt que d'imposer un recadrage carré fixe. Selon l'article, SigLIP 2 surpasse SigLIP 1 à chaque échelle de modèle comparable, en classification zero-shot, en recherche image-texte, et en tant que tour de vision gelée alimentant des VLM en aval.

Pourquoi ce choix de conception a fini par compter au-delà de l'article

Les chiffres d'efficacité font la une, mais l'effet le plus durable est architectural : parce que SigLIP est assez peu coûteux à bien pré-entraîner sans configuration d'entraînement multi-pods à grands batchs, il est devenu un choix par défaut facile et de haute qualité à greffer comme encodeur de vision gelé (ou légèrement ajusté) dans les modèles vision-langage ultérieurs — PaliGemma en étant l'exemple le plus clair, utilisant directement l'encodeur So400m de SigLIP. Une fonction de perte qui a levé une contrainte d'échelle s'est transformée en un composant que d'autres équipes pouvaient réutiliser sans avoir à le redériver — c'est ainsi qu'une bonne simplification se propage habituellement dans un domaine.

Liens