ICT-28 — Adoption collective et seuil de performativité (expérience C, strate 7)
Compagnon pédagogique du module ict.collective_adoption (#7746, jambe D2 expérience C).
Les expériences A (ICT-26-SignalingConvention-Python) et B (ICT-27-SymbolInvention-Python) modélisent un couple émetteur/récepteur qui apprend à coordonner. Cette expérience C passe à l’échelle multi-agent et pose une question nouvelle : > Une fraction ρ d’agents « instigateurs » pré-engagés vers une convention > novelle suffit-elle à la faire cascader vers la population entière ? > Existe-t-il une fraction critique ρ_c au-dessous de laquelle l’innovation > meurt ?
C’est le seuil de bascule de C4 (#7743, grammaire de propagation), incarné dans la dynamique de masse critique de Damon Centola (2010), Thomas Schelling et Mark Granovetter (1978, threshold models of collective behavior) : une innovation diffuse à fixation ssi elle dépasse une fraction critique de porteurs. Sous ρ_c, les naïfs interagissent surtout entre eux et convergent vers une convention arbitraire ; au-dessus, la pression des instigateurs domine et la cible cascade.
La chaîne A→B→C : A montre comment une convention émerge (individu) ; B comment le vocabulaire s’invente (individu) ; C comment une convention contagionne une population (multi-agent).
Statut épistémique — Fortement soutenu : Une convention devient causale (cascade population) au-delà d’un seuil rho_c d’instigateurs. Portée et détail dans la matrice de dissociations.
Acquis et parenté : expérience C (adoption collective) de la famille A→E (ICT-26 → ICT-30, #7743/#7746, axe transverse D2) — le seuil de performativité agit sur le collectif qui porte la convention de A.
# Setup : import du package ict (via sys.path cwd, cf C973-L) + numpy/matplotlib.import syssys.path.insert(0, ".")import numpy as npimport matplotlib.pyplot as pltfrom ict import collective_adoption as caprint("ict.collective_adoption chargé.")print("API publique :", [n for n indir(ca) ifnot n.startswith("_")])
On balaie la fraction d’instigateurs ρ sur une grille et on mesure le taux d’adoption : la fraction des agents naïfs (non instigateurs) dont la politique dominante a convergé vers la convention cible. La courbe attendue est une sigmoïde :
à bas ρ, l’adoption stagne au niveau du hasard — l’innovation meurt ;
au passage de ρ_c, un saut brutal d’adoption — la cascade s’amorce ;
à haut ρ, l’adoption tend vers 1 — la cible devient universelle.
Le verdict critical_threshold exige trois choses simultanément : adoption quasi-nulle à bas ρ, quasi-totale à haut ρ, et un saut net entre les deux (au moins un pas de ρ où l’adoption gagne plus de 0,25).
Interprétation. La courbe d’adoption en fonction de rho a la signature d’un phénomène de masse critique : quasi-nulle aux faibles fractions d’instigateurs (0.000 à rho=0,05), quasi-totale aux fractions élevées (1.000 à rho=0,95), avec un saut maximal de 0,472 entre deux valeurs consécutes de rho. Ce n’est pas une transition graduelle mais un basculement — exactement la courbe en S d’une percolation ou d’un seuil épidémique.
Le verdict threshold_exists = True ne dit pas seulement « ça monte », il dit que la transition est abrupte : il existe une valeur rho_c en dessous de laquelle la convention novelle ne décolle pas, et au-dessus de laquelle elle devient inévitable. C’est ce seuil qui fait de l’adoption un acte performatif — la convention n’existe comme fait social qu’une fois franchi le point de bascule, pas avant.
Le rho_c (mi-saut le plus raide) tombe a 0.425 : la convention ne triomphe pas parce qu’elle est meilleure, mais parce que suffisamment d’instigateurs la portent.
2. Sous le seuil, la convention meurt
À ρ = 0,1 (peu d’instigateurs), les naïfs interagissent majoritairement entre eux : ils convergent vers des conventions arbitraires (le hasard des rencontres), pas vers la cible. L’adoption de la cible reste au niveau du hasard 1/n (voire en dessous). C’est le verdict below_threshold_dies : sans masse critique, l’innovation n’est pas performative — elle ne fait rien.
# Verdict SOUS LE SEUIL : à rho=0.1, l'adoption reste < 1/n + eps.verdict = ca.below_threshold_dies_test(n_agents=24, n_states=3, n_seeds=4, seed=0)print("Verdict below_threshold_dies : dies =", bool(verdict["dies"]))print(f" adoption @rho=0.1 = {verdict['adoption_at_low_rho']:.3f}")print(f" niveau hasard 1/n = {verdict['chance_level']:.3f}")print(" -> la convention novelle meurt : les naïfs convergent vers des conventions arbitraires.")
Verdict below_threshold_dies : dies = True
adoption @rho=0.1 = 0.011
niveau hasard 1/n = 0.333
-> la convention novelle meurt : les naïfs convergent vers des conventions arbitraires.
Interprétation. Le résultat sous le seuil est contre-intuitif : à rho=0,1, l’adoption de la convention novelle atteint 0,011 — soit trente fois moins que le niveau du hasard 1/n = 0,333. La convention ne fait pas que échouer à se propager, elle meurt activement : les agents naïfs convergent vers des conventions arbitraires (trois états possibles, tirés au sort), si bien que la cible finit sous-représentée par rapport au hasard. dies = True capture exactement cela.
C’est la marque d’un effet de fragmentation : sans assez d’instigateurs pour ancrer la cible, le apprentissage social disperse le consensus plutôt qu’il ne le forme. Le seuil rho_c sépare donc deux régimes qualitativement distincts — fragmentation vs cascade — pas deux intensités d’un même phénomène.
3. Au-dessus du seuil, la cascade
À ρ = 0,8, les instigateurs sont assez nombreux pour que chaque naïf rencontre régulièrement la cible : la pression domine et la cible cascade vers la quasi-totalité de la population. Le verdict above_threshold_cascades confirme que l’adoption dépasse largement le niveau hasard et tend vers 1.
# Verdict AU-DESSUS DU SEUIL : à rho=0.8, l'adoption cascade vers ~1.verdict = ca.above_threshold_cascades_test(n_agents=24, n_states=3, n_seeds=4, seed=0)print("Verdict above_threshold_cascades : cascades =", bool(verdict["cascades"]))print(f" adoption @rho=0.8 = {verdict['adoption_at_high_rho']:.3f}")print(" -> la convention novelle cascade : la cible devient quasi-universelle.")
Verdict above_threshold_cascades : cascades = True
adoption @rho=0.8 = 0.850
-> la convention novelle cascade : la cible devient quasi-universelle.
Lecture 3 — Au-dessus du seuil : la cascade mene a 0.850
Au-dessus du seuil, le verdict above_threshold_cascades confirme : a rho = 0.8, l’adoption finale de la cible atteint 0.850 – la convention cascade jusqu’a devenir quasi-universelle, sans intervention externe additionnelle apres l’initialisation.
Le contraste avec la lecture 2 est la structure du résultat : 0.011 contre 0.850 pour un rho passe de 0.1 a 0.8. La difference n’est pas de degre mais de regime – le meme mecanisme d’imitation qui enterre la cible sous le seuil la generalise au-dessus. C’est exactement la non-linéarité en S – la transition sigmoïde raide autour de rho_c = 0.425 – que la cellule 2 avait mesurée, vue cette fois par le verdict booléen des deux extrémités.
4. Contrôle négatif — pas de cascade sans instigateur
Le contrôle falsifiant : à ρ = 0 (aucun instigateur), la cible n’est jamais introduite dans la population. Si l’adoption restait élevée, cela signifierait que les naïfs convergent spontanément vers cette convention particulière — ce qui ruinerait la thèse (la cascade serait un artefact, pas un effet causal des instigateurs). On observe au contraire une adoption quasi-nulle : la cascade est bien causée par les instigateurs, pas par une convergence spontanée.
# Contrôle négatif : à rho=0 (aucun instigateur), pas de cascade vers la cible.verdict = ca.no_cascade_without_instigators_test(n_agents=24, n_states=3, n_seeds=4, seed=0)print("Contrôle no_cascade_without_instigators : no_cascade =", bool(verdict["no_cascade"]))print(f" adoption @rho=0 = {verdict['adoption_at_rho_zero']:.3f}")print(" -> sans instigateur, la cible n'est jamais introduite : pas de cascade spontanée.")
Contrôle no_cascade_without_instigators : no_cascade = True
adoption @rho=0 = 0.000
-> sans instigateur, la cible n'est jamais introduite : pas de cascade spontanée.
Interprétation. Le contrôle à rho=0 est l’épreuve falsifiante de tout le dispositif. Sans aucun instigateur (rho=0), l’adoption de la cible reste à 0,000 : la convention novelle n’est jamais même introduite dans la population. no_cascade = True confirme qu’il n’y a pas d’émergence spontanée.
Ce contrôle distingue deux hypothèses rivales que la seule observation d’une cascade ne pourrait départager : (a) la convention se propage par apprentissage social à partir des instigateurs, ou (b) elle apparaît par dérive aléatoire sans cause externe. En éliminant (b) — aucun instigateur, zéro adoption — on établit que la cascade observée au §3 provient bien de la performativité des instigateurs, pas d’un artefact statistique.
Le moteur est l’interaction entre masse critique initiale et dynamique d’adoption, pas l’un ou l’autre isole : si l’imitation suffisait a generaliser n’importe quelle convention, la cible percerait aussi a rho = 0.
Synthèse — la performativité comme seuil de masse critique
Verdict
Ce qu’il montre
Contrôle falsifiant
critical_threshold
Il existe un ρ_c : courbe en S, saut brutal d’adoption
bas vs haut ρ + existence d’un saut net
below_threshold_dies
Sous le seuil, l’innovation meurt (adoption ≈ hasard)
niveau 1/n
above_threshold_cascades
Au-dessus du seuil, la cible cascade vers ~1
niveau hasard dépassé largement
no_cascade_without_instigators
Sans instigateur, pas de cascade spontanée
ρ = 0
Leçon de l’expérience C : une convention ne contamine une population que si elle franchit une fraction critique de porteurs. C’est l’homologue multi-agent des couplages individués de A (émergence par renforcement) et B (invention par erreur). Ensemble, les trois expériences relient émergence, invention et contagion — les trois modes par lesquels une convention devient réelle.
5. Exercices
Trois exercices pour rendre le seuil opératoire. Chaque stub s’exécute sans erreur (C.1). Complétez le TODO pour répondre.
# Exercice 1 — Le seuil dépend-il de la taille de la population ?# TODO: pour plusieurs tailles de population (ex. 12, 24, 48), estimer rho_c via# critical_threshold_test et observer si rho_c augmente ou diminue avec N.for N in [12, 24, 48]: v = ca.critical_threshold_test(n_agents=N, n_states=3, n_seeds=2, seed=0)print(f"N={N:3d} -> rho_c ~= {v['rho_c']:.3f} (adoption bas/haut = {v['adoption_at_low_rho']:.2f}/{v['adoption_at_high_rho']:.2f})")
Exercice 2 — La force de l’engagement des instigateurs
Les instigateurs sont « épinglés » avec une force instigator_strength (plus élevée = ils jouent la cible de manière plus déterministe). Une force plus faible rend-elle le seuil plus difficile à franchir ?
# Exercice 2 — stub (compléter)# TODO: balayer instigator_strength et observer l'adoption à rho fixé (ex. 0.5).for strength in [2.0, 5.0, 10.0, 20.0]: rates = []for s inrange(3): g = ca.AdoptionGame(n_agents=24, n_states=3, instigator_fraction=0.5, instigator_strength=strength, rng=np.random.default_rng(s)) g.train(2500, anneal_to=0.15) rates.append(g.adoption_rate())print(f"strength={strength:5.1f} -> adoption @rho=0.5 = {np.mean(rates):.3f}")
Exercice 3 — Information mutuelle de la population
Le module expose population_mi() : l’information mutuelle moyenne I(état ; signal) des agents naïfs. Une cascade réussie doit faire monter cette MI vers log₂(n). Mesurez-la avant et après apprentissage à ρ = 0,8.
# Exercice 3 — stub (compléter)# TODO: mesurer population_mi() avant/après entraînement à rho=0.8, comparer à log2(n).g = ca.AdoptionGame(n_agents=24, n_states=3, instigator_fraction=0.8, rng=np.random.default_rng(0))mi_before = g.population_mi()g.train(2500, anneal_to=0.15)# Re-mesurer la MI sur la politique courante (après apprentissage).for _ inrange(200): g.play_round(reinforce=False)mi_after = g.population_mi()print(f"MI avant apprentissage = {mi_before:.3f}")print(f"MI après apprentissage = {mi_after:.3f} (plafond log2(3) = {np.log2(3):.3f})")
MI avant apprentissage = 0.000
MI après apprentissage = 1.512 (plafond log2(3) = 1.585)