Aller au contenu principal

Module 7 — Démarrage à froid : utilisateurs et objets nouveaux

Le collaboratif fonctionne parce que la matrice contient des interactions. Sans interaction, il ne dit rien. Ce module traite les trois formes de démarrage à froid qui apparaissent en production — objet nouveau, utilisateur nouveau, système entier nouveau — et présente les stratégies qui remplacent le signal manquant par autre chose.

Trois formes de démarrage à froid

Le vocabulaire varie ; les trois cas sont pourtant très différents.

Le démarrage à froid objet concerne un cours qui vient d'être publié. Il a un titre, une description, une durée, un formateur, mais zéro évaluateur. Le collaboratif ne peut pas lui attribuer de facteur latent utile ; toute prédiction puqip_u^{\top} q_i est aussi aléatoire que son initialisation. Le contenu du module 4, en revanche, dispose de toute l'information nécessaire : le plongement de la description existe dès la création. C'est le cas de démarrage le plus simple parce qu'il a une solution structurelle.

Le démarrage à froid utilisateur concerne un apprenant qui vient de s'inscrire. Il n'a rien cliqué, rien noté, rien terminé. Le collaboratif ne peut pas construire son profil, le contenu non plus — parce que le contenu s'appuie sur l'agrégat des cours suivis, qui est vide. C'est le cas le plus fréquent en pratique et le plus douloureux : la première session est celle qui décide si l'apprenant reste sur la plateforme.

Le démarrage à froid système concerne un lancement de plateforme, où ni utilisateurs ni interactions n'existent. Les cinq premières semaines d'InSkillML sont dans ce régime. Aucun algorithme collaboratif n'a de sens ; on repose entièrement sur le contenu et sur des heuristiques éditoriales, avant que la matrice ne prenne assez de chair pour justifier la factorisation du module 3.

Contenu pour les objets nouveaux

La stratégie est directe : dès qu'un cours entre au catalogue, son plongement de description est calculé et il devient candidat au filtrage par contenu. Le score pour l'apprenant uu est la similarité cosinus entre son profil de contenu et le plongement du nouveau cours. Sur InSkillML, cela suffit pour que le cours nouveau apparaisse dans le top-10 des apprenants dont le profil est proche, dès son premier jour.

L'implémentation typique dans un moteur hybride ressemble à ceci :

def score_avec_froid(u, i, nb_interactions_i, seuil=5):
score_contenu = similarite(profil_contenu[u], plongement_cours[i])
if nb_interactions_i < seuil:
return score_contenu # collaboratif indisponible
score_collab = produit_scalaire(p[u], q[i])
poids_c = min(nb_interactions_i / (nb_interactions_i + 20), 1.0)
return poids_c * score_collab + (1 - poids_c) * score_contenu

La formule de pondération lisse le passage entre les deux régimes : à zéro interaction, on prend 100 % contenu ; à 20 interactions, on est à 50/50 ; à 200, on est à 90/10. C'est un compromis qui évite les discontinuités de qualité de la commutation dure du module 5.

Popularité et questionnaire pour les utilisateurs nouveaux

Un apprenant sans historique n'a pas de profil personnel. Trois stratégies coexistent, du moins coûteux au plus riche.

La popularité contextualisée propose les cours les plus suivis de la catégorie déduite de signaux gratuits — la page d'atterrissage, la langue du navigateur, la géolocalisation, l'appareil, le référant. C'est le mode par défaut. Il n'y a rien de plus fort pour recommander à un nouveau visiteur français arrivé depuis un article sur le machine learning que « les cinq cours de machine learning les plus populaires en France ».

Le questionnaire d'accueil demande explicitement à l'apprenant deux ou trois informations : niveau (débutant, intermédiaire, avancé), domaines d'intérêt (choix parmi une liste), objectif (certification, changement de carrière, curiosité). Les plateformes comme Duolingo et LinkedIn Learning l'imposent, avec de bonnes raisons : quelques clics fournissent l'équivalent de dizaines d'interactions collaboratives, et la conversion en inscription payante monte de 20 à 40 % dans les études publiées. Le piège est de rendre le questionnaire trop long — au-delà de trois écrans, le taux de complétion s'effondre.

La similarité de plongement à plongement, plus subtile, prend les intérêts déclarés dans le questionnaire, les convertit en plongement de description avec le même encodeur que les cours (module 4), et recommande par similarité cosinus. C'est comme si le questionnaire créait un « faux profil de contenu » qui remplace le vrai profil de l'apprenant tant qu'il n'a pas cliqué. Sur InSkillML, cette stratégie fait cliquer 15 % de plus au premier jour qu'une simple popularité.

Exploration contrôlée

Toutes ces stratégies partagent un défaut : elles exploitent ce qu'on croit savoir sans jamais tester si l'apprenant serait intéressé par autre chose. C'est le dilemme classique exploration versus exploitation des bandits manchots. La formulation multi-bras suppose qu'à chaque affichage, on choisit un cours parmi les candidats ; on observe une récompense (clic, inscription, achèvement) ; on met à jour la croyance sur la qualité du cours pour cet apprenant.

Deux algorithmes s'imposent en production :

  • UCB (Upper Confidence Bound) : le score du cours ii pour uu est s^(u,i)+clogt/nu,i\hat{s}(u, i) + c \sqrt{\log t / n_{u,i}}, où nu,in_{u,i} est le nombre de fois où ii a été montré à uu. Le second terme force à essayer les cours peu montrés, indépendamment de leur score estimé.
  • Thompson Sampling : on maintient une distribution de croyance sur s^(u,i)\hat{s}(u, i), on en tire un échantillon à chaque affichage, on classe par cet échantillon. Simple à implémenter et souvent supérieur à UCB en pratique.

L'exploration coûte à court terme (les cours testés sont parfois de mauvais choix) mais rapporte à long terme (le modèle apprend plus sur les préférences réelles). Elle est indispensable pour casser la bulle de filtre du module 4 : sans exploration, un apprenant enregistré sur du Python ne verra jamais un cours de statistiques, et l'on ne saura jamais s'il l'aurait aimé.

import numpy as np

def thompson_sampling(scores_moyens, incertitudes, k=10):
# Un tirage gaussien par cours : le score estimé plus un bruit d'écart-type
# égal à l'incertitude sur ce score.
tirages = np.random.normal(loc=scores_moyens, scale=incertitudes)
return np.argsort(-tirages)[:k]

L'erreur qui coûte cher : traiter tout le monde comme un froid

Une équipe qui ne distingue pas les régimes finit souvent par appliquer la stratégie froide (popularité) à tout le monde. Le résultat est un moteur qui recommande la même liste à tous les apprenants actifs, et où la personnalisation ne sert plus à rien. Une bonne architecture route la requête vers la bonne stratégie :

def strategie(u, nb_interactions_u):
if nb_interactions_u == 0:
return "popularité_contextuelle"
if nb_interactions_u < 3:
return "contenu_avec_exploration"
return "hybride_collaboratif"

Ce routage est simple, robuste, et se paramètre avec deux seuils entiers seulement. Il capture pourtant l'essentiel : les trois régimes de démarrage à froid ne se traitent pas avec la même architecture.

La rétroaction implicite comble le froid rapidement

Trois inscriptions à des cours suffisent souvent à passer d'un profil pur contenu à un profil collaboratif utile. Mieux : trois clics sur des cartes de cours (sans même l'inscription) contribuent déjà au profil, surtout si l'on pondère par la durée passée sur la page. L'implicite est le grand allié du démarrage à froid utilisateur, précisément parce qu'il est abondant là où l'explicite est absent.

En résumé

  • Le démarrage à froid objet se résout par le contenu du module 4 ; c'est le plus simple des trois.
  • Le démarrage à froid utilisateur combine popularité contextualisée, questionnaire d'accueil et similarité de plongements ; ne pas dépasser trois écrans de questions.
  • Le démarrage à froid système repose entièrement sur contenu et éditorial, avant que la matrice ne prenne du volume.
  • L'exploration contrôlée (UCB, Thompson) est indispensable pour casser la bulle de filtre et découvrir les préférences réelles.

Module suivant : mesurer proprement la qualité d'un moteur, hors ligne, avec les bonnes métriques.