Fusionner des modalités : précoce, tardive, croisée
Prérequis : DL 10.2 (MLP), DL 20.1 (attention), CV 7.1 (ViT), NLP 3.1 (embeddings) · Notions : modalité, encodeur par modalité, espace partagé, fusion précoce, tardive, intermédiaire, attention croisée, produit bilinéaire, alignement contre fusion, modalité manquante, déséquilibre entre modalités
Ce qu'est une modalité
Une modalité est un type de signal : texte, image, audio, vidéo, mais aussi série temporelle de capteurs, graphe moléculaire, tableau. Chacune a sa structure (séquence de jetons, grille de pixels, onde à 16 kHz) et donc son encodeur naturel : Transformer pour le texte, ViT ou CNN pour l'image (CV 7.1), réseau sur spectrogramme pour l'audio (MM 4.1). Le problème multimodal tient en une question : où et comment faire se rencontrer les représentations.
Deux objectifs différents
- Aligner : mettre les modalités dans un espace commun où une image et sa légende ont des vecteurs proches. Sert à la recherche cross-modale (texte → image) et à la classification zéro-shot. C'est CLIP (MM 2.2).
- Fusionner : combiner les informations pour une décision ou une génération qui a besoin des deux à la fois (répondre à une question sur une image, détecter une vidéo truquée où le son ne colle pas aux lèvres). C'est le cas des modèles vision-langage (MM 3.1).
Les trois niveaux de fusion
Fusion précoce (early fusion) : on concatène les caractéristiques (ou les jetons) dès l'entrée et un seul réseau traite le tout,
Fusion tardive (late fusion) : un modèle complet par modalité, on combine seulement leurs décisions, par exemple en moyennant les probabilités. Robuste, modulaire, chaque modèle s'entraîne sur ses propres données. Mais elle est aveugle aux interactions : si l'étiquette dépend d'une relation entre le son et l'image (le chien aboie-t-il sur cette image ?), aucun modèle unimodal ne peut la voir.
Fusion intermédiaire : chaque modalité est encodée séparément, puis les représentations se rencontrent au milieu du réseau. Trois mécanismes :
- Concaténation de vecteurs suivie d'un MLP : simple, base de référence.
- Interaction multiplicative :
ou un produit bilinéaire . Une addition ne peut pas exprimer « l'un ET l'autre » ; un produit, si. FiLM (2018) module chaque canal d'une modalité par un gain et un biais calculés depuis l'autre : . - Attention croisée (cross-attention) : les jetons d'une modalité forment les requêtes, ceux de l'autre les clés et valeurs (DL 20.1). Chaque mot de la question « regarde » les patchs de l'image qui le concernent. C'est le mécanisme de Flamingo, de Perceiver et des décodeurs de diffusion texte→image (MM 5.1).
Option la plus récente : tout en jetons. L'image est transformée en jetons (patchs projetés, ou jetons discrets d'un tokeniseur visuel), concaténés aux jetons de texte, et un seul Transformer traite la séquence : une fusion précoce à l'échelle des jetons (MM 7.1).
Les difficultés propres au multimodal
- Déséquilibre entre modalités : le réseau apprend d'abord la modalité la plus facile et néglige l'autre (modality laziness). Parades : abandonner aléatoirement une modalité à l'entraînement (modality dropout), pertes auxiliaires par modalité.
- Modalité manquante au test : capteur en panne, vidéo sans son. Il faut l'avoir simulée à l'entraînement.
- Alignement temporel : la parole et les lèvres, les sous-titres et l'image ne sont pas toujours synchronisés.
- Données appariées rares : il y a beaucoup d'images et beaucoup de textes, beaucoup moins de paires propres. D'où l'intérêt de partir d'encodeurs unimodaux pré-entraînés et de n'apprendre que le « pont » entre eux.
Pourquoi une somme ne suffit pas. Deux caractéristiques binaires
Détecter un doublage raté. Vidéo d'interview, piste audio en français : la voix est-elle synchronisée avec les lèvres ? Un modèle image seule voit des lèvres qui bougent, un modèle audio seul entend de la parole : chacun dit « normal ». Seule une fusion qui met en relation les jetons vidéo et audio au même instant (attention croisée temporelle) peut détecter le décalage. Si on veut aussi que le système marche sur des vidéos sans son, il faut l'entraîner avec de l'audio masqué une fois sur cinq.
- Génère deux modalités synthétiques dont l'étiquette dépend d'un signal par modalité et d'une interaction entre elles.
- Compare fusion tardive (deux MLP, moyenne des probabilités), fusion précoce (concaténation + MLP) et fusion par produit (termes
+ régression logistique). - Supprime l'audio au test et compare la robustesse des deux approches.
Solution commentée
import numpy as np, warnings
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression
warnings.filterwarnings("ignore")
rng = np.random.default_rng(0)
# Deux modalités synthétiques : « image » (8 dim) et « audio » (8 dim).
# Étiquette = un signal présent dans chaque modalité séparément + une interaction (XOR) entre elles.
def donnees(n):
a = rng.normal(size=(n, 8)); b = rng.normal(size=(n, 8))
logit = 1.0 * a[:, 0] + 1.0 * b[:, 0] + 1.5 * np.sign(a[:, 1]) * np.sign(b[:, 1])
y = (logit + 0.5 * rng.normal(size=n) > 0).astype(int)
return a, b, y
A, B, y = donnees(4000); At, Bt, yt = donnees(2000)
# fusion tardive : un modèle par modalité, on moyenne les probabilités
ma = MLPClassifier((32,), max_iter=800, random_state=0).fit(A, y)
mb = MLPClassifier((32,), max_iter=800, random_state=0).fit(B, y)
p_tard = (ma.predict_proba(At)[:, 1] + mb.predict_proba(Bt)[:, 1]) / 2
acc_tard = np.mean((p_tard > 0.5) == yt)
# fusion précoce : on concatène les caractéristiques, un seul modèle voit les deux
me = MLPClassifier((32,), max_iter=800, random_state=0).fit(np.hstack([A, B]), y)
acc_prec = me.score(np.hstack([At, Bt]), yt)
# fusion par produit (interaction multiplicative explicite) : a ⊗ b puis linéaire
prod = lambda a, b: np.einsum("ni,nj->nij", a, b).reshape(len(a), -1)
mp = LogisticRegression(max_iter=3000).fit(np.hstack([A, B, np.sign(prod(A, B))]), y)
acc_prod = mp.score(np.hstack([At, Bt, np.sign(prod(At, Bt))]), yt)
print(f"fusion tardive {acc_tard:.3f} | précoce (concat + MLP) {acc_prec:.3f} | produit + linéaire {acc_prod:.3f}")
assert acc_prec > acc_tard + 0.1
# robustesse à une modalité manquante (audio remplacé par des zéros au test)
acc_prec_manq = me.score(np.hstack([At, np.zeros_like(Bt)]), yt)
acc_tard_manq = np.mean((ma.predict_proba(At)[:, 1] > 0.5) == yt) # la fusion tardive peut simplement ignorer l'audio
print(f"audio manquant : précoce {acc_prec_manq:.3f} | tardive (image seule) {acc_tard_manq:.3f}")
assert acc_tard_manq > acc_prec_manq
Résultats attendus : environ 0,63 pour la fusion tardive, 0,85 pour la précoce et 0,93 pour le produit explicite, qui a « reçu » la bonne forme d'interaction. Quand l'audio disparaît, la fusion précoce chute plus bas que le modèle image seul de la fusion tardive : chaque architecture paie quelque part. Prolongement : entraîne le modèle précoce avec l'audio mis à zéro sur 20 % des exemples (modality dropout) et refais la mesure.
À retenir
- Aligner (espace commun, CLIP) et fusionner (décision conjointe, VLM) sont deux objectifs distincts.
- Précoce : toutes les interactions, fragile aux absences ; tardive : robuste, aveugle aux interactions.
- Au milieu : concaténation, interactions multiplicatives (FiLM), attention croisée.
- Pièges : modalité paresseuse, modalité manquante, désynchronisation, rareté des paires.