IA Carnet de préparation
Quiz : 0 / 0

ifage · Développeur·euse d'IA appliquée · 15 semaines

Comprendre l'IA
avant d'écrire
la première ligne.

Tu connais déjà Python. Ce carnet ne t'apprend pas la syntaxe : il t'apprend à penser en matrices, en modèles et en gradients. La Partie 1 pose les fondations. La Partie 2 t'accompagne semaine après semaine, avec du code pour chaque concept.

Partie 1 · fondations Python pour l'IA Partie 2 · concepts + code, semaine par semaine quiz à valider · exercices · exemples
Partie 1 — Se préparer

Les fondations Python pour l'IA

Pas de for, pas de classes : tu maîtrises tout ça. Ce qui change en IA, c'est l'objet manipulé. On ne pousse plus des lignes de base de données : on pousse des tableaux de nombres à travers des opérations mathématiques.

1.1 La bascule mentale : de la boucle au tableau

En Django, additionner deux listes appelle une boucle. En IA, ce réflexe devient un piège de performance. Tout repose sur NumPy et son ndarray, qui applique une opération à des millions de nombres d'un coup : la vectorisation.

# Réflexe "dev classique" — lent
c = []
for i in range(len(a)):
    c.append(a[i] + b[i])

# Réflexe "IA" — vectorisé, ~100× plus rapide
import numpy as np
c = np.array(a) + np.array(b)   # une seule opération
Intuition

Un réseau de neurones, c'est des milliards d'additions et de multiplications. En boucle Python, l'entraînement prendrait des jours. NumPy délègue à du code compilé et au GPU. La vectorisation n'est pas une optimisation, c'est le paradigme.

1.2 Scalaire, vecteur, matrice, tenseur

Tous les objets de l'IA sont un tableau de nombres, avec plus ou moins de dimensions. L'échelle la plus importante à intérioriser :

0 dimension
Scalaire
()
Un nombre. Ex : un taux d'apprentissage 0.001.
1 dimension
Vecteur
(n,)
Une liste. Ex : les 3 valeurs RVB d'un pixel.
2 dimensions
Matrice
(lignes, colonnes)
Un tableau. Ex : une image en niveaux de gris.
3+ dimensions
Tenseur
(…, …, …)
Ex : 32 images couleur = (32, 128, 128, 3).
À retenir

Le mot « tenseur » t'accompagnera toute la formation (le « Tensor » de TensorFlow). Rien de mystérieux : un tableau de nombres à N dimensions. Scalaire, vecteur et matrice sont des tenseurs de dimension 0, 1 et 2.

1.3 La forme (shape) : l'obsession n°1

La majorité des bugs en IA sont des erreurs de forme. Réflexe avant chaque opération : quelle est la forme de mon tableau, et laquelle l'opération attend-elle ? Les axes sont numérotés à partir de 0.

x = np.zeros((32, 128, 128, 3))
x.shape        # (32, 128, 128, 3)
x.ndim         # 4  → nombre de dimensions
x.size         # 1 572 864  → total d'éléments
# axe 0 = le lot (32 images) · axe 3 = les canaux couleur (R,V,B)

1.4 Les trois « multiplications » à ne pas confondre

Le point qui fait trébucher tout le monde : plusieurs façons de « multiplier » des tableaux, aux effets radicalement différents.

a) Élément par élément (*)

a * b          # [1,2,3] * [4,5,6] → [4,10,18]

b) Produit matriciel (@ ou np.dot)

L'opération reine. Combine lignes et colonnes. Règle d'or : (m, k) @ (k, n) → (m, n) — les dimensions intérieures doivent être égales.

A = np.array([[1,2],[3,4]])   # (2,2)
x = np.array([1,0])           # (2,)
A @ x          # [1, 3]

c) La transposée (.T)

A.T            # (2,3) devient (3,2)

Le produit matriciel pas à pas

La règle unique : chaque nombre du résultat est le produit scalaire d'une ligne de A avec le vecteur x — on multiplie terme à terme, puis on additionne.

A (2, 2)
1234
x (2,)
10
ligne 0 · x = (1×1) + (2×0) = 1
ligne 1 · x = (3×1) + (4×0) = 3
A @ x = [ 1, 3 ]  shape (2,)
L'intuition qui débloque tout

Ici x = [1, 0] est un sélecteur : le 1 garde la 1ʳᵉ colonne de A, le 0 efface la 2ᵉ. Donc A @ [1,0] = la 1ʳᵉ colonne de A[1, 3], et A @ [0,1] = la 2ᵉ, [2, 4]. Plus largement, A transforme le vecteur x — exactement ce que fait une couche de neurones.

Anime-le toi-même

Le même mouvement, mais interactif : fais avancer les deux pointeurs et regarde la somme se construire, case après case. (Ici A = [[2,1],[0,3]] et y = [1,4].)

A (2×2)
@
y
=
résultat

ligne en cours sous le pointeur résultat

Matrice × matrice : même principe

Le résultat en (i, j) = produit scalaire de la ligne i de la première par la colonne j de la seconde.

A
1234
@
B
1011
(0,0) l0·c0 = 1×1+2×1 = 3  ·  (0,1) l0·c1 = 1×0+2×1 = 2
(1,0) l1·c0 = 3×1+4×1 = 7  ·  (1,1) l1·c1 = 3×0+4×1 = 4
A @ B = [[3, 2], [7, 4]]
Pourquoi les dimensions intérieures doivent être égales
Un produit scalaire n'a de sens qu'entre deux suites de même longueur. La ligne de A a autant d'éléments que A a de colonnes ; la colonne de B en a autant que B a de lignes. Pour les apparier : colonnes de A = lignes de B. D'où (m,k) @ (k,n) → (m,n).
Exercice — calcul à la main

Sans exécuter de code, calcule A @ y puis A @ z :

A = np.array([[2, 1],
              [0, 3]])
y = np.array([1, 1])
z = np.array([0, 2])

Puis : que renvoie A @ [1, 0], et pourquoi ?

Solution

A @ y — l0·y = 2×1+1×1 = 3 ; l1·y = 0×1+3×1 = 3[3, 3]

A @ z — l0·z = 2×0+1×2 = 2 ; l1·z = 0×0+3×2 = 6[2, 6]

A @ [1, 0] sélectionne la 1ʳᵉ colonne → [2, 0].

1.5 Le broadcasting : la magie (et le piège)

NumPy combine des tableaux de formes différentes en « étirant » le plus petit. Pratique — et source de bugs silencieux.

images = np.random.rand(32, 128, 128, 3)  # un lot
moyenne = np.array([0.4, 0.5, 0.6])       # (3,) une moyenne par canal
images - moyenne   # NumPy étire (3,) sur tout le lot ✓
La règle en une phrase
On aligne les formes par la droite. Deux dimensions sont compatibles si elles sont égales, ou si l'une vaut 1. Ex : (32,128,128,3) et (3,) → OK ; (32,3) et (4,) → erreur.
Exercice — prédire la forme

Donne la forme du résultat, ou « erreur » :

a)  np.zeros((8, 3)) + np.ones((3,))
b)  A @ v      # A (10, 4), v (4,)
c)  M.T        # M (2, 5)
d)  np.ones((32, 3)) * np.ones((4,))
Solution

a) (8, 3) — le (3,) est diffusé sur les 8 lignes.

b) (10,)(10,4) @ (4,) → (10,).

c) (5, 2) — la transposée échange les axes.

d) erreur — alignés par la droite, 3 et 4 sont incompatibles.

1.6 Le réseau de neurones, vu de l'intérieur

C'est le cœur de la formation. En une phrase : un réseau prend des entrées, les combine avec des poids ajustables pour produire une sortie, puis corrige ces poids grâce à un retour sur ses erreurs. Décortiquons chacune de ces idées avec un schéma. La vue reste simple ; déplie les « Approfondir » quand tu veux creuser.

1 · Un neurone : entrées → poids → sortie

Un neurone artificiel
w₁ w₂ w₃ x₁ x₂ x₃ Σ+ biais b f activation ŷsortie
Chaque entrée est multipliée par son poids, on additionne le tout (+ un biais), puis une fonction d'activation produit la sortie : ŷ = f(w₁x₁ + w₂x₂ + w₃x₃ + b).

Les poids sont les seuls nombres que le réseau « apprend ». Un poids élevé = cette entrée compte beaucoup ; un poids proche de zéro = elle est ignorée. Tout l'apprentissage consiste à trouver les bons poids.

Approfondir — à quoi sert la fonction d'activation ?
Sans elle, empiler des neurones ne servirait à rien : une somme de sommes reste une simple droite, incapable de modéliser des relations complexes. L'activation introduit de la non-linéarité. La plus courante est ReLU (max(0, x)) : simple, rapide, et elle évite que le signal ne s'éteigne dans les réseaux profonds. On trouve aussi sigmoïde (écrase entre 0 et 1, utile pour une probabilité) et tanh (entre −1 et 1).
Approfondir — pourquoi un biais ?
Le biais b décale le seuil de déclenchement du neurone. Sans lui, la frontière de décision serait forcée de passer par l'origine (0,0), ce qui limite fortement ce que le neurone peut représenter. C'est l'équivalent de l'ordonnée à l'origine b dans y = ax + b.

2 · Beaucoup de neurones : les couches

Un réseau à une couche cachée
x₁ x₂ x₃ ŷ₁ ŷ₂ entrées couche cachée sorties
Chaque trait est un poids ; chaque couche transforme le vecteur reçu en un nouveau vecteur. Empiler des couches permet de capturer des motifs de plus en plus abstraits.

C'est ici que la Partie 1 se referme : comme chaque couche multiplie le vecteur d'entrée par une matrice de poids, un réseau n'est qu'une suite de produits matriciels séparés par des activations. Voilà pourquoi @ et les shapes sont si centraux.

Approfondir — une couche = une multiplication de matrices
Pour une couche : h = f(W · x + b). Si l'entrée a 3 valeurs et la couche 4 neurones, alors W a la forme (4, 3), x est (3,), et W·x donne (4,) — une sortie par neurone. On applique ensuite f à chaque valeur. La couche suivante reprend ce (4,) comme entrée, avec sa propre matrice. Entraîner le réseau = ajuster tous les nombres de tous ces W et b.

3 · Comment il apprend : la boucle de feedback

La boucle d'entraînement
Entréesdonnées X Réseaupasse avant Prédictionŷ Perteécart avec y Rétropropagationgradient de chaque poids Mise à jour des poidspoids − lr × gradient ↻ répété des milliers de fois
Le réseau prédit, on mesure l'erreur, on calcule dans quel sens bouger chaque poids (rétropropagation), on ajuste, et on recommence — jusqu'à ce que l'erreur soit basse.
Le gradient, en image

Tu es sur une colline dans le brouillard et tu veux descendre. Tu sens la pente et fais un pas vers le bas. Tu répètes. C'est la descente de gradient : le gradient est la pente de la perte, et à chaque pas le modèle ajuste ses poids pour faire baisser l'erreur. La taille du pas = le taux d'apprentissage (learning rate).

La boucle d'entraînement, en pseudo-code
for etape in range(1000):
    prediction = modele(X)                  # passe avant : entrées → sortie
    perte      = mse(prediction, y)          # écart avec la cible
    gradients  = perte.backward()            # rétropropagation : pente de chaque poids
    poids      = poids - 0.01 * gradients    # un pas vers le bas (0.01 = learning rate)
Approfondir — la rétropropagation, concrètement
On veut savoir : « si je bougeais ce poids, de combien la perte changerait-elle ? » La réponse, c'est sa dérivée (son gradient). La rétropropagation calcule l'erreur à la sortie, puis la propage à rebours, couche par couche, en appliquant la règle de dérivation en chaîne. Chaque poids reçoit ainsi son gradient. On fait ensuite un pas de descente de gradient. Les frameworks (PyTorch, TensorFlow) font ce calcul automatiquement : c'est l'autograd. Tu n'auras quasiment jamais à le coder à la main.

1.7 L'écosystème : qui fait quoi

NumPy
socle numérique
Les tableaux (ndarray) et l'algèbre linéaire. La base de tout.
pandas
données tabulaires
Charger, nettoyer, explorer (CSV, Excel). Le DataFrame = un tableur programmable.
Matplotlib / seaborn
visualisation
Tracer courbes, images, distributions. « Voir » ce que fait un modèle.
scikit-learn
ML classique
Régressions, arbres, clustering, split train/test, métriques.
PyTorch
deep learning
Le framework le plus répandu pour construire des réseaux.
TensorFlow / Keras
deep learning
L'alternative de Google. Keras = la surface haut niveau, lisible.
Hugging Face
modèles pré-entraînés
transformers : réutiliser des modèles déjà entraînés en quelques lignes.
OpenCV / Pillow
images
Lire, redimensionner, transformer des images avant un modèle de vision.
Quiz · Partie 1
Q1. En convention channels-last (NumPy/TensorFlow), un lot de 16 images couleur 64×64 a la forme…
Lot en tête (16), puis hauteur×largeur (64×64), puis 3 canaux → (16, 64, 64, 3). La forme (16, 3, 64, 64) est la convention channels-first de PyTorch (NCHW) : correcte ailleurs, mais pas ici.
Q2. Forme du résultat de (3, 4) @ (4, 2) ?
(3,4) @ (4,2) : le 4 intérieur concorde et disparaît, restent les extérieurs → (3, 2). Les formes sont bien compatibles.
Q3. A et B sont deux matrices (2, 2). Que dire de A * B et A @ B ?
Même sur des matrices carrées, les deux diffèrent. * multiplie case à case ; @ combine lignes et colonnes. C'est le piège n°1.
Q4. Avec A = [[1,2],[3,4]], combien vaut A @ [2, 1] ?
l0·x = 1×2+2×1 = 4 ; l1·x = 3×2+4×1 = 10[4, 10]. La réponse [10, 4] correspondrait à A.T @ x (erreur de transposée).
Q5. Parmi ces paires, laquelle est incompatible pour le broadcasting ?
Alignées par la droite : 3 vs 4 ne sont ni égales ni à 1 → incompatibles. En revanche (8,1)&(8,5) (le 1 s'étire) et (10,3)&(3,) passent.
Q6. Pendant l'entraînement, le gradient d'un poids désigne…
Le gradient est une pente (une dérivée), pas la perte elle-même (option 1) ni l'erreur d'un exemple (option 3). Il indique comment bouger le poids pour faire baisser la perte.
Partie 2 — Suivre le cours

Les concepts, semaine par semaine

Pour chaque bloc du programme ifage : l'objectif, les concepts, un exemple de code, un glossaire, un exercice et un quiz à valider. Reviens ici après chaque séance.

Semaines 1–2

Introduction à l'IA

Objectif : installer le vocabulaire commun et distinguer les familles d'apprentissage.

Les 3 grands types d'apprentissage

Le vocabulaire fondateur

Un modèle reçoit des features (entrées) et produit une prédiction, comparée à l'étiquette attendue. Deux phases : l'entraînement puis l'inférence. On sépare toujours train et test ; un modèle excellent en train mais faible en test a surappris (overfitting).

Un modèle supervisé complet avec scikit-learn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# X = features (surface, pièces, ...) · y = label (prix)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2)

modele = LinearRegression()
modele.fit(X_tr, y_tr)          # entraînement
modele.score(X_te, y_te)        # évaluation sur des données JAMAIS vues
Exemple

Prédire le prix d'un appartement. Features : surface, pièces, quartier. Label : prix de ventes passées. Le modèle apprend le lien, puis estime un bien inédit.

Feature / Label
Variable d'entrée / réponse correcte fournie.
Train / test split
Découpage pour évaluer honnêtement la généralisation.
Overfitting
Le modèle mémorise au lieu de généraliser.
Approfondir — 4 leviers contre le surapprentissage
1. Plus de données — le remède le plus efficace : plus d'exemples, plus dur de tricher par mémorisation. 2. Régularisation — pénaliser les poids trop grands (L2), ou dropout (éteindre au hasard des neurones à l'entraînement pour forcer la robustesse). 3. Simplifier le modèle (moins de couches/neurones). 4. Early stopping — arrêter l'entraînement dès que l'erreur sur un jeu de validation remonte.
Exercice — cadrer un problème

On veut détecter si un e-mail est un spam. a) deux features plausibles ? b) le label ? c) le type d'apprentissage ?

Solution

a) nombre de liens, présence de mots-clés, expéditeur inconnu, proportion de majuscules.

b) l'étiquette binaire spam/non-spam d'un historique déjà classé.

c) supervisé (classification) — on a des exemples étiquetés.

Quiz · Semaines 1–2
Q1. Ce qui distingue fondamentalement le supervisé du non supervisé :
Le critère est l'étiquette : présente → supervisé, absente → non supervisé. Les deux peuvent utiliser des réseaux et des données de toute taille.
Q2. Un modèle fait 99 % en entraînement et 62 % en test. Diagnostic ?
Le fossé train ≫ test est la signature de l'overfitting. Le sous-apprentissage donnerait des scores faibles partout, y compris en entraînement.
Q3. Pour prédire un prix, la « surface en m² » est…
C'est une entrée → feature. Les paramètres appris sont les poids internes ; l'étiquette ici serait le prix.
Q4. À quoi sert de garder un jeu de test à part ?
Si on entraînait sur le test, le score serait trompeur. Le test mesure la vraie capacité à généraliser.
Semaines 3–4

Vision par ordinateur

Objectif : faire « voir » une machine, et découvrir l'astuce qui rend l'IA accessible : l'apprentissage par transfert.

Une image = un tenseur

Une image couleur est un tenseur (H, L, 3) ; chaque pixel = 3 nombres (R, V, B). Un CNN fait glisser de petits filtres (la convolution) : les premières couches captent bords et textures, les suivantes composent formes puis objets.

L'astuce reine

Entraîner de zéro exige des millions d'images. Le transfert réutilise un modèle pré-entraîné (ex. ResNet) qui « sait déjà voir » et ne réentraîne que la fin : d'excellents résultats avec quelques centaines d'images.

Apprentissage par transfert avec Keras
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, Model

base = ResNet50(weights="imagenet", include_top=False)  # modèle pré-entraîné
base.trainable = False                               # on gèle ce qu'il a appris

x = layers.GlobalAveragePooling2D()(base.output)
sortie = layers.Dense(3, activation="softmax")(x)      # 3 classes = NOTRE problème
modele = Model(base.input, sortie)                    # on ne réentraîne que la fin
Convolution / CNN
Filtre glissant détectant un motif local / réseau spécialisé images.
Modèle pré-entraîné
Réseau déjà entraîné sur d'immenses données, réutilisable.
Fine-tuning
Réajuster finement un modèle pré-entraîné sur ses données.
Approfondir — pourquoi un CNN plutôt qu'un réseau dense sur une image ?
Un réseau dense relierait chaque pixel à chaque neurone : pour une image 256×256×3, cela ferait des centaines de milliers de poids par neurone — ingérable. Le CNN fait glisser le même petit filtre sur toute l'image (partage de poids) : très peu de paramètres. Et il détecte un motif où qu'il se trouve dans l'image (invariance par translation) : un œil de chat reste un œil de chat, en haut comme en bas.
Exercice — choisir sa stratégie

Tu as 300 photos réparties en 3 catégories de fleurs. En une phrase : quelle stratégie, et quelle partie du modèle modifies-tu ?

Solution

Transfert : partir d'un modèle pré-entraîné, remplacer la dernière couche par une couche à 3 sorties, puis fine-tuner. 300 images seraient trop peu pour partir de zéro, mais suffisent pour réajuster un modèle qui sait déjà voir.

Quiz · Semaines 3–4
Q1. Pourquoi le transfert marche-t-il avec peu d'images ?
On réutilise des couches qui savent déjà voir bords/formes. Il ne « crée » pas d'images (option 1) et reste supervisé : il faut des étiquettes (option 2).
Q2. Dans un CNN, que fait concrètement une convolution ?
Le filtre balaie l'image et réagit à un motif (bord, texture). Redimensionner ou passer en gris sont d'autres opérations, pas la convolution.
Q3. En convention channels-last, une image couleur 256×256 est un tenseur…
H×L×3 canaux. (3,256,256) est la convention channels-first (PyTorch) ; (256,256) serait une image en niveaux de gris.
Semaine 5

Apprentissage par renforcement

Objectif : un paradigme sans « bonne réponse » donnée : un agent apprend par essais, erreurs et récompenses.

La boucle agent ↔ environnement

Un agent observe un état, choisit une action, reçoit une récompense et un nouvel état. Il cherche la politique qui maximise la récompense cumulée. Le Q-learning estime, pour chaque (état, action), la récompense future attendue ; quand les états sont trop nombreux, le DQN remplace la table par un réseau de neurones.

La mise à jour au cœur du Q-learning (équation de Bellman)
ancien = Q[etat, action]
futur  = max(Q[nouvel_etat])                         # meilleure valeur atteignable ensuite
Q[etat, action] = ancien + alpha * (recompense + gamma * futur - ancien)
#                          ^taux            ^gain immédiat  ^escompte du futur
Exemple

Un agent apprend à jouer à Pong. État : positions balle/raquettes. Actions : monter/descendre. Récompense : +1 s'il marque, −1 sinon. Après des milliers de parties, il joue très bien — sans qu'on lui ait dit « comment ».

Agent / Environnement
Le décideur, et le monde avec lequel il interagit.
Politique
La stratégie : quelle action dans quel état.
DQN
Q-learning où un réseau approxime les valeurs Q.
Exercice — modéliser un problème

Un robot aspirateur apprend à nettoyer par renforcement. Définis : a) l'état, b) les actions, c) un schéma de récompense.

Solution (une possibilité)

a) position + carte des zones sales/propres + obstacles.

b) avancer, tourner, aspirer.

c) +1 par zone nettoyée, −1 par collision, −0,01 par pas (pour l'efficacité). Le choix des récompenses façonne tout le comportement.

Quiz · Semaine 5
Q1. Dans le Q-learning, la « valeur Q » d'un couple (état, action) estime…
Q estime le gain futur cumulé. L'agent choisit l'action de plus haute valeur Q. Ce n'est ni un comptage ni une probabilité de légalité.
Q2. Le « Deep » de DQN correspond à…
Quand les états sont trop nombreux pour une table, un réseau approxime les valeurs Q : « Deep Q-Network ».
Q3. Le dilemme « exploration / exploitation » oppose…
Trop exploiter → l'agent stagne ; trop explorer → il n'apprend jamais à gagner. Tout est dans l'équilibre.
Semaines 6–8

Traitement du langage naturel (NLP)

Objectif : traiter du texte et construire un modèle de langue. Le socle direct des LLM.

Du texte aux nombres

Un modèle ne comprend que des nombres. Deux étapes : la tokenisation (découper en tokens numérotés) puis le plongement (embedding : chaque token → un vecteur qui capte le sens, au point que roi − homme + femme ≈ reine).

De la mémoire à l'attention

Les anciens RNN/LSTM lisaient mot à mot et oubliaient le contexte lointain. Le Transformer (2017) résout ça par l'attention : chaque mot pondère l'importance de tous les autres. Un modèle de langue ne fait qu'une chose : prédire le token suivant — répété, cela produit des phrases.

Tokeniser puis générer avec Hugging Face
from transformers import AutoTokenizer, pipeline

tok = AutoTokenizer.from_pretrained("gpt2")
tok("Le chat dort")["input_ids"]     # → [1026, 4758, 8501] (identifiants)

gen = pipeline("text-generation", model="gpt2")
gen("En 2026, l'IA appliquée", max_length=20)  # prédit les tokens suivants
Token / Embedding
Unité de texte numérotée / vecteur représentant son sens.
Attention
Pondère l'importance de chaque mot du contexte.
Transformer
Architecture fondée sur l'attention, base des LLM.
Approfondir — le mécanisme d'attention (Query, Key, Value)
Chaque mot produit trois vecteurs : une Requête (Query), une Clé (Key) et une Valeur (Value). Le score entre deux mots = Query de l'un · Key de l'autre ; un softmax transforme ces scores en poids qui somment à 1. La nouvelle représentation d'un mot = la somme des Values pondérée par ces poids — autrement dit « combien chaque autre mot doit influencer celui-ci ». Le multi-head répète l'opération en parallèle pour capter plusieurs types de relations (grammaire, sens, coréférence…).
Exercice — du texte aux nombres

Décris les deux étapes pour transformer « Le chat dort » en entrée d'un modèle, et ce que produit chacune.

Solution

1) Tokenisation → une suite d'entiers, ex. [1026, 4758, 8501].

2) Embedding → chaque entier devient un vecteur de sens → une matrice (3, d) que le modèle traite.

Quiz · Semaines 6–8
Q1. Un embedding, c'est…
Attribuer un entier, c'est la tokenisation (étape d'avant). L'embedding transforme cet entier en vecteur de sens.
Q2. L'avantage clé du Transformer sur un RNN classique :
Traiter les mots séquentiellement est justement la limite du RNN. L'attention, elle, met tous les mots en relation d'un coup.
Q3. Fondamentalement, un modèle de langue génératif…
La génération = prédiction répétée du prochain token. Simple en principe, puissant à grande échelle.
Q4. « roi − homme + femme ≈ reine » illustre que…
On additionne des vecteurs de sens, pas des lettres. La régularité géométrique de l'espace d'embedding rend l'analogie possible.
Bonus · d'après un vrai rapport 2026

Anatomie d'un LLM moderne

Les semaines 6–8 expliquent comment un modèle de langue fonctionne. Mais quand tu ouvriras le rapport technique d'un vrai modèle récent, tu croiseras un vocabulaire de plus : « 2,8 billions de paramètres », « Mixture-of-Experts », « fenêtre de 1M de tokens », « RLHF », « effort de raisonnement »… Voici ces pièces manquantes, expliquées simplement. (Exemples chiffrés tirés du rapport Kimi K3, un modèle ouvert de 2026.)

1 · Les paramètres = la taille du modèle

Souviens-toi : apprendre, c'est ajuster des poids. Les paramètres d'un modèle, ce sont justement tous ces poids réunis. On les compte en milliards, voire en billions (1 billion = mille milliards). Kimi K3 en a 2,8 billions. En gros : plus de paramètres = plus de « capacité » à mémoriser et à généraliser — mais ce n'est pas le seul facteur (les données et l'entraînement comptent autant).

2 · Mixture-of-Experts : n'activer que ce qu'il faut

Faire passer chaque mot par 2,8 billions de paramètres coûterait une fortune. L'astuce Mixture-of-Experts (MoE) : au lieu d'un seul gros cerveau, le modèle contient une grande équipe de « spécialistes » (des experts), et un petit routeur choisit, pour chaque token, les quelques experts les plus pertinents.

Mixture-of-Experts : un routeur choisit quelques experts
token Routeurchoisit expert 1 expert 2 ✓ expert 3 expert 4 ✓ expert 5 … 896 experts au total sortie
Kimi K3 n'active que 16 experts sur 896 à chaque token. Résultat : la puissance d'un modèle de 2,8 billions de paramètres, pour le coût de calcul d'un modèle de 104 milliards seulement (les paramètres « activés »).
À retenir

Deux chiffres dans les rapports : les paramètres totaux (toute la connaissance stockée) et les paramètres activés (ce qui travaille réellement à chaque token). MoE = beaucoup de savoir, peu de calcul par mot.

Approfondir — pourquoi le MoE est-il malin ?
Différents experts se spécialisent (code, langues, maths…). Comme on n'en réveille qu'une poignée par token, on peut faire grossir énormément le savoir total sans faire exploser le coût de chaque réponse. Le point délicat, c'est d'équilibrer le routeur pour que tous les experts servent (sinon certains ne s'entraînent jamais) : c'est tout l'enjeu du « load balancing » mentionné dans ces rapports.

3 · La fenêtre de contexte

La fenêtre de contexte, c'est la quantité de texte que le modèle peut « garder en tête » en une fois, mesurée en tokens. Kimi K3 monte à 1 million de tokens — l'équivalent de plusieurs livres, ou d'un énorme projet de code. Au-delà, le plus ancien « sort » de la fenêtre et est oublié. C'est directement lié à l'attention (semaines 6–8) : relier chaque mot à tous les autres devient très coûteux quand le texte est long, d'où les recherches sur des attentions plus « efficaces ».

4 · Comment un LLM devient un assistant

Un modèle fraîchement pré-entraîné sait beaucoup, mais ne sait pas obéir : il complète du texte, sans forcément répondre à ta question. Le rapport décrit le parcours en plusieurs étapes qui le transforme en assistant utile :

Du texte brut à l'assistant
Pré-entraînementprédire le mot suivant SFTexemples de réponses RL + feedbackrécompenses Distillationexperts → 1 modèle Assistant
Pré-entraînement (il apprend le monde) → SFT (on lui montre de bonnes réponses) → RL avec feedback (on récompense les meilleures) → distillation (plusieurs experts fusionnés en un seul modèle).
Approfondir — c'est quoi un « modèle de récompense » ?
Pour du code ou des maths, on peut vérifier automatiquement si la réponse est juste. Mais pour « écris un e-mail poli », il n'y a pas de vérité unique. On entraîne alors un second modèle, le modèle de récompense, à imiter les préférences humaines : on lui montre des paires de réponses avec « celle-ci est meilleure », et il apprend à donner une note. Le RL utilise ensuite cette note comme récompense. (Kimi K3 va plus loin avec un juge qui rédige une grille de critères avant de noter.)

5 · Le « raisonnement » et l'effort

Les modèles récents peuvent « réfléchir » avant de répondre : ils génèrent d'abord une suite de pensées intermédiaires (une chaîne de pensée), invisible ou repliée, puis la réponse finale. Donner plus de « budget de réflexion » améliore souvent la qualité sur les problèmes difficiles — au prix de plus de temps et de calcul. Kimi K3 propose d'ailleurs plusieurs niveaux d'effort (bas / élevé / max). On appelle ça le calcul au moment de la réponse (test-time compute) : un deuxième levier, en plus de la taille du modèle.

6 · Multimodal : texte + images dans un seul modèle

Longtemps, la vision (semaines 3–4) et le langage (semaines 6–8) étaient deux mondes séparés. Un modèle multimodal « natif » comme Kimi K3 comprend les deux d'un coup : on peut lui donner une image et du texte dans la même conversation. Techniquement, l'image est transformée en tokens (via une « tour de vision ») que le modèle traite comme des mots.

Approfondir — deux notions bonus des rapports : quantification & lois d'échelle
Quantification (quantization) : stocker les poids avec moins de précision (par ex. 4 bits au lieu de 16) pour un modèle plus léger et plus rapide, en perdant très peu de qualité. Lois d'échelle (scaling laws) : des courbes qui prédisent combien un modèle s'améliorera si on augmente sa taille, ses données et son calcul — elles servent à décider à l'avance comment dépenser au mieux le budget d'entraînement.
Ce que tu peux faire maintenant

Relis l'abstract d'un rapport comme Kimi K3 : « MoE de 2,8 billions de paramètres, 104 milliards activés, contexte 1M, RL multi-effort »… chaque terme devrait désormais te parler. C'est exactement le genre de veille utile pendant la formation.

Quiz · Anatomie d'un LLM
Q1. Kimi K3 a 2,8 billions de paramètres mais n'en utilise que 104 milliards par token. Pourquoi ?
C'est le principe du Mixture-of-Experts : savoir total énorme, mais seuls quelques experts (16 sur 896) travaillent par token → coût réduit.
Q2. La « fenêtre de contexte » d'un LLM, c'est…
C'est sa « mémoire de travail ». Au-delà de la fenêtre (1M tokens pour Kimi K3), le texte le plus ancien est oublié.
Q3. Quelle étape apprend surtout au modèle à suivre des instructions et s'aligner sur nos préférences (plutôt qu'à juste prédire le mot suivant) ?
Le pré-entraînement donne les connaissances ; ce sont le SFT (exemples de bonnes réponses) et le RL avec feedback (récompenses) qui en font un assistant obéissant et aligné.
Q4. Augmenter l'« effort de raisonnement » avant de répondre…
C'est le calcul au moment de la réponse (test-time compute) : laisser le modèle « réfléchir » plus longtemps aide, mais coûte plus cher.
Semaines 9–11

IA générative

Objectif : passer de l'IA qui classe à l'IA qui crée, et adapter de grands modèles.

Deux familles pour générer des images

Diffusion, en image

Une photo peu à peu couverte de « neige » (bruit). Le modèle apprend le chemin inverse : enlever la neige étape par étape. On lui donne du bruit + une description, il reconstruit une image.

Le fine-tuning

Réentraîner un GPT complet coûte des millions. Le fine-tuning reprend un grand modèle et l'ajuste sur un petit jeu de données spécifique : c'est ce qui rend ces modèles exploitables en entreprise.

Génération d'image par diffusion (bibliothèque diffusers)
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5")
image = pipe("un chat astronaute, style aquarelle").images[0]  # prompt → image
image.save("chat.png")
Générateur / Discriminateur
Les deux réseaux rivaux d'un GAN.
Diffusion
Génération par débruitage progressif.
Fine-tuning / Prompt
Adapter un grand modèle / la consigne qui guide la génération.
Approfondir — les deux passes d'un modèle de diffusion
Entraînement (passe avant) : on ajoute du bruit gaussien à une image en T petites étapes, jusqu'au bruit pur, et on apprend à un réseau à prédire le bruit ajouté à chaque étape. Génération (passe inverse) : on part de bruit pur et, étape après étape, le réseau prédit le bruit à retirer ; l'image émerge peu à peu. Guidage par texte : les embeddings du prompt conditionnent le débruitage ; on peut même amplifier leur influence (classifier-free guidance) pour coller davantage à la description.
Exercice — décider d'une approche

Une PME veut générer des visuels dans son style propre et dispose de ~500 images de marque. Recommande une approche, puis nomme un risque.

Solution

Approche : fine-tuner un modèle de diffusion pré-entraîné sur les 500 images.

Risque : surapprentissage — avec trop peu d'images/trop d'étapes, le modèle recopie au lieu de généraliser (+ questions de droits sur les données).

Quiz · Semaines 9–11
Q1. Dans un GAN, le rôle du discriminateur est de…
Générer, c'est le rôle du générateur. Le discriminateur juge — et sa critique fait progresser le générateur.
Q2. Un modèle de diffusion produit une image en…
Il ne colle pas de morceaux et ne procède pas pixel par pixel : il débruite par étapes, guidé par le prompt.
Q3. Un piège du fine-tuning à garder en tête :
Le fine-tuning n'immunise pas contre l'overfitting — au contraire, sur un petit jeu il y est plus exposé. Il ne change pas la taille du modèle.
Q4. Qu'est-ce qui distingue GAN et diffusion (tous deux génèrent des images) ?
Deux mécanismes différents pour le même but : rivalité (GAN) vs débruitage (diffusion). Les deux reposent sur des réseaux.
Semaines 12–13

IA agentique

Objectif : dépasser le modèle qui répond pour un agent qui raisonne, utilise des outils et agit en plusieurs étapes. Ta connaissance du dev web y est un atout.

Qu'est-ce qu'un agent ?

Un agent = un LLM dans une boucle, doté d'outils (recherche, API, code, fichiers). Le schéma ReAct alterne Réflexion → Action → Observation jusqu'à l'objectif. Le function calling est le pont : le LLM émet un appel structuré, ton code l'exécute. Le RAG injecte des documents récupérés pour ancrer les réponses.

Boucle agentique (le motif de base)
while not objectif_atteint:
    pensee   = modele.reflechir(contexte)    # que faire ?
    action   = modele.choisir_outil(pensee)   # ex: rechercher(...)
    resultat = executer(action)                # appel réel
    contexte = contexte + resultat             # on mémorise l'observation
Définir un outil pour le function calling
outils = [{
    "name": "meteo",
    "description": "Météo d'une ville pour un jour donné",
    "parameters": {"ville": "str", "jour": "str"}
}]
reponse = modele.chat(messages, tools=outils)
if reponse.appel_outil:                   # le LLM DEMANDE d'appeler l'outil
    obs = meteo(**reponse.arguments)      # TON code l'exécute vraiment
    messages.append(obs)                  # on renvoie l'observation au modèle
Agent / Outil
LLM en boucle avec objectif / fonction externe qu'il peut appeler.
Function calling
Le LLM produit un appel structuré exécuté par ton code.
RAG
Injecter des documents récupérés pour ancrer les réponses.
Approfondir — mémoire courte, mémoire longue et RAG
Mémoire courte = la fenêtre de contexte (tout ce qui tient dans le prompt de la conversation en cours). Mémoire longue = une base vectorielle : on stocke des documents sous forme d'embeddings. Le RAG transforme la question en embedding, cherche les documents dont l'embedding est le plus proche (similarité), puis les injecte dans le contexte avant de répondre. Le modèle n'est jamais réentraîné : on lui « souffle » les bonnes sources au bon moment.
Exercice — dérouler une boucle

Un agent reçoit : « Quel temps fera-t-il demain à Genève, faut-il un parapluie ? ». Écris la suite réflexion → action → observation, avec l'outil utilisé.

Solution

Réflexion : besoin de la météo. Action : meteo("Genève","demain"). Observation : « pluie 80 % ». Réflexion : 80 % → parapluie. Action : répondre. Un enchaînement raisonnement/outil/observation : c'est ça, un agent.

Quiz · Semaines 12–13
Q1. Ce qui distingue un agent d'un simple appel à un LLM :
Un agent = LLM + outils + boucle. Il agit, il ne se contente pas de répondre. Le LLM reste son moteur.
Q2. Le RAG sert principalement à…
Le RAG ne réentraîne rien : il fournit au modèle des sources pertinentes au moment de répondre, ce qui réduit les erreurs.
Q3. Le « function calling » signifie que…
Le modèle ne « lance » rien lui-même : il demande un appel (du JSON), c'est ton code qui exécute — comme un appel d'API que tu contrôles.
Q4. Dans le schéma ReAct, la boucle enchaîne :
ReAct = Reason + Act. Les autres options mélangent le vocabulaire du ML (workflow) et du renforcement.
Semaines 14–15

Projet appliqué

Objectif : tout mettre en œuvre sur un projet réel, évalué devant un jury (20–30 h, mémoire d'une dizaine de pages).

Une démarche en 6 temps

  1. Cadrer le problème comme une tâche d'IA claire (classer ? prédire ? générer ?).
  2. Réunir et explorer les données — ~60 % du travail (pandas + Matplotlib).
  3. Choisir simple — souvent scikit-learn ou un modèle pré-entraîné suffit.
  4. Établir une baseline puis itérer ; surveiller l'écart train/test.
  5. Évaluer honnêtement sur des données jamais vues ; assumer les limites.
  6. Présenter le raisonnement, pas seulement la performance.
Conseils de survie

Choisis un sujet qui te tient à cœur et dont les données existent déjà. Vise petit mais complet. Une baseline simple qui tourne bat un modèle sophistiqué inachevé la veille de la soutenance.

Exercice — choisir un sujet

(A) « recréer un assistant type ChatGPT »  ou  (B) « classer les tickets de support de mon entreprise en 5 catégories ». Lequel choisir, et pourquoi ?

Solution

(B) : périmètre petit mais complet, données existantes (historique de tickets), tâche claire (classification supervisée), faisable en 20–30 h. (A) est hors de portée (données, calcul, temps).

Quiz · Semaines 14–15
Q1. Par quoi vaut-il mieux commencer un projet d'IA ?
Sans problème clair ni données comprises, aucun modèle n'aide — et le choix du framework est très secondaire.
Q2. Une « baseline », c'est…
La baseline dit si tes améliorations valent la peine. Sans elle, impossible de savoir si un modèle complexe apporte quelque chose.
Q3. Devant le jury, qu'est-ce qui compte le plus ?
Un jury évalue ta maîtrise : pourquoi ces choix, comment tu les as évalués, ce que ça ne fait pas. La performance brute ne suffit pas.
Dernier mot

Tu arrives avec un atout : tu sais déjà construire des systèmes. L'IA appliquée, c'est en grande partie de l'ingénierie logicielle avec un nouveau type de brique. Ce carnet est ta carte ; le reste, c'est la pratique. Bon cours. 🎓