Dans l’article précédent, j’ai décrit comment mon coach sportif planifiait ses relances avec un processus de Poisson non-homogène. Ce modèle tirait des horaires plausibles, mais il avait un défaut de fond : il résumait tout le passé de la personne en deux nombres, le taux de suivi $C$ et l’inactivité $D$, puis rejouait la même mécanique chaque matin. Surtout, il modélisait les rappels comme un flux exogène, des événements que l’on observe, alors qu’un rappel est une décision que je prends.
Cet article présente le modèle qui l’a remplacé et qui fait tourner le coach aujourd’hui. Il traite la relance comme ce qu’elle est : une décision répétée, prise pour une personne dont je ne connais l’état qu’indirectement. C’est ce que la littérature appelle une intervention adaptative au bon moment (JITAI), et cela se formalise comme un processus de décision sous observation partielle, un POMDP. En interne je l’appelle SCOP, pour Shielded Causal Online Policy : une politique randomisée, protégée par un bouclier de contraintes dures, qui apprend de façon causale.
Décider plutôt que simuler un flux
Le processus de Poisson répondait à une seule question : à quelles heures tirer des rappels. Le coach d’aujourd’hui répond à une question plus large : faut-il relancer, combien de fois, à quelles heures et sur quel ton, pour une personne dont l’état réel m’échappe. C’est une décision, répétée chaque jour.
Cette décision s’articule en cinq briques, exécutées dans l’ordre chaque matin :
- mettre à jour une estimation de l’état de la personne à partir de ce qu’elle a fait la veille ;
- en déduire un risque de dérive si je n’interviens pas ;
- choisir une dose de rappels en pesant bénéfice et coût ;
- choisir les heures et le ton ;
- randomiser ce choix avec une probabilité connue, pour pouvoir apprendre.
Un bouclier déterministe entoure le tout et impose des garanties dures (jamais le dimanche, jamais en surcharge).
La boucle quotidienne. L’observation de la veille met à jour l’état, dont on déduit un risque, puis une dose, des heures et un ton. Le tout est tiré au sort sous le bouclier, et loggé pour l’apprentissage.
Un état de croyance, pas deux nombres
Là où le modèle précédent gardait deux scalaires, $C$ et $D$, le nouveau garde un état latent à six dimensions :
$$ X_t = (M_t, H_t, R_t, B_t, F_t, Q_t) $$chacune dans $[0, 1]$ :
- $M$, la motivation, la propension à s’entraîner spontanément ;
- $H$, la force de l’habitude ;
- $R$, la réceptivité aux messages ;
- $B$, la lassitude due aux sollicitations (burden) ;
- $F$, la fatigue physiologique ;
- $Q$, la fiabilité des engagements pris.
Je ne connais aucune de ces valeurs directement. J’en garde donc une distribution plutôt qu’une estimation ponctuelle : un nuage de mille hypothèses pondérées, chacune un état plausible. C’est un belief state, représenté par un filtre particulaire (particle filter). Au démarrage, ces hypothèses partent de priors modérés (motivation 0,55, habitude 0,45, réceptivité 0,50, lassitude 0,10, fiabilité 0,60) et d’une incertitude large.
À gauche, le modèle de Poisson résumait le passé en un point, (C, D). À droite, l’état de croyance est un nuage de particules sur la motivation et l’habitude : une distribution, et non une valeur.
À tout instant, ce nuage se résume par la moyenne et la dispersion de chaque dimension :
{
"etat": {
"motivation": {"moyenne": 0.58, "ecart_type": 0.11},
"habitude": {"moyenne": 0.41, "ecart_type": 0.09},
"receptivite": {"moyenne": 0.50, "ecart_type": 0.14},
"lassitude": {"moyenne": 0.14, "ecart_type": 0.06},
"fatigue": {"moyenne": 0.05, "ecart_type": 0.04},
"fiabilite": {"moyenne": 0.60, "ecart_type": 0.10}
},
"particules": 1000
}
Mettre l’état à jour chaque jour
C’est la pièce qui manquait au modèle de Poisson. Chaque matin, avant toute décision, le coach corrige son estimation avec ce qu’il a observé la veille. L’opération se fait en deux temps : d’abord prédire, ensuite corriger.
Prédire, c’est partir de l’estimation de la veille et la faire vieillir d’un jour. La motivation glisse un peu vers sa moyenne, l’habitude bouge lentement, et l’incertitude s’élargit : faute d’information nouvelle, le coach est un peu moins sûr de son état qu’il ne l’était hier. C’est le rôle d’un facteur d’oubli (discount 0,985 par jour), qui empêche une vieille observation de peser éternellement.
Corriger, c’est confronter cette prédiction à ce qui s’est réellement passé. Le coach reconstitue l’action de la veille $A_{t-1}$ (les rappels envoyés, leurs heures, leur ton), puis il assemble une observation $O_t$ depuis le tracker et Garmin : une séance a-t-elle eu lieu, à quelle charge, la personne a-t-elle répondu aux rappels, a-t-elle tenu un créneau planifié. Chaque hypothèse de l’état qui colle à cette observation est renforcée, chaque hypothèse qui la contredit est affaiblie, et le nuage se resserre.
Ces deux temps sont les deux facteurs d’un même pas bayésien, la prédiction (la transition) et la correction (la vraisemblance) :
$$ p(X_t \mid H_t) \;\propto\; \underbrace{p(O_t \mid X_t, A_{t-1})}_{\text{correction}} \cdot \underbrace{\int p(X_t \mid X_{t-1}, A_{t-1})\, p(X_{t-1} \mid H_{t-1})\, dX_{t-1}}_{\text{prédiction}} $$Un pas d’estimation, lu sur la motivation. La prédiction part de l’état d’hier et s’élargit (l’oubli ajoute de l’incertitude). L’observation d’une séance recentre et resserre le nuage : c’est le posterior du jour.
La vraisemblance d’une séance, le terme de correction, relie l’état et l’action à la probabilité de s’être entraîné :
$$ \Pr(\text{sport}_t = 1 \mid X_t, A_t) = \sigma\big(\alpha_0 + M_t + H_t - F_t + \beta^{\top}\varphi(A_t)\big) $$où $\sigma$ est la fonction logistique, $\alpha_0 = -1.25$ un intercept sceptique, et $\varphi(A_t)$ un vecteur qui décrit la dose, les heures et le ton. Cette équation porte le cœur du modèle, sa séparation en deux termes :
- la propension spontanée, $M_t + H_t - F_t$, ce que la personne ferait seule ;
- l’effet de l’intervention, $\beta^{\top}\varphi(A_t)$, ce que mes rappels y ajoutent.
Un exemple rend la correction concrète. Si la personne s’est entraînée hier sans aucun rappel, les hypothèses à forte motivation expliquent mieux l’observation : la motivation estimée monte, et la pression du jour baisse. Si elle a ignoré trois rappels sans bouger, ce sont les hypothèses à faible réceptivité qui collent, et le coach se fera plus discret. Tout l’enjeu est d’attribuer une séance à la propension spontanée ou à l’effet des rappels, et c’est ce qui justifie la dernière brique.
Le risque de dérive sans intervention
Une fois l’état à jour, la première question est simple : que se passerait-il si je ne faisais rien ? Je calcule le risque de dérive spontané, la probabilité qu’aucune séance adéquate n’ait lieu dans les 24 à 48 heures si je coupe tout rappel :
$$ p^0_t = \Pr(\text{aucune séance sous 24-48 h} \mid do(A=0), H_t) = 1 - \mathbb{E}_{X}\big[\sigma(\alpha_0 + M + H - F)\big] $$Le $do(A=0)$ est un opérateur d’intervention (do-calculus) : il force l’absence de rappel et coupe l’effet estimé des messages, pour isoler le comportement propre de la personne. Un $p^0$ élevé veut dire « elle risque de ne pas bouger seule », donc il faut peut-être insister. Un $p^0$ bas veut dire « elle s’entraînera sans moi », donc je peux rester discret.
Le do(A=0) coupe les rappels : la probabilité d’une séance suit alors σ(α₀ + M + H − F). Moyennée sur le nuage de croyance, elle donne P(séance | sans rappel) = E[σ], et le risque de dérive en est le complément, p⁰ = 1 - E[σ]. Un p⁰ élevé appelle à insister, un p⁰ bas à rester discret.
Choisir la dose
Le risque $p^0$ guide le nombre de rappels, mais il ne le fixe pas seul. Pour chaque dose $n \in \{0, \dots, 6\}$, j’évalue une utilité qui met en balance un bénéfice et plusieurs coûts :
$$ U_t(n) = \underbrace{\alpha_b\, p^0_t\,(1 - e^{-\gamma_b n})}_{\text{bénéfice}} \;-\; \lambda_1 n \;-\; \lambda_2 n^2 \;-\; \lambda_B\, \mathbb{E}[B_t]\, n \;-\; \lambda_V\, \mathrm{Var} $$Le bénéfice sature avec la dose (le quatrième rappel apporte moins que le premier) et croît avec le risque $p^0$ (insister sert davantage quand la personne décroche). Les coûts sont un coût linéaire par rappel ($\lambda_1 = 0.018$), un coût convexe qui rend les fortes doses rares ($\lambda_2 = 0.006$), un coût proportionnel à la lassitude estimée ($\lambda_B = 0.045$), et une pénalité de variance qui rend le coach prudent en incertitude ($\lambda_V = 0.08$).
Le nombre de rappels est ensuite tiré au sort, et non pris au maximum, par un softmax sur ces utilités :
$$ \Pr(n_t = n \mid H_t) \;\propto\; \mathbf{1}[n \in N_t]\,\exp\!\big(U_t(n)/T_N\big) $$La température $T_N = 0.05$ laisse passer un peu d’aléa autour de la meilleure dose. Cet aléa a un rôle précis : il rend possible l’apprentissage causal de la dernière brique.
Pour éviter le silence quand il faut insister, un plancher adaptatif impose une dose minimale selon le risque :
plancher(p⁰) = 0 si p⁰ < 0.55
plancher(p⁰) = 1 si 0.55 ≤ p⁰ < 0.75
plancher(p⁰) = 2 si p⁰ ≥ 0.75
C’est la réponse directe au défaut le plus visible du modèle de Poisson, ces journées tirées à zéro rappel alors que la personne attendait une relance. Une décision se logge alors en entier :
{
"p0": 0.62,
"plancher": 1,
"utilites": {"0": -0.01, "1": 0.11, "2": 0.08, "3": 0.02},
"propension": {"0": 0.00, "1": 0.61, "2": 0.30, "3": 0.07},
"dose_tiree": 1,
"heures": ["07:12"],
"ton": ["encourageant"]
}
L’utilité de chaque dose, pour un risque faible et un risque élevé. Le bénéfice sature et les coûts montent : l’utilité culmine vers une dose, d’autant plus grande que le risque est élevé.
La dose est tirée au sort plutôt que prise au maximum : un softmax tempéré la choisit autour des meilleures utilités. Le plancher écarte les doses faibles quand le risque l’exige, et la propension minimale de 0,02 garde chaque dose admissible atteignable, ce qui rend l’apprentissage causal possible.
Le bouclier
Toute cette mécanique est aléatoire, donc elle a besoin de garde-fous durs. Le bouclier réduit l’ensemble des doses admissibles avant le tirage. Certains jours, il le réduit à $\{0\}$ : le dimanche, en cas de surcharge manifeste, en cas de suspicion de blessure, ou le jour d’une reprise après un long arrêt (au moins quatorze jours sans séance). Les premières semaines, il plafonne la dose pour monter en charge doucement.
Le bouclier intervient une seconde fois, juste avant l’envoi. Si la personne a déjà fait sa séance entre la planification du matin et l’heure du rappel, le message prévu perd son sens : le bouclier l’annule ou le convertit en félicitation. Cette re-vérification garantit que l’action réellement envoyée correspond à l’état réel, ce qui compte autant pour l’expérience que pour l’apprentissage.
Les heures et le ton
Une fois la dose connue, il reste à placer les rappels dans la journée et à leur donner un ton.
Les heures viennent d’un processus ponctuel à cœur dur (hard-core point process), qui tire des minutes dans la fenêtre active en respectant un espacement minimal de trente minutes. Chaque minute reçoit un poids qui combine l’heure, la proximité d’un créneau planifié, la réceptivité historique de la personne, et une pénalité pour les heures intrusives. C’est plus contraint qu’un Poisson, qui violerait l’espacement.
Le poids de chaque minute combine l’heure, la proximité d’un créneau planifié et la réceptivité. Les rappels sont tirés là où le poids est fort, à au moins trente minutes l’un de l’autre (cœur dur).
Le ton suit une échelle ordinale, du plus sévère au plus chaleureux : dur, ferme, neutre, encourageant, célébration. Un modèle logistique ordinal en choisit un selon un score latent :
$$ z = \theta_0 + \theta_P\, p^0_t + \theta_M\,\text{ratés}_t + \theta_i\, i - \theta_B B_t - \theta_F F_t + \theta_S\,\text{succès}_t $$Un risque élevé ou des engagements manqués durcissent le ton ; la lassitude, la fatigue et les succès récents l’adoucissent. Une sécurité interdit le ton dur en reprise ou en surcharge, et le rappel suivant d’une même journée peut monter d’un cran, sans jamais sauter brutalement.
Le ton se choisit sur une échelle ordinale, du plus chaleureux au plus sévère, selon le score latent z. Le risque et les engagements manqués durcissent le ton ; la lassitude, la fatigue et les succès récents l’adoucissent.
Randomiser pour apprendre
C’est la brique qui distingue vraiment ce modèle du précédent. Chaque décision (la dose, les heures, le ton) est tirée au sort avec une probabilité connue, que je logge :
$$ \pi(A_t \mid H_t) = \pi_N(n_t \mid H_t)\cdot \pi_T(\tau_t \mid n_t, H_t)\cdot \pi_C(c_t \mid \tau_t, n_t, H_t) $$En randomisant ses propres décisions et en gardant la propension (propensity score) de chacune, le coach transforme son historique en une expérience randomisée séquentielle, propre à une seule personne (N-of-1). Tant que chaque dose raisonnable garde une probabilité non nulle (une condition de positivité, fixée ici à 0,02 au minimum), je peux estimer l’effet causal propre de la dose, des heures et du ton chez cet utilisateur.
Sur les jours où la dose est tirée au hasard, l’écart entre ce que la personne ferait seule (la propension) et ce qui arrive avec les rappels donne l’effet β. C’est cet écart que la randomisation permet de mesurer.
C’est ce que le modèle de Poisson ne pouvait pas faire. Il planifiait sans randomisation contrôlée, donc il mélangeait sans recours le sport spontané et l’effet des rappels. Ici, si les jours à dose élevée tirée au sort déclenchent plus de séances, le modèle augmente l’effet estimé $\beta$ ; si la personne s’entraîne sans rappel, il augmente sa motivation et réduit la pression future.
Apprendre l’effet des rappels et regarder plus loin dans le temps sont deux réglages indépendants. Le modèle apprend peu (paramètres posés à la main, par choix) et regarde court (24-48 h, par construction) : deux directions perpendiculaires, l’une un choix, l’autre la limite de myopie.
Limites
Ce modèle colle mieux au problème que le processus de Poisson, mais il en reste un modèle, et un modèle simplifie toujours. Ses limites les plus sérieuses tiennent à ce qu’il choisit de représenter, et à ce qu’il laisse dehors.
L’état est une abstraction. Six nombres et des formes d’équations choisies (une vraisemblance logistique, une propension additive $M + H - F$, un bruit gaussien) tiennent lieu d’une personne.
Le modèle résume la personne en six nombres. Ce qui agit en dehors de cette structure, un deuil, une grippe, la météo, reste hors du modèle.
L’objectif est un proxy, un objectif de substitution. Le modèle maximise un nombre, l’utilité : un gain d’habitude estimé, moins le coût des rappels. Ce qui compte vraiment, que la personne tienne dans la durée et s’y retrouve, ne se mesure pas, donc cela n’entre dans aucune équation. C’est la loi de Goodhart : dès qu’une mesure devient une cible, elle cesse d’être une bonne mesure. Le modèle peut servir son nombre à la perfection tout en s’éloignant du vrai but, par exemple en enchaînant des rappels qui déclenchent une séance aujourd’hui, mais lassent au point de faire couper les notifications le mois prochain.
L’utilité que le modèle maximise (la mesure) peut continuer de monter pendant que le vrai but, tenir dans la durée, décroche. C’est la dérive de Goodhart.
L’observation est trop pauvre pour trancher. Une personne fournit quelques signaux grossiers par jour : une séance ou non, une réponse ou non. Beaucoup d’histoires latentes différentes expliquent les mêmes signaux, si bien que la croyance sur six dimensions reste lâche, et parfois confiante à tort. Le cadre N-of-1 aggrave la rareté : chaque personne est modélisée seule, sans rien emprunter au comportement des autres.
Trois histoires latentes différentes (A, B, C) expliquent le même signal observé, donc la croyance reste large. En pointillé, l’étroitesse qu’une observation riche permettrait.
La décision est myope. Chaque jour, le modèle choisit la dose qui maximise l’utilité des 24 à 48 heures qui viennent, et rien au-delà. C’est une politique gloutonne (greedy), assumée : elle met en balance le présent seul, jamais les semaines suivantes, là où l’habitude se construit. Se taire aujourd’hui pour préserver la réceptivité d’une relance la semaine prochaine lui échappe par construction. Le terme POMDP nomme le problème que pose la relance, pas la manière dont ce modèle le tranche.
La décision optimise une fenêtre de 24 à 48 heures (bande bleue), alors que l’habitude se forme sur des semaines (courbe). Le modèle s’appelle POMDP, mais il ne planifie pas sur cet horizon long.
Enfin, l’expérimentation a un prix. Pour isoler l’effet propre d’un rappel, le modèle doit varier ses décisions au hasard, donc accepter d’agir parfois moins bien que sa meilleure estimation. Sur une seule personne, ce prix se paie pour de vrai, sans foule pour le diluer.
Conclusion
Le processus de Poisson répondait à « quand ». Ce modèle répond à « faut-il relancer, et à quelle dose ». Il garde une estimation de l’état de la personne, la corrige chaque jour avec ce qu’elle fait, pèse le bénéfice et le coût de chaque rappel, et tire ses décisions au sort avec une probabilité connue.
C’est ce dernier point qui le sépare vraiment du précédent. Le processus de Poisson simulait un flux de rappels que l’on observe ; ce modèle traite la relance comme une décision que l’on prend, pour une personne dont l’état reste caché. En randomisant ses propres décisions et en gardant leur propension, il se donne le moyen d’estimer leur effet causal chez cette personne. Il décide aujourd’hui, et il est construit pour apprendre de ce qu’il décide.