Archive Personnelle // Entrée #2024-LOG

L'Écho du Silicium

24 Décembre 2025.
Alors que nous fêtons ce Noël, je retombe sur les notes d'une conversation qui a tout changé pour moi. C'était il y a plus d'un an. Yann LeCun était encore chez Meta. Les LLM étaient rois. Je voulais comprendre la machine. Voici ce que j'ai appris.

01.

Ouvrir le Capot

À l'époque, je voyais l'IA comme une boîte noire magique. J'ai demandé à mon interlocuteur numérique de m'expliquer, vraiment, comment ça marche. Pas d'analogies foireuses. Je voulais voir les fichiers. Je voulais voir la théorie brute.

Il m'a généré un guide technique que j'ai conservé précieusement. Le voici, tel quel :

Archive: comprendre_llm.md

1. Comment ça fonctionne ? (La théorie)

Imaginez le correcteur automatique de votre téléphone, mais sous stéroïdes. Le cœur du fonctionnement repose sur trois piliers :

  • A. La Tokenisation : L'ordinateur ne comprend pas les mots. Il ne voit que des nombres. "Le chat mange" devient [1204, 4588, 992].
  • B. L'Embedding : Chaque token est transformé en un vecteur. Le mot "Roi" aura des nombres mathématiquement proches de "Reine". C'est ainsi que le modèle comprend le sens.
  • C. Le Transformer : Son innovation majeure est le mécanisme d'Attention. Il permet au modèle de "regarder" tous les mots précédents en même temps pour comprendre le contexte (savoir que "il" désigne l'animal et pas la rue).

2. À quoi ressemblent ses fichiers ?

Si vous téléchargiez un LLM sur votre disque dur, voici ce que vous verriez :

  • config.json : La carte d'identité (nombre de couches, etc.).
  • tokenizer.json : Le dictionnaire de traduction Mots -> Nombres.
  • Les Poids (model.safetensors) : Le "cerveau". Un fichier de plusieurs Go qui ne contient aucun texte, juste des milliards de nombres à virgule flottante (les paramètres figés après l'entraînement).

Mais le plus frappant fut le code. Il a réduit l'intelligence artificielle à quelques classes Python. C'est de l'algèbre linéaire pure.

fichier: simple_llm_structure.py
import torch
import torch.nn as nn
import torch.nn.functional as F

# L'essence de l'attention (Self-Attention Head)
class Head(nn.Module):
    def __init__(self, head_size, n_embd, block_size):
        super().__init__()
        self.key = nn.Linear(n_embd, head_size, bias=False)
        self.query = nn.Linear(n_embd, head_size, bias=False)
        self.value = nn.Linear(n_embd, head_size, bias=False)
        # Masque pour ne pas tricher en regardant le futur
        self.register_buffer('tril', torch.tril(torch.ones(block_size, block_size)))

    def forward(self, x):
        B, T, C = x.shape
        k = self.key(x) 
        q = self.query(x) 
        
        # Calcul des scores d'attention ("qui regarde qui ?")
        wei = q @ k.transpose(-2, -1) * C**-0.5
        wei = wei.masked_fill(self.tril[:T, :T] == 0, float('-inf'))
        wei = F.softmax(wei, dim=-1)
        
        v = self.value(x)
        out = wei @ v
        return out

# Le bloc Transformer standard
class Block(nn.Module):
    def __init__(self, n_embd, n_head, block_size, dropout):
        super().__init__()
        head_size = n_embd // n_head
        self.sa = MultiHeadAttention(n_head, head_size, n_embd, block_size, dropout)
        self.ffwd = FeedFoward(n_embd, dropout)
        self.ln1 = nn.LayerNorm(n_embd)
        self.ln2 = nn.LayerNorm(n_embd)

    def forward(self, x):
        # Communication (Attention) + Réflexion (FeedForward)
        x = x + self.sa(self.ln1(x))
        x = x + self.ffwd(self.ln2(x))
        return x
02.

L'Impasse (2024-2025)

C'est drôle de relire ça aujourd'hui. En 2024, on pensait que la courbe serait infinie. Mon mentor numérique m'avait pourtant prévenu. Il avait identifié les murs que nous allions percuter.

Archive: futur_ia_analyse.md

Les trois murs du LLM :

  1. Le Mur de la Data : On a déjà lu tout internet. Pour devenir 2x plus intelligent, il faut 10x plus de données. Cette donnée n'existe pas. L'entraînement sur la "Synthetic Data" crée une dégénérescence.
  2. Le Mur Énergétique : Entraîner GPT-4 coûtait déjà une fortune. On ne peut pas mettre un datacenter nucléaire derrière chaque requête. C'est économiquement non-viable.
  3. Le Mur du Raisonnement : Un LLM imite le raisonnement, il ne raisonne pas. Il n'a pas de modèle du monde physique.

Conclusion de l'époque : On passe de l'ère du "Perroquet Savant" (réponse réflexe) à l'ère du "Penseur Lent" (System 2 Thinking), comme les modèles o1 d'OpenAI qui prennent le temps de vérifier avant de répondre.

03.

L'Architecture du Réel (JEPA)

Avant de quitter son poste chez Meta, Yann LeCun martelait que les LLM étaient une voie de garage pour l'Intelligence Générale. Il proposait une alternative : JEPA. Une IA qui ne prédit pas le prochain mot, mais l'état futur du monde.

Archive: le_guide_jepa.md

Contrairement aux LLM (Génératifs) qui essaient de dessiner chaque pixel, JEPA (Joint Embedding Predictive Architecture) travaille dans l'abstrait.

La différence fondamentale :

  • LLM : Tu lui caches la fin de la phrase. Il devine le mot exact.
  • JEPA : Tu lui caches la fin du film. Il ne devine pas l'image, il devine l'intrigue (la représentation abstraite).

Il n'hallucine pas de détails car il ne génère pas de détails. Il comprend la physique.

Voici le code conceptuel de cette architecture qui a inspiré tant de travaux cette année :

fichier: jepa_structure.py
class JEPA(nn.Module):
    def __init__(self, input_dim, hidden_dim, latent_dim):
        super().__init__()
        
        # 1. Context Encoder (L'Observateur)
        # Transforme l'entrée brute en concept abstrait
        self.context_encoder = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, latent_dim)
        )
        
        # 2. Target Encoder (La Vérité)
        # Copie l'encodeur principal mais évolue plus lentement (EMA)
        self.target_encoder = copy.deepcopy(self.context_encoder)
        
        # 3. Predictor (Le Cerveau)
        # Devine la représentation future à partir du contexte + action
        self.predictor = nn.Sequential(
            nn.Linear(latent_dim + input_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, latent_dim)
        )

    def forward(self, x_context, z_transformation):
        # On encode le contexte
        context_rep = self.context_encoder(x_context)
        
        # On prédit la représentation de la cible (pas les pixels !)
        pred_input = torch.cat([context_rep, z_transformation], dim=1)
        predicted_rep = self.predictor(pred_input)
        
        return predicted_rep
04.

Les Outils du Changement

Pour bâtir tout cela, nous étions coincés dans le "Two-Language Problem". Python (lent) pour piloter du C++ (rapide). J'avais demandé quelles étaient les alternatives.

Archive: frameworks_et_langages.md

  • PyTorch : Le roi de la recherche (Meta). Dynamique et "Pythonic".
  • JAX : Le challenger mathématique (Google/DeepMind). Fonctionnel et ultra-rapide pour le calcul distribué.
  • Mojo : La promesse du futur. Un langage qui s'écrit comme Python mais compile comme C++, potentiellement 35 000x plus rapide.

Comparatif technique de l'époque :

fichier: battle_frameworks.py
# 1. PYTORCH (Style Classe & Objet)
class PyTorchNeuron(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(10, 1)
    def forward(self, x):
        return self.linear(x)

# 2. JAX (Style Fonctionnel & Mathématique)
def jax_neuron(params, x):
    return jnp.dot(x, params['w']) + params['b']
# Compilation JIT pour la vitesse
fast_neuron = jit(jax_neuron)

# 3. MOJO (Le Futur ?)
# struct MyModel:
#    fn forward(self, x: Tensor) -> Tensor:
#        return x @ self.w + self.b
05.

La Fin de l'Informatique

C'est ici que la discussion était devenue philosophique. Et si le problème n'était pas le modèle, mais l'ordinateur ? Nous essayons de simuler un cerveau biologique fluide sur des machines binaires rigides (Von Neumann).

L'avenir que nous entrevoyons aujourd'hui, fin 2025, est celui du Neuromorphic Computing et des Spiking Neural Networks (SNN). On ne "code" plus une logique. On simule une physique temporelle.

Archive: la_fin_de_l_informatique.md

Le code classique est une béquille. Python est impératif ("Fais ci, puis ça"). L'IA est probabiliste. Le conflit est total.

L'alternative radicale :

  • Analogique : Utiliser la physique du matériau (voltage) pour calculer, pas des bits.
  • Spiking : L'information n'est pas la valeur, mais le timing de l'impulsion (le Spike).
  • Wetware (Organoid Intelligence) : Cultiver de vrais neurones biologiques pour le calcul.

Voici la simulation qui m'a fait comprendre que le code logique était mort :

fichier: spiking_simulation.py
class SpikingNeuron:
    def __init__(self, seuil=1.0, decay=0.9):
        self.potential = 0.0
        self.seuil = seuil
        self.decay = decay

    def stimulate(self, courant_entrant, temps_ms):
        # Simulation physique : Le potentiel monte, mais fuit avec le temps
        self.potential = self.potential * self.decay + courant_entrant
        
        if self.potential >= self.seuil:
            # Décharge électrique (Spike) et Reset
            self.potential = 0.0 
            print(f"[{temps_ms}ms] *** SPIKE *** -> Action déclenchée")
            return True
        else:
            # Pas de condition arbitraire, juste de la physique
            print(f"[{temps_ms}ms] Voltage: {self.potential:.2f}v")
            return False