Accueil / Factory / Algos ML / Deep Q-Network (DQN) — factory / algos ML / apprentissage par renforcement profond

DEEP Q-NETWORK.

Le Q-learning, avec un réseau de neurones à la place du tableau de valeurs. Le réseau estime la valeur de chaque action à partir de la situation, même jamais rencontrée. DeepMind l'a rendu célèbre en 2015 en lui faisant apprendre des dizaines de jeux Atari à partir des seuls pixels de l'écran et du score.

Décision séquentielleDeep learningSupply chainSimulationNiveau : avancé

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceGère des situations riches qu'aucune table ne pourrait lister
InterprétabilitéUn réseau de neurones : la politique ne se lit pas
VitesseDes centaines de milliers d'essais simulés pour converger
Facilité de réglageApprentissage instable si les réglages sont mal choisis
Tolérance aux données brutesObservations à normaliser, récompense à concevoir avec soin
EN 30 SECONDES

Au lieu d'un carnet qui note la valeur de chaque situation vécue, le vendeur développe un flair : face à une situation nouvelle, il estime ce que chaque décision va rapporter par ressemblance avec ce qu'il a déjà vu.

1. Le réseau remplace la table

Il reçoit la situation, ici le stock et le jour de la semaine, et sort une valeur par action possible. On choisit l'action la mieux notée, avec un peu d'exploration.

2. Les expériences sont stockées puis rejouées

Chaque essai est rangé dans une mémoire (replay buffer). Le réseau apprend sur des lots tirés au hasard dans cette mémoire, ce qui casse l'enchaînement des essais successifs et stabilise l'apprentissage.

3. Une copie figée sert de cible

La valeur visée, gain immédiat plus valeur de la suite, est calculée par une copie du réseau mise à jour seulement de temps en temps. Sans elle, le réseau poursuivrait une cible qui bouge à chaque pas.

LE CAS MÉTIER

supply chain · réapprovisionnement d'entrepôt
EN ENTRÉE

Un stock et un calendrier

Chaque jour, l'algorithme voit le stock et le jour de la semaine, puis commande 0, 10, 20 ou 30 unités. La demande est simulée, avec un pic le samedi. Le simulateur est écrit avec Gymnasium, la bibliothèque standard des environnements de renforcement.

EN SORTIE

Une politique de commande

Le réseau apprend quand commander et combien, en anticipant le pic du samedi. En production, on l'interroge chaque matin avec l'état du stock.

CE QU'ON MESURE

Le gain sur 4 semaines face à la règle actuelle

Chaque jour compte la marge sur ventes, moins les frais de commande, le coût du stock et une pénalité par vente manquée. On compare au gain de la règle en place, ici 10 unités par jour, sur les mêmes 50 scénarios de demande.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Situations décrites par de nombreuses variables ou par des valeurs continues
  • Actions en petit nombre, à choisir dans une liste (commander 0, 10, 20 ou 30)
  • Un simulateur fidèle permet des centaines de milliers d'essais sans risque
  • Un Q-learning marche sur une version simplifiée, mais le vrai problème est trop grand pour une table

NON

  • Actions continues (un prix, une puissance) : préférer PPO ou un autre algorithme de policy gradient
  • Peu de situations possibles : un Q-learning tabulaire est plus simple et plus lisible
  • Gestion de stock classique et bien modélisée : les méthodes de recherche opérationnelle (stock de sécurité, point de commande) suffisent souvent
  • Pas de simulateur : apprendre en conditions réelles coûterait trop cher
LES 4 RÉGLAGES QUI COMPTENT

Noms donnés pour stable-baselines3, la bibliothèque Python de référence.

exploration_fraction

Part de l'entraînement pendant laquelle l'exploration décroît jusqu'à son niveau final (5 % des actions par défaut). Trop courte, le réseau se fige sur une stratégie médiocre.

buffer_size

Taille de la mémoire des expériences rejouées. Assez grande pour couvrir des situations variées, sans garder trop longtemps les essais d'une politique dépassée.

target_update_interval

Nombre de pas entre deux mises à jour de la copie cible. Trop fréquent, l'apprentissage oscille ; trop rare, il ralentit.

total_timesteps

Budget d'entraînement en pas simulés. Un DQN en demande souvent des centaines de milliers : on suit la récompense moyenne et on arrête quand elle plafonne.

LE CODE MINIMAL

données simulées dans le code
# Réapprovisionnement d'un entrepôt : Deep Q-Network (DQN) en Python
import numpy as np
import gymnasium as gym
from stable_baselines3 import DQN

class Entrepot(gym.Env):   # chaque jour : stock et jour de la semaine -> quantité à commander
    observation_space = gym.spaces.Box(0.0, 1.0, shape=(2,), dtype=np.float32)
    action_space = gym.spaces.Discrete(4)   # commander 0, 10, 20 ou 30 unités

    def reset(self, seed=None, options=None):
        super().reset(seed=seed)
        self.stock, self.jour = 20, 0
        return np.array([0.2, 0.0], dtype=np.float32), {}

    def step(self, action):
        self.stock = min(self.stock + 10 * int(action), 100)
        demande = self.np_random.poisson(20 if self.jour % 7 == 5 else 8)   # pic le samedi
        vendus = min(self.stock, demande)
        self.stock, self.jour = self.stock - vendus, self.jour + 1
        gain = 5 * vendus - 10 * (action > 0) - 0.2 * self.stock - 3 * (demande - vendus)   # marge, commande, stock, rupture
        obs = np.array([self.stock / 100, (self.jour % 7) / 6], dtype=np.float32)
        return obs, float(gain), False, self.jour >= 28, {}   # épisode = 4 semaines

modele = DQN("MlpPolicy", Entrepot(), learning_rate=1e-3, buffer_size=50_000, exploration_fraction=0.3,
             target_update_interval=1_000, seed=42, verbose=0)
modele.learn(total_timesteps=150_000)

def evaluer(choix, env=Entrepot(), total=0.0):   # gain moyen sur 50 périodes de 4 semaines
    for i in range(50):
        obs, fini = env.reset(seed=i)[0], False
        while not fini:
            obs, gain, _, fini, _ = env.step(choix(obs))
            total += gain
    return round(total / 50, 1)

print("DQN :", evaluer(lambda o: int(modele.predict(o, deterministic=True)[0])), "| 10 unités par jour :", evaluer(lambda o: 1))

Le DQN se pratique en Python (stable-baselines3, PyTorch, Gymnasium) : pas d'équivalent R utilisé en entreprise.

QUESTIONS FRÉQUENTES

Quelle différence entre Q-learning et Deep Q-Network ?

Le Q-learning stocke une valeur par situation et par action dans une table. Le DQN remplace cette table par un réseau de neurones, capable d'estimer la valeur de situations jamais rencontrées. Il ajoute deux mécanismes de stabilité : la mémoire d'expériences rejouées et le réseau cible.

Comment DQN a-t-il appris à jouer aux jeux Atari ?

En 2015, DeepMind a publié dans Nature un DQN qui recevait uniquement les pixels de l'écran et le score. Avec la même architecture et les mêmes réglages pour les 49 jeux testés, il a atteint un niveau comparable à celui d'un testeur humain professionnel sur une grande partie d'entre eux.

Faut-il un GPU pour entraîner un DQN ?

Pas pour un cas métier comme celui-ci : l'observation tient en quelques nombres et le réseau est petit, un processeur standard suffit. Le GPU devient utile quand l'observation est une image, comme dans les jeux Atari.

LES ALGOS VOISINS

à comparer avant de choisir
la version tableau

Q-learning

Même principe, avec une table au lieu d'un réseau. À préférer quand les situations sont peu nombreuses.

Voir la fiche →
souvent plus stable

PPO

Apprend directement la stratégie et accepte les actions continues. Le choix par défaut de nombreuses équipes.

Voir la fiche →
la brique utilisée

Réseau de neurones (MLP)

Dans la plupart des cas métier, le réseau qui estime les valeurs Q est un simple perceptron multicouche.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →