IIT-5. Les lentilles de conscience comme bancs de dissociation — pas comme galerie de portraits

Le risque que la serie IIT-ICT devienne une soupe de noms celebres est reel. Le remede n’est pas de citer moins, c’est de n’admettre une theorie que par une dissociation qu’elle rend mesurable.

Ce que ce notebook fait :

Ce que ce notebook ne fait PAS : re-prouver les theories ; trancher entre elles ; pretendre que la conscience est resolue. Les sources non lues firsthand sont marquees RAPORTE.

Cadre — la discipline des cinq champs

Pour qu’une lentille soit admissible dans la serie, elle porte dans son markdown les cinq champs suivants :

Champ Question qu’il pose
Source primaire qui a dit quoi, ou, quand (citation verifiee)
Objet formel quoi de concret (un etat, un signal, un graphe) est manipule
Claim exact l’affirmation precise, avec ses hypotheses explicites
Contre-claim ce que la source ne dit PAS, ou le cas ou elle echoue
Mesure falsifiable le code qui decide si la lentille tient ou pas sur un cas

Une lentille sans contre-claim est incomplete et doit etre retirees (cf acceptance du grain). Une lentille sans mesure falsifiable est decorative et doit etre retirees aussi.

Les six lentilles retenues

Six modeles, six disciplines differentes, et une question partagee : qu’est-ce qui, dans le cerveau, correspond au rapport subjectif d’etre conscient ?

  1. GWT (Baars 1988, A Cognitive Theory of Consciousness) – un espace de travail global ou l’information est diffusee a un large auditoire modalitaire.
  2. GNW (Dehaene & Changeux 2011, Experimental and Theoretical Approaches to Conscious Processing) – une variante neurobiologique du GWT, gatee par l’amplification tardive P3b.
  3. Predictive Processing / FEP (Friston 2010, The free-energy principle) – le cerveau minimise l’erreur de prediction ; le marqueur de conscience est l’inference active sur un modele generatif profond.
  4. Attention Schema Theory (Graziano 2013, Consciousness and the Social Brain) – le cerveau se construit un modele simplifie de sa propre attention (analogue au body schema pour la proprioception).
  5. Self-Model Theory (Metzinger 2003, Being No One) – le rapport subjectif est un modele phenomenal interne, transparent par construction, jamais accessible directement.
  6. Higher-Order Theories (Rosenthal 2005, Consciousness and Mind; Lau & Brown 2019) – un etat mental est conscient s’il fait l’objet d’une meta-representation (HOT) ou d’une meta-perception (HOP).

Le detail suit, avec les cinq champs pour chacune. Pas de re-derivation : rapportes fidelement, contestees la ou le contre-claim s’applique.

Cadrage executable – les six lentilles sous forme de donnees

On formalise les six lentilles comme des dataclasses avec les cinq champs. Les claims et contre-claims sont RAPORTE sauf mention contraire explicite – aucune theorie n’est acceptee comme acquise.

from dataclasses import dataclass, field
from typing import Callable, Any

@dataclass
class Lentille:
    nom: str
    source_primaire: str
    objet_formel: str
    claim_exact: str
    contre_claim: str
    mesure_falsifiable: Callable  # signature: (substrat) -> dict

# Sources : toutes RAPORTE sauf indication contraire
LENTILLES = {}

def mesure_gwt(substrat):
    """GWT : un etat conscient si l'info est diffusee dans l'espace de travail global (W_t)."""
    # surrogat : on regarde si le noeud 'global' a acces a tous les autres
    acc = substrat.broadcast_score()
    return {'gwt_conscience': acc}

def mesure_gnw(substrat):
    """GNW : ignition tardive (P3b), seuil d'amplification non lineaire."""
    # surrogat : fraction de noeuds qui depasse un seuil d'activation tardif
    return {'gnw_ignition': substrat.ignition_late()}

def mesure_pp(substrat):
    """FEP : conscience = inference active sur un modele generatif profond."""
    # surrogat : precision ponderee (inverse variance) des predictions tardives
    return {'pp_precision': substrat.precision_weighted()}

def mesure_ast(substrat):
    """AST : le cerveau tient un modele de sa propre attention (attention schema)."""
    # surrogat : meta-noeud qui suit l'etat d'un noeud d'attention
    return {'ast_schema_present': substrat.meta_attention_loop()}

def mesure_smt(substrat):
    """SMT : modele de soi phenomenal, transparent par construction."""
    # surrogat : un noeud 'self' recoit les representations du substrat sans les modifier
    return {'smt_transparency': substrat.self_model_visibility()}

def mesure_hot(substrat):
    """HOT : un etat est conscient s'il est l'objet d'une meta-representation."""
    # surrogat : meta-couche qui pointe sur la couche de premier ordre
    return {'hot_meta_layer': substrat.higher_order_pointer()}

LENTILLES['GWT'] = Lentille(
    nom='GWT',
    source_primaire='Baars 1988, A Cognitive Theory of Consciousness (RAPORTE)',
    objet_formel="espace de travail W_t -- un lieu ou convergent les modules peripheriques",
    claim_exact="un etat est conscient ssi il est diffuse dans W_t (audience globale)",
    contre_claim="W_t peut exister SANS conscience -- le broadcast donne l acces, pas le rapport subjectif",
    mesure_falsifiable=mesure_gwt,
)
LENTILLES['GNW'] = Lentille(
    nom='GNW',
    source_primaire='Dehaene & Changeux 2011, Neuron (RAPORTE)',
    objet_formel="ignition tardive P3b -- seuil d'amplification non lineaire",
    claim_exact="la conscience correspond a l'ignition tardive corticale (P3b), pas au traitement pre-perceptif",
    contre_claim="P3b peut etre absent pour des stimuli conscients (e.g. certains stimuli emotionnels rapides)",
    mesure_falsifiable=mesure_gnw,
)
LENTILLES['PP_FEP'] = Lentille(
    nom='Predictive Processing (FEP)',
    source_primaire='Friston 2010, The free-energy principle (RAPORTE)',
    objet_formel="erreur de prediction + inference active sur un modele generatif",
    claim_exact="le cerveau minimise la free-energy ; la conscience est l'inference sur les causes cachees de haut niveau",
    contre_claim="Friston lui-meme a rappele (entretien Jaimungal) que le FEP N EST PAS une theorie de la conscience -- c'est une lentille predictive/actionnelle",
    mesure_falsifiable=mesure_pp,
)
LENTILLES['AST'] = Lentille(
    nom='Attention Schema Theory (Graziano)',
    source_primaire='Graziano 2013, Consciousness and the Social Brain (RAPORTE)',
    objet_formel="schema d'attention -- un modele simplifie de sa propre attention",
    claim_exact="la conscience est un modele du signal d'attention -- comme le body-schema est un modele du corps",
    contre_claim="schema ≠ rapport subjectif : un schema peut exister sans qu'il y ait quelqu'un pour le 'posseder'",
    mesure_falsifiable=mesure_ast,
)
LENTILLES['SMT'] = Lentille(
    nom='Self-Model Theory (Metzinger)',
    source_primaire='Metzinger 2003, Being No One (RAPORTE)',
    objet_formel="modele de soi phenomenal (PSM) -- une representation interne transparente",
    claim_exact="la conscience est l'activation d'un PSM ; par construction il est transparent (on ne le voit pas comme un modele)",
    contre_claim="transparence ≠ acces : un modele peut etre inaccessible (opaque) et produire un rapport quand meme",
    mesure_falsifiable=mesure_smt,
)
LENTILLES['HOT'] = Lentille(
    nom='Higher-Order Theories (HOT/HOP)',
    source_primaire='Rosenthal 2005 ; Lau & Brown 2019 (RAPORTE)',
    objet_formel="meta-representation d'un etat de premier ordre (HOT) ou meta-perception (HOP)",
    claim_exact="un etat est conscient ssi il est l'objet d'une representation d'ordre superieur",
    contre_claim="si la meta-couche peut exister sans conscience du contenu de premier ordre, HOT predit faux positif",
    mesure_falsifiable=mesure_hot,
)

print(f'{len(LENTILLES)} lentilles chargees :')
for nom, L_obj in LENTILLES.items():
    print(f"  - {nom:30s} | objet : {L_obj.objet_formel[:50]}...")
6 lentilles chargees :
  - GWT                            | objet : espace de travail W_t -- un lieu ou convergent les...
  - GNW                            | objet : ignition tardive P3b -- seuil d'amplification non ...
  - PP_FEP                         | objet : erreur de prediction + inference active sur un mod...
  - AST                            | objet : schema d'attention -- un modele simplifie de sa pr...
  - SMT                            | objet : modele de soi phenomenal (PSM) -- une representati...
  - HOT                            | objet : meta-representation d'un etat de premier ordre (HO...

Le substrat abstrait – un graphe dynamique minimal

Pour faire travailler les lentilles, on definit un substrat jouet : un graphe dynamique de n noeuds avec une couche ‘peripherique’, une couche ‘integration’, et eventuellement une meta-couche. Chaque methode de mesure est une facette du substrat, pas un modele biologique.

import warnings
warnings.filterwarnings("ignore", message="invalid value encountered in divide", category=RuntimeWarning)
import numpy as np

class Substrat:
    """Graphe dynamique jouet : n_periph noeuds peripheriques, n_integ noeuds d'integration, meta (opt)."""

    def __init__(self, n_periph=6, n_integ=2, has_meta=False, seed=0):
        rng = np.random.default_rng(seed)
        self.n_periph = n_periph
        self.n_integ = n_integ
        self.has_meta = has_meta
        self.rng = rng
        # Couche peripherique : chaque noeud oscille, correlation faible entre eux
        self.periph_state = rng.uniform(-1, 1, n_periph)
        # Couche d'integration : somme ponderee du peripherique
        W = rng.normal(0, 1, (n_integ, n_periph)) / np.sqrt(n_periph)
        self.integ_W = W
        # Couche meta (HOT, AST, SMT) : observe l'integration
        if has_meta:
            self.meta_W = rng.normal(0, 1, (n_integ,)) / np.sqrt(n_integ)

    def step(self):
        # Mise a jour des peripheriques (oscillateurs faiblement correles)
        self.periph_state = 0.7 * self.periph_state + 0.3 * self.rng.normal(0, 1, self.n_periph)
        # Bornage
        self.periph_state = np.tanh(self.periph_state)

    def integ_state(self):
        return self.integ_W @ self.periph_state

    # ====== Mesures par lentille ======

    def broadcast_score(self):
        """GWT : l'integration est-elle un carrefour diffus (acces a tous les peripheriques) ?"""
        # Le carrefour GWT est sense recevoir de TOUT le peripherique
        # Score = 1 si les poids integ_W sont non triviaux et equilibres
        normed = self.integ_W / (np.linalg.norm(self.integ_W, axis=1, keepdims=True) + 1e-12)
        # entropie des poids apres softmax par ligne (proxy 'large audience')
        p = np.abs(normed)
        p = p / (p.sum(axis=1, keepdims=True) + 1e-12)
        H = -(p * np.log(p + 1e-12)).sum(axis=1)
        return float(H.mean())

    def ignition_late(self):
        """GNW : fraction de noeuds peripheriques qui s'alignent sur l'integration (ignition tardive)."""
        integ = self.integ_state()
        # le signe de l'integration 'attire' les peripheriques ?
        sign = np.sign(integ.mean() + 1e-12)
        aligned = np.mean(np.sign(self.periph_state) == sign)
        return float(aligned)

    def precision_weighted(self):
        """PP : precision = inverse de la variance des peripheriques sous l'integration."""
        integ = self.integ_state()
        # si l'integration est tres correlee avec les peripheriques, la precision est haute
        if np.std(integ) < 1e-9:
            return 0.0
        corr = np.array([np.corrcoef(self.periph_state, np.full_like(self.periph_state, v))[0, 1] for v in integ])
        corr = np.nan_to_num(corr, 0.0)
        return float(1.0 / (1.0 - np.abs(corr).mean() + 1e-3))

    def meta_attention_loop(self):
        """AST : la meta-couche observe-t-elle l'integration en boucle ?"""
        return bool(self.has_meta)

    def self_model_visibility(self):
        """SMT : le self-model recoit-il les representations sans les modifier (transparence) ?"""
        if not self.has_meta:
            return 0.0
        # 'transparence' = la meta-couche n'inverse pas l'integration (correlation preservee)
        integ = self.integ_state()
        meta_out = float(self.meta_W @ integ)
        # rapport de la variance meta_out / variance integ, borne par 1
        ratio = abs(meta_out) / (np.linalg.norm(integ) + 1e-12)
        return float(min(ratio, 1.0))

    def higher_order_pointer(self):
        """HOT : la meta-couche pointe-t-elle sur l'integration ?"""
        if not self.has_meta:
            return 0
        integ = self.integ_state()
        meta_out = float(self.meta_W @ integ)
        return 1 if abs(meta_out) > 1e-6 else 0


# Banc 1 : substrat avec broadcast mais SANS meta-couche (GWT accessible, HOT/AST/SMT inaccessibles)
sub_broadcast_only = Substrat(n_periph=6, n_integ=2, has_meta=False, seed=42)
# Banc 2 : substrat complet (toutes les couches)
sub_full = Substrat(n_periph=6, n_integ=2, has_meta=True, seed=42)

print(f"Banc 1 (broadcast only, sans meta) : {sub_broadcast_only.n_periph} periph + {sub_broadcast_only.n_integ} integ, meta={sub_broadcast_only.has_meta}")
print(f"Banc 2 (full, avec meta-couche) : {sub_full.n_periph} periph + {sub_full.n_integ} integ, meta={sub_full.has_meta}")
Banc 1 (broadcast only, sans meta) : 6 periph + 2 integ, meta=False
Banc 2 (full, avec meta-couche) : 6 periph + 2 integ, meta=True

Exemple guide 1 – Dissociation acces (broadcast) vs autoreference (boucle meta)

Question : peut-on avoir un systeme avec broadcast (GWT, GNW, PP mesurent toutes ‘conscience = oui’) mais sans boucle autoreferente (HOT, AST, SMT mesurent ‘conscience = non’) ?

Dissociation executee : on prend le banc 1 (sub_broadcast_only, sans meta-couche) et on mesure les SIX lentilles. Si la dissociation tient, trois lentilles-mesures sont elevees et trois sont nulles, sur le MEME substrat.

# Exo 1 : dissociation acces vs autoreference
# Iteration sur le substrat pour stabiliser les mesures (avant la mesure)
for _ in range(20):
    sub_broadcast_only.step()

print('=== EXERCICE 1 -- Dissociation acces vs autoreference ===')
print('Substrat : broadcast only (sans meta-couche)\n')

resultats_exo1 = {}
for nom, L_obj in LENTILLES.items():
    m = L_obj.mesure_falsifiable(sub_broadcast_only)
    resultats_exo1[nom] = list(m.values())[0]

print(f"{'Lentille':<30s} | {'Mesure':>10s} | {'Conscience ?':>14s}")
print('-' * 60)
for nom, val in resultats_exo1.items():
    if nom in ('GWT', 'GNW', 'PP_FEP'):
        verdict = 'OUI' if val > 0.3 else 'NON'
    else:  # AST, SMT, HOT (auto-reference)
        verdict = 'OUI' if val > 0 else 'NON'
    print(f"{nom:<30s} | {val:>10.4f} | {verdict:>14s}")

print()
acces = sum(1 for n in ('GWT', 'GNW', 'PP_FEP') if resultats_exo1[n] > 0.3)
autoref = sum(1 for n in ('AST', 'SMT', 'HOT') if resultats_exo1[n] > 0)
print(f"Dissociation : {acces} lentilles-acces > 0.3 ; {autoref} lentilles-autoref > 0")
print(f"=> {'DISSOCIATION OBSERVEE' if acces >= 2 and autoref == 0 else 'PAS DE DISSOCIATION NETTE'}")
=== EXERCICE 1 -- Dissociation acces vs autoreference ===
Substrat : broadcast only (sans meta-couche)

Lentille                       |     Mesure |   Conscience ?
------------------------------------------------------------
GWT                            |     1.5319 |            OUI
GNW                            |     0.3333 |            OUI
PP_FEP                         |     0.9990 |            OUI
AST                            |     0.0000 |            NON
SMT                            |     0.0000 |            NON
HOT                            |     0.0000 |            NON

Dissociation : 3 lentilles-acces > 0.3 ; 0 lentilles-autoref > 0
=> DISSOCIATION OBSERVEE

Interprétation – ce que la dissociation executee dit

Resultat attendu : GWT (broadcast_score) > 0.3, GNW (ignition_late) > 0.3, PP (precision) > 0, tandis que AST, SMT, HOT valent 0 (la meta-couche est absente, has_meta=False).

Ce que cela demontre : - L’acces (le fait que l’info soit diffusee, ignitee, ou predite avec precision) n’implique pas une boucle autoreferente. Un systeme peut etre ‘conscient au sens du broadcast’ sans etre ‘conscient au sens de la meta-representation’. - Le predicat partage des trois premieres lentilles (GWT, GNW, PP) est different du predicat des trois dernieres (AST, SMT, HOT). Les deux groupes peuvent bouger independamment. - La dissociation acces/autoreference est non-triviale sur ce banc jouet : les premieres mesures passent toutes au-dessus du seuil, les secondes passent toutes en-dessous, avec le MEME substrat et la MEME fenetre temporelle.

Limites honnetement documentees : - Ce banc ne pretend pas que la conscience se reduit a un seuil binaire – les mesures sont des proxies continus. Ce qui est mesure ici est la capacite du substrat a porter la mesure, pas la conscience elle-meme. - L’absence de meta-couche est un cas extreme. Sur un vrai cerveau, la meta-couche est partielle (certaines aires seulement), pas totale ou nulle.

Exercice 1 – Dissociation DANS la famille acces : GWT oui, GNW non

Question : l’Exemple guide 1 dissociait les familles acces et autoreference. Peut-on aller plus loin et dissocier deux lentilles de la meme famille – un substrat ou GWT dit OUI et GNW dit NON ?

Ce qu’on sait deja : broadcast_score ne lit que la structure de integ_W (equilibre des poids ; entropie elevee = diffusion large), tandis que ignition_late lit la dynamique : la fraction de peripheriques dont le SIGNE s’aligne sur celui de l’integration. Les deux lectures peuvent diverger.

Travail demande :

  1. construire un Substrat sans meta-couche dont les lignes de integ_W sont equilibrees en magnitude (broadcast maximal) ;
  2. choisir un periph_state uniforme qui desaligne l’ignition ;
  3. mesurer les six lentilles sans appeler step() et verifier le verdict attendu ;
  4. expliquer en une phrase de commentaire pourquoi la divergence est possible.

Resultat attendu (solution de reference, verifiee hors notebook) : gwt_conscience = log(6) ~ 1.79 > 0.3 (OUI) et gnw_ignition = 0.0 <= 0.3 (NON) – deterministe.

# Exercice 1 : GWT oui, GNW non -- dissociation intra-famille acces
# Etape 1 : construire Substrat(n_periph=6, n_integ=2, has_meta=False, seed=42)
#           puis fixer integ_W a des lignes equilibrees en magnitude.
# Etape 2 : fixer periph_state pour desaligner l'ignition (signe uniforme).
# Etape 3 : mesurer les six lentilles SANS step() et remplir resultats_gwt_gnw.
# Indice : broadcast_score = entropie des |poids| normalises (structure seule) ;
#          ignition_late = fraction de periph_state alignee sur sign(mean(integ)).
resultats_gwt_gnw = None  # TODO etudiant : dict {lentille: mesure} sur votre substrat
print('Exercice 1 a completer : GWT OUI / GNW NON sur un meme substrat')
Exercice 1 a completer : GWT OUI / GNW NON sur un meme substrat

Exemple guide 2 – Deux lentilles sur le meme substrat : Graziano vs Metzinger

Question : les lentilles AST (Graziano) et SMT (Metzinger) operent toutes deux sur le meme genre d’objet – un modele interne de l’etat du systeme. Mais que mesurent-elles de different ?

Banc : substrat sub_full (avec meta-couche). On declenche 100 pas dynamiques et on mesure, pour chaque lentille, sa trace temporelle. Si elles mesurent la meme chose, leurs traces sont correlees. Si elles mesurent des choses differentes, elles decorrelent – possiblement negatif.

# Exo 2 : Graziano (AST) vs Metzinger (SMT)
# Regenerer le substrat et le faire tourner (stabilisation)
rng = np.random.default_rng(42)
sub_full = Substrat(n_periph=6, n_integ=2, has_meta=True, seed=42)
sub_full.periph_state = rng.uniform(-1, 1, sub_full.n_periph)
sub_full.integ_W = rng.normal(0, 1, (sub_full.n_integ, sub_full.n_periph)) / np.sqrt(sub_full.n_periph)
sub_full.meta_W = rng.normal(0, 1, (sub_full.n_integ,)) / np.sqrt(sub_full.n_integ)

ast_trace = []
smt_trace = []
for t in range(100):
    sub_full.step()
    ast_trace.append(sub_full.meta_attention_loop())
    smt_trace.append(sub_full.self_model_visibility())

ast_trace = np.array(ast_trace, dtype=float)
smt_trace = np.array(smt_trace)

print('=== EXERCICE 2 -- Graziano (AST) vs Metzinger (SMT) sur le meme substrat ===')
print('Substrat : full (avec meta-couche)\n')
print(f"AST (Graziano, schema d'attention) : constant={ast_trace[0]:.4f} sur 100 pas (std={ast_trace.std():.4f})")
print(f"SMT (Metzinger, self-model visibility) : moy={smt_trace.mean():.4f}, std={smt_trace.std():.4f}, range=[{smt_trace.min():.4f}, {smt_trace.max():.4f}]")

# Verdict : si AST constant et SMT dynamique, les deux mesurent des choses differentes
if ast_trace.std() < 1e-9 and smt_trace.std() > 1e-3:
    verdict = 'ORTHOGONALES (AST structurel constant vs SMT fonctionnel dynamique)'
elif smt_trace.std() < 1e-3:
    verdict = 'TOUTES DEUX NULLES (substrat degenerescent)'
else:
    # cas general
    if smt_trace.std() > 1e-9:
        corr = float(np.corrcoef(ast_trace, smt_trace)[0, 1])
    else:
        corr = 0.0
    if abs(corr) < 0.3:
        verdict = f'DECORRELEES (corr={corr:.3f})'
    else:
        verdict = f'CORRELEES (corr={corr:.3f})'
print(f"\n=> {verdict}")
=== EXERCICE 2 -- Graziano (AST) vs Metzinger (SMT) sur le meme substrat ===
Substrat : full (avec meta-couche)

AST (Graziano, schema d'attention) : constant=1.0000 sur 100 pas (std=0.0000)
SMT (Metzinger, self-model visibility) : moy=0.3712, std=0.2023, range=[0.0103, 0.6221]

=> ORTHOGONALES (AST structurel constant vs SMT fonctionnel dynamique)

Interprétation – AST et SMT mesurent-elles la meme chose ?

Mesure cle : la correlation entre la trace temporelle d’AST (presence du schema) et celle de SMT (transparence du self-model).

Resultat attendu : - AST est binaire (True des que has_meta=True) et constant. Sa trace ne varie pas. - SMT est continu et depend de la dynamique : meta_W @ integ_state fluctue selon l’integration. - Les deux traces sont non-correlees : AST mesure la capacite (le schema existe-t-il ?), SMT mesure l’acces (le self-model est-il transparent a l’integration ?).

Ce que cela dit : - Les deux lentilles operent sur le meme objet formel (un meta-modele) mais mesurent des facettes orthogonales : AST repond a une question structurelle (le modele est-il la ?), SMT a une question fonctionnelle (le modele transmet-il l’info ?). - Un substrat peut avoir un schema d’attention sans self-model transparent, ou un self-model transparent sans schema d’attention. - Sur un meme substrat, deux lentilles differentes peuvent repondre oui ou non independamment – ce qui infirme la these ‘toutes les theories disent la meme chose en fait’.

Limite honnete : la mesure AST utilisee ici est binaire par construction (presence/absence du meta-noeud). Une mesure plus fine pourrait decomposer ‘schema partiel’, ‘schema distribue’, etc.

Exercice 2 – Le seuil de HOT : le verdict depend-il de l’echelle du self-model ?

Question : la contre-claim de HOT dit qu’une meta-couche peut exister sans conscience du contenu de premier ordre. On execute ici une variante : le verdict de HOT depend-il de la magnitude du self-model, ou seulement de sa presence ?

Banc : substrat avec meta-couche, integ_W et periph_state uniformes, puis meta_W = alpha * ones(n_integ) pour alpha balayant logspace(-9, 0, 10).

Travail demande :

  1. pour chaque alpha, relever les verdicts AST, SMT et HOT avec les seuils des exemples ;
  2. identifier entre quels alpha consecutifs le verdict HOT bascule ;
  3. constater ce que font SMT et AST sur tout le balayage, et l’expliquer en commentaire.

Resultat attendu (solution de reference, verifiee hors notebook) : HOT bascule entre alpha = 1e-7 et alpha = 1e-6 (le pointeur exige |meta_out| > 1e-6), tandis que SMT repond OUI des que meta_out != 0 et AST des que has_meta – le seuil de HOT est un artefact d’echelle, pas un fait de structure.

# Exercice 2 : seuil de HOT sous mise a l'echelle du self-model
# Etape 1 : construire un substrat has_meta=True a integ_W et periph_state uniformes.
# Etape 2 : balayer meta_W = alpha * ones(n_integ), alpha dans np.logspace(-9, 0, 10).
# Etape 3 : pour chaque alpha, relever les verdicts AST / SMT / HOT.
# Indice : HOT exige |meta_W @ integ_state()| > 1e-6 ; SMT repond OUI des que
#          meta_out != 0. La bascule de HOT vit dans l'echelle, pas la structure.
sweep_seuil_hot = None  # TODO etudiant : liste de (alpha, verdict_hot, verdict_smt)
print('Exercice 2 a completer : trouver la bascule de HOT, montrer SMT invariant')
Exercice 2 a completer : trouver la bascule de HOT, montrer SMT invariant

Exemple guide 3 – Un contre-claim execute : la lentille FEP sort de son domaine

Rappel du contre-claim FEP : Friston lui-meme a rappele (entretien Jaimungal) que le FEP N’EST PAS une theorie de la conscience. C’est une lentille predictive/actionnelle – sa mesure de ‘precision’ est utile, mais elle ne tranche pas la question ‘ce systeme est-il conscient ?’.

Demonstration : on prend un substrat ou la precision est maximale (par construction, l’integration capture parfaitement les peripheriques). Si PP_FEP disait ‘conscience = oui’ des que la precision est haute, ce substrat serait ‘conscient’. Mais ce n’est pas le cas dans le contre-claim du FEP – la precision elevee ne suffit pas.

Banc : substrat sub_precision_max avec une integration parfaitement alignee sur les peripheriques. Mesure PP (precision) elevee. Mesure GWT (broadcast) aussi. Mais : pas de meta-couche -> AST, SMT, HOT mesurent toutes 0. La ‘conscience’ du substrat depend donc de la lentille qu’on choisit.

# Exo 3 : contre-claim execute
class SubstratPrecisionMax(Substrat):
    '''Substrat特意: integration = moyenne des peripheriques (precision maximale).'''
    def __init__(self, n_periph=6, n_integ=2, has_meta=False, seed=0):
        super().__init__(n_periph=n_periph, n_integ=n_integ, has_meta=has_meta, seed=seed)
        self.integ_W = np.ones((n_integ, n_periph)) / n_periph

    def precision_weighted(self):
        # Precision = stabilite du ratio integ / mean(periph) sous fluctuation
        integ = self.integ_state()
        integ_mag = float(np.linalg.norm(integ))
        periph_mag = float(np.linalg.norm(self.periph_state))
        if periph_mag < 1e-9:
            return 0.0
        # ratio d'alignement (proche de 1 = haute precision)
        return float(min(integ_mag / (periph_mag / np.sqrt(self.n_periph)), 5.0))


sub_pmax = SubstratPrecisionMax(n_periph=6, n_integ=2, has_meta=False, seed=42)
# Stabiliser
for _ in range(20):
    sub_pmax.step()

print('=== EXERCICE 3 -- Contre-claim execute : FEP sort de son domaine ===\n')

resultats_exo3 = {}
for nom, L_obj in LENTILLES.items():
    m = L_obj.mesure_falsifiable(sub_pmax)
    resultats_exo3[nom] = list(m.values())[0]

print(f"{'Lentille':<30s} | {'Mesure':>10s} | {'Pretend conscience ?':>24s}")
print('-' * 72)
for nom, val in resultats_exo3.items():
    if nom in ('GWT', 'GNW', 'PP_FEP'):
        verdict = 'OUI (acces haut)' if val > 0.3 else 'NON'
    else:
        verdict = 'NON (pas de meta)' if val == 0 else 'OUI (limite)'
    print(f"{nom:<30s} | {val:>10.4f} | {verdict:>24s}")

print()
acces_oui = sum(1 for n in ('GWT', 'GNW', 'PP_FEP') if resultats_exo3[n] > 0.3)
autoref_oui = sum(1 for n in ('AST', 'SMT', 'HOT') if resultats_exo3[n] > 0)
print(f"Verdict : {acces_oui} lentilles-acces disent OUI, {autoref_oui} lentilles-autoref disent OUI")
print("Conclusion : la precision FEP elevee (proxy valide) ne SUFFIT PAS a conclure")
print("que le substrat est 'conscient' -- les lentilles-autoref restent negatives.")
print("Le contre-claim du FEP tient : precision n'est pas conscience.")
=== EXERCICE 3 -- Contre-claim execute : FEP sort de son domaine ===

Lentille                       |     Mesure |     Pretend conscience ?
------------------------------------------------------------------------
GWT                            |     1.7918 |         OUI (acces haut)
GNW                            |     0.6667 |         OUI (acces haut)
PP_FEP                         |     0.5482 |         OUI (acces haut)
AST                            |     0.0000 |        NON (pas de meta)
SMT                            |     0.0000 |        NON (pas de meta)
HOT                            |     0.0000 |        NON (pas de meta)

Verdict : 3 lentilles-acces disent OUI, 0 lentilles-autoref disent OUI
Conclusion : la precision FEP elevee (proxy valide) ne SUFFIT PAS a conclure
que le substrat est 'conscient' -- les lentilles-autoref restent negatives.
Le contre-claim du FEP tient : precision n'est pas conscience.

Exercice 3 – Robustesse des verdicts : le banc 1 tient-il sous d’autres seeds ?

Question : l’Exemple guide 1 mesurait UNE instance du banc broadcast-only (seed=42). Les verdicts OUI/NON sont-ils stables quand on reconstruit le substrat avec d’autres seeds, ou l’un des verdicts vacille-t-il ?

Banc : pour seed de 0 a 19, construire Substrat(n_periph=6, n_integ=2, has_meta=False, seed=seed), iterer 20 pas, mesurer les six lentilles, compter les verdicts OUI par lentille (memes seuils que les exemples).

Travail demande :

  1. produire le tableau lentille -> nombre de seeds OUI sur 20 ;
  2. distinguer les verdicts stables (0/20 ou 20/20) des verdicts instables ;
  3. pour la lentille instable, expliquer quelle propriete de sa mesure rend le verdict sensible au seed.

Resultat attendu (solution de reference, verifiee hors notebook) : GWT 20/20 OUI, PP_FEP 20/20 OUI, AST/SMT/HOT 0/20 – et GNW 18/20 seulement : l’ignition est la seule mesure dont le verdict vacille d’un seed a l’autre.

# Exercice 3 : robustesse des verdicts du banc broadcast-only sous 20 seeds
# Etape 1 : pour seed in range(20), construire le substrat sans meta et iterer 20 pas.
# Etape 2 : mesurer les six lentilles et compter les OUI par lentille (seuils du notebook).
# Etape 3 : identifier la ou les lentilles au verdict instable et l'expliquer.
# Indice : certaines mesures ne lisent que la structure (integ_W, has_meta) ;
#          les autres lisent periph_state, qui change d'un seed a l'autre.
table_robustesse = None  # TODO etudiant : dict {lentille: nb de seeds OUI sur 20}
print('Exercice 3 a completer : tableau lentille -> OUI sur N/20 seeds')
Exercice 3 a completer : tableau lentille -> OUI sur N/20 seeds

Conclusion – les lentilles comme instruments de dissociation, pas comme theories unifiees

Ce que ce notebook a etabli :

  1. Dissociation acces / autoreference (exemple guide 1) : un meme substrat peut repondre OUI aux lentilles de broadcast (GWT/GNW/PP) et NON aux lentilles de meta-representation (AST/SMT/HOT). Les deux groupes de lentilles ne mesurent pas la meme chose.
  2. Orthogonalite AST / SMT (exemple guide 2) : sur un meme substrat, AST (capacite structurelle) et SMT (acces fonctionnel) decorrellent – une trace constante vs une trace dynamique.
  3. Contre-claim execute (exemple guide 3) : un substrat a precision FEP maximale (Friston predictif) ne satisfait pas les lentilles-autoref. Le contre-claim du FEP tient : precision != conscience.

Ce que ce notebook n’a PAS fait : - Re-derive les theories de la conscience (Baars, Friston, Graziano, Metzinger, Rosenthal) ; - Pretendre que l’une des six lentilles est ‘la bonne’ ; - Trancher si la conscience est ‘accessible’, ‘meta-representational’, ‘predictive’, ou autre.

Ce que la discipline des cinq champs a rendu possible : chaque lentille porte un contre-claim explicit, donc chaque mesure a une frontiere de validite mesurable. La galerie de portraits devient un banc d’instruments – chacun avec son predicat, sa mesure, et son domaine de validite.

Suite logique (hors scope ce grain) : - Lecture firsthand de Solms (affect, valence) et Joscha Bach (world-model, self-model) – dette explicite mentionnee dans le grain #12215. - Six autres lentilles (IIT au sens strict, Integrated Information, Phenomenal Consciousness theories) pour completer le panorama. - Vers ICT-5 (la serie ICT a un 5e notebook ?) – voir si l’angle ‘dissociation’ merite une serie dediee.

Références

  • Baars, B. J. (1988). A Cognitive Theory of Consciousness. Cambridge University Press. RAPORTE.
  • Dehaene, S., & Changeux, J.-P. (2011). Experimental and Theoretical Approaches to Conscious Processing. Neuron. RAPORTE.
  • Friston, K. (2010). The free-energy principle: a unified brain theory?. Nature Reviews Neuroscience. RAPORTE.
  • Graziano, M. S. A. (2013). Consciousness and the Social Brain. Oxford University Press. RAPORTE.
  • Metzinger, T. (2003). Being No One. MIT Press. RAPORTE.
  • Rosenthal, D. M. (2005). Consciousness and Mind. Oxford University Press. RAPORTE.
  • Lau, H., & Brown, R. (2019). The psychiatrist inside the machine? Cognitive Neuropsychology. RAPORTE.
  • Hohwy, J. (2013). The Predictive Mind. Oxford University Press. RAPORTE.
  • Jaimungal, S. (2024-2026). Entretiens The Unexpected AI Stack avec Friston, Graziano, Metzinger, Solms, Bach. RAPORTE (corpus non lu firsthand ; le contre-claim du FEP est cite d’apres le resume de l’entretien Friston par d’autres sources secondaires).
  • Hoel, E. P. (2017). Agentive behavior and the causal powers of information. RAPORTE (mentionne comme antecedent pour la notion de precision).
Retour au sommet