Module 5 — Approches hybrides
Aucune méthode seule ne couvre tout. Le collaboratif du module 3 comprend les goûts personnels mais ignore les nouveautés ; le contenu du module 4 gère les nouveautés mais enferme dans la bulle. Les systèmes hybrides combinent les deux précisément là où chacun est fort — c'est-à-dire différemment selon l'utilisateur et selon le cours.
Trois familles d'hybridation
Burke, dans un article de 2002 devenu la référence, distingue sept stratégies. En pratique, trois suffisent à couvrir 95 % des cas.
La pondération combine les scores de deux modèles indépendants :
C'est la forme la plus simple, et déjà très puissante. Le paramètre se règle par validation croisée, typiquement autour de 0,7 sur MovieLens (le collaboratif domine dès qu'on a de la donnée) et autour de 0,4 sur InSkillML aux premières semaines de la plateforme (le catalogue est jeune, la matrice creuse, le contenu porte l'essentiel du signal). La subtilité est de normaliser les deux scores avant d'additionner : vit sur l'échelle des notes prédites (1 à 5), sur celle des cosinus (0 à 1) ; sans mise à la même échelle, l'un écrase l'autre.
La commutation choisit une méthode ou l'autre selon un critère observable :
def recommander_hybride(u, cours_i, nb_interactions):
if nb_interactions[u] < 3 or nb_interactions[cours_i] < 5:
return score_contenu(u, cours_i)
return score_collaboratif(u, cours_i)
C'est la stratégie du démarrage à froid du module 7. On bascule sur le contenu pour les apprenants nouveaux et les cours nouveaux, on repasse au collaboratif dès que le signal est fiable. Elle est facile à raisonner, mais crée des discontinuités de qualité dès que l'apprenant franchit le seuil : le troisième cours suivi peut faire disparaître de la page d'accueil une recommandation excellente. Une variante lisse consiste à pondérer progressivement selon .
L'enrichissement des facteurs par le contenu est plus élégant et plus lourd à mettre en œuvre. On modifie le modèle de factorisation pour que le vecteur latent d'un cours ne soit pas libre mais soit une fonction de son plongement de contenu :
Le terme ancre le vecteur latent dans le contenu ; le terme absorbe ce que le contenu ne dit pas. Un cours qui n'a jamais été suivi reçoit tout de même un vecteur latent utile via , alors qu'un cours mature bénéficie du raffinement collaboratif. C'est exactement le principe de la bibliothèque LightFM (Kula, 2015), qui a industrialisé cette hybridation.
LightFM en pratique
LightFM entraîne conjointement les facteurs libres et les facteurs venant du contenu par descente de gradient, avec une perte adaptée à la rétroaction implicite (WARP, BPR, ou logistique). C'est la bibliothèque de référence pour un moteur hybride prêt à mettre en production sur un catalogue de quelques milliers d'objets.
from lightfm import LightFM
from lightfm.data import Dataset
import numpy as np
# Dataset : apprenants, cours, plongements de description en variables d'objet.
ds = Dataset()
ds.fit(
users=identifiants_apprenants,
items=identifiants_cours,
item_features=noms_de_variables_contenu, # noms des dimensions du plongement
)
interactions, poids = ds.build_interactions(
(u, i, poids_ui) for u, i, poids_ui in interactions_implicites
)
caracteristiques_cours = ds.build_item_features(
(i, {f"dim_{k}": float(v) for k, v in enumerate(plongements[i])})
for i in identifiants_cours
)
modele = LightFM(
no_components=64,
loss="warp", # optimise directement le classement top-k
learning_rate=0.05,
item_alpha=1e-6, # régularisation des facteurs de cours
user_alpha=1e-6,
)
modele.fit(
interactions,
item_features=caracteristiques_cours,
sample_weight=poids,
epochs=30,
num_threads=4,
)
# Prédiction pour l'apprenant 0 sur tout le catalogue.
scores = modele.predict(
0,
np.arange(interactions.shape[1]),
item_features=caracteristiques_cours,
)
La perte WARP (Weighted Approximate-Rank Pairwise) est essentielle à comprendre : à chaque exemple positif , elle échantillonne des cours négatifs jusqu'à en trouver un que le modèle classe au-dessus de , et le gradient corrige alors précisément ce mauvais classement. C'est un précurseur direct de l'échantillonnage négatif du module 6.
Quand chaque approche prend le relais
L'intérêt réel de l'hybridation n'est pas d'améliorer une métrique moyenne — les gains sont souvent modestes, 3 à 5 % sur le NDCG@10. Il est de rendre les mauvais cas moins mauvais. Trois régimes se distinguent nettement.
Pour un apprenant très actif (plus de 20 cours suivis) sur un catalogue mature (chaque cours a au moins 50 évaluateurs), le collaboratif domine ; l'hybride ne rapporte presque rien parce que le collaboratif capte déjà toute la structure. Sur MovieLens 25M, LightFM en mode purement collaboratif fait aussi bien que LightFM en mode hybride.
Pour un apprenant froid (moins de 3 interactions) ou un cours froid (moins de 5 évaluateurs), l'hybride est irremplaçable. Le collaboratif y prédit la moyenne globale ou du bruit ; le contenu, lui, produit une recommandation immédiatement utile. C'est là que la métrique globale ne rend pas justice au gain : on améliore la qualité perçue des 20 % de sessions les plus fragiles, celles où l'apprenant décide s'il reste ou part.
Pour un apprenant actif mais un cours rare, le collaboratif écrase le cours faute de signal ; le contenu le repêche. C'est la manière élégante dont l'hybridation atténue la queue longue du catalogue et améliore la couverture (module 8).
Piège : ne pas comparer deux modèles sur des tirages différents
L'erreur classique qui invalide beaucoup de comparaisons d'hybrides est de comparer un modèle collaboratif entraîné sur les cellules non nulles à un modèle hybride entraîné sur toutes les cellules. Les deux ne voient pas les mêmes exemples et ne minimisent pas la même perte ; leurs métriques ne sont pas comparables. Le protocole propre exige :
- même découpage entraînement/validation (le module 10 impose un découpage temporel) ;
- même stratégie d'échantillonnage négatif entre les deux modèles ;
- même métrique évaluée sur le même sous-ensemble de couples de test.
Sans ces précautions, un hybride peut sembler faire 15 % de mieux uniquement parce qu'il a été évalué sur un ensemble plus facile.
Une règle empirique tirée d'une bonne dizaine de projets : si la densité de votre matrice dépasse 3 % et que 90 % des cours ont au moins 20 évaluateurs, un pur collaboratif du module 3 avec biais suffit. Sous ces seuils, un hybride LightFM avec plongements de descriptions rapporte plus que n'importe quel raffinement d'architecture profonde du module 6.
En résumé
- La pondération combine linéairement deux scores après normalisation ; c'est le point de départ simple et robuste.
- La commutation bascule d'un modèle à l'autre selon la maturité de l'utilisateur ou du cours ; simple à raisonner, discontinue en qualité.
- L'enrichissement ancre les facteurs latents dans les plongements de contenu ; LightFM est l'implémentation de référence, avec la perte WARP.
- L'hybridation améliore surtout les cas fragiles (démarrage à froid, cours rares) et gagne peu sur la moyenne quand la matrice est déjà dense.
Module suivant : porter cette même hybridation dans un réseau profond à deux tours.