Aller au contenu

Maîtrisez les conditions KKT

La mairie a révisé son règlement : l’entrepôt n’a plus besoin d’être sur la rocade, il doit simplement se trouver à l’extérieur, côté sud-ouest. Et une seconde règle s’ajoute : pas de construction à l’ouest de la Vilaine, qui coule le long de la droite x=1,5x = 1{,}5. Ce ne sont plus des égalités, mais des inégalités : l’entrepôt peut être n’importe où dans une zone.

Face à une inégalité, une question nouvelle se pose : la contrainte gêne-t-elle vraiment ? Si le meilleur point de la zone est à l’intérieur, la contrainte ne sert à rien ; s’il est sur le bord, elle se comporte comme une égalité. Les conditions de Karush-Kuhn-Tucker (KKT) traitent les deux situations d’un seul coup. Ce sont les conditions d’optimalité les plus générales de ce cours, et celles qu’on retrouve derrière les SVM.

On écrit toujours un problème d’optimisation sous contraintes d’inégalité sous la forme standard :

min⁡x  f(x)s.c.gi(x)≤0,i=1,…,m\min_x \; f(x) \quad \text{s.c.} \quad g_i(x) \leq 0, \quad i = 1, \dots, m

En un point réalisable xx, une contrainte est active (ou saturée) si gi(x)=0g_i(x) = 0 : on est sur le bord. Elle est inactive si gi(x)<0g_i(x) \lt 0 : on a de la marge.

Reprenons l’entrepôt, avec la seule règle de la rocade : g(p)=x+y−2≤0g(p) = x + y - 2 \leq 0. Le coût est toujours f(p)=3∥p−G∥2+32f(p) = 3\lVert p - G \rVert^2 + 32, de minimum libre G=(2,2)G = (2, 2).

  • Le barycentre ne respecte pas la contrainte (2+2=4>22 + 2 = 4 \gt 2). Le meilleur point de la zone est donc sur le bord : la contrainte est active, et l’on retrouve exactement le problème du chapitre 8, avec p∗=(1,1)p^* = (1, 1) et un multiplicateur égal à 6.
  • Si la règle était x+y≤5x + y \leq 5, le barycentre serait dans la zone. La contrainte serait inactive : on l’ignore, p∗=Gp^* = G, et tout se passe comme si le multiplicateur valait 0.

Dans les deux cas, on peut écrire ∇f(p∗)+μ∇g(p∗)=0\nabla f(p^*) + \mu \nabla g(p^*) = 0, avec μ=6\mu = 6 dans le premier et μ=0\mu = 0 dans le second. Et dans les deux cas, le produit μ g(p∗)\mu \, g(p^*) est nul. C’est toute l’idée de KKT.

Pour une égalité, le multiplicateur pouvait être de signe quelconque. Pour une inégalité, non. Écrivez la condition sous la forme −∇f(p∗)=μ∇g(p∗)-\nabla f(p^*) = \mu \nabla g(p^*) : la direction de plus forte descente de ff doit pointer vers l’extérieur de la zone, du côté où gg augmente. Sinon, on pourrait encore descendre en restant dans la zone, et p∗p^* ne serait pas optimal. D’où la condition μ≥0\mu \geq 0.

Imaginez une bille qui roule vers le fond d’une cuvette et vient buter contre un mur. À l’arrêt, la pente la pousse contre le mur, et le mur la repousse avec une force de même intensité. Le multiplicateur mesure cette force de réaction : elle ne peut que repousser (μ≥0\mu \geq 0), jamais attirer, et elle est nulle si la bille ne touche pas le mur.

024x−101234y−∇f = μ ∇g : la pentepousse contre le murréaction du mur :−μ ∇g, μ = 6p* = (1, 1)x + y ≤ 2 : active024x−101234p* = G = (2, 2)μ = 0 : le murne touche pasx + y ≤ 5 : inactive
Contrainte active : la bille bute contre le mur, qui la repousse avec une force μ = 6. Contrainte inactive : le fond de la cuvette est dans la zone, le mur ne sert à rien et μ = 0.

Considérons le problème général, avec des inégalités et des égalités :

min⁡x  f(x)s.c.gi(x)≤0  (i=1,…,m),hj(x)=0  (j=1,…,q)\min_x \; f(x) \quad \text{s.c.} \quad g_i(x) \leq 0 \; (i = 1, \dots, m), \qquad h_j(x) = 0 \; (j = 1, \dots, q)

Son lagrangien est L(x,μ,λ)=f(x)+∑iμigi(x)+∑jλjhj(x)L(x, \mu, \lambda) = f(x) + \sum_i \mu_i g_i(x) + \sum_j \lambda_j h_j(x). Si x∗x^* est un minimum local et que le problème est qualifié en x∗x^* (voir plus bas), alors il existe des multiplicateurs μi\mu_i et λj\lambda_j tels que :

  1. Stationnarité : ∇f(x∗)+∑iμi∇gi(x∗)+∑jλj∇hj(x∗)=0\nabla f(x^*) + \sum_i \mu_i \nabla g_i(x^*) + \sum_j \lambda_j \nabla h_j(x^*) = 0 ;
  2. Réalisabilité primale : gi(x∗)≤0g_i(x^*) \leq 0 et hj(x∗)=0h_j(x^*) = 0 ;
  3. Réalisabilité duale : μi≥0\mu_i \geq 0 (les λj\lambda_j sont libres) ;
  4. Complémentarité : μi gi(x∗)=0\mu_i \, g_i(x^*) = 0 pour tout ii.

La complémentarité dit que, pour chaque inégalité, soit la contrainte est active, soit son multiplicateur est nul (ou les deux). Vous l’aviez déjà rencontrée : ce sont les écarts complémentaires du chapitre 4, où une ressource non épuisée avait un prix nul.

La complémentarité donne une méthode de résolution systématique. Pour chaque inégalité, deux cas : μi=0\mu_i = 0 ou gi(x)=0g_i(x) = 0. Avec mm inégalités, cela fait 2m2^m combinaisons. Pour chacune, on résout un système d’équations, puis on élimine les solutions qui violent une contrainte ou qui ont un μi\mu_i négatif.

−101234x (km)−101234y (km)g₁ : x + y ≤ 2(rocade)g₂ : x ≥ 1,5(Vilaine)aucune active :viole g₁g₁ seule :viole g₂g₂ seule : μ₂ = −3les deux actives : (1,5 ; 0,5)μ₁ = 9, μ₂ = 6, f = 39,5zone autorisée
Les quatre cas de l'énumération sur la carte : trois candidats sont rejetés (hors zone ou multiplicateur négatif), seul le coin (1,5 ; 0,5) vérifie toutes les conditions. Le cercle de niveau 39,5 y touche la zone.

Vérifions la stationnarité au point trouvé : ∇f(p∗)=6 (p∗−G)=(−3,−9)\nabla f(p^*) = 6\,(p^* - G) = (-3, -9), et (−3,−9)+9 (1,1)+6 (−1,0)=(0,0)(-3, -9) + 9\,(1, 1) + 6\,(-1, 0) = (0, 0). Le gradient de l’objectif est bien équilibré par ceux des deux contraintes actives.

01234x012y9 × ∇g₁ = (9, 9)6 × ∇g₂ = (−6, 0)−∇f(p*) = (3, 9)p* = (1,5 ; 0,5)
La stationnarité au coin, dessinée : −∇f(p*) = (3, 9) est la somme de 9 × ∇g₁ et 6 × ∇g₂, avec des coefficients positifs.

Quand les conditions KKT sont-elles nécessaires ?

Section intitulée « Quand les conditions KKT sont-elles nécessaires ? »

Comme pour Lagrange, les conditions KKT ne sont garanties qu’en un point qualifié. Les critères les plus utilisés :

  • Indépendance linéaire (LICQ) : les gradients des contraintes actives (inégalités actives et égalités) sont linéairement indépendants en x∗x^* ;
  • Contraintes affines : si toutes les contraintes sont affines, le problème est automatiquement qualifié ;
  • Condition de Slater, pour un problème convexe : il existe un point strictement réalisable, c’est-à-dire avec gi(x)<0g_i(x) \lt 0 pour toutes les inégalités (et les égalités affines satisfaites).

Sans qualification, KKT peut échouer. Minimisez f(x)=xf(x) = x sous g(x)=x2≤0g(x) = x^2 \leq 0 : le seul point réalisable est x=0x = 0, donc c’est le minimum. Pourtant f′(0)=1f'(0) = 1 et g′(0)=0g'(0) = 0 : aucun μ\mu ne vérifie 1+μ×0=01 + \mu \times 0 = 0. La contrainte est dégénérée (son gradient s’annule), et Slater échoue aussi puisqu’aucun xx ne vérifie x2<0x^2 \lt 0.

Si le problème est convexe (objectif ff convexe, inégalités gig_i convexes, égalités hjh_j affines), tout point KKT est un minimum global. C’est le cas de l’entrepôt : ff est une somme de carrés, et les deux contraintes sont affines. Le point (1,5;0,5)(1{,}5 ; 0{,}5) est donc bien le meilleur emplacement possible.

Sans convexité, un point KKT n’est qu’un candidat. On conclut comme au chapitre 8 : si l’ensemble réalisable est compact, on compare les valeurs de ff en tous les points KKT (et en les éventuels points non qualifiés) et l’on garde la meilleure.

Le lagrangien permet de généraliser la dualité du chapitre 4 à tout problème d’optimisation. On définit la fonction duale q(μ,λ)=min⁡xL(x,μ,λ)q(\mu, \lambda) = \min_x L(x, \mu, \lambda), puis le problème dual max⁡μ≥0,λq(μ,λ)\max_{\mu \geq 0, \lambda} q(\mu, \lambda). La dualité faible est toujours vraie (q≤q \leq la valeur optimale du primal), et pour un problème convexe qui vérifie Slater, la dualité forte aussi. Appliquée à un programme linéaire, cette construction redonne exactement le dual du chapitre 4. Appliquée aux SVM, elle donne le problème dual qui fait apparaître les vecteurs de support et l’astuce du noyau : vous le verrez au chapitre suivant.

  • On écrit les inégalités sous la forme standard gi(x)≤0g_i(x) \leq 0, dans un problème de minimisation.
  • Les conditions KKT : stationnarité du lagrangien, réalisabilité, μi≥0\mu_i \geq 0 et complémentarité μigi(x∗)=0\mu_i g_i(x^*) = 0.
  • Une contrainte inactive a un multiplicateur nul ; une contrainte active se comporte comme une égalité, avec un multiplicateur positif.
  • On résout en énumérant les ensembles de contraintes actives (2m2^m cas) et en éliminant les candidats non réalisables ou à multiplicateur négatif.
  • Les conditions sont nécessaires sous qualification (indépendance linéaire, contraintes affines ou Slater) et suffisantes si le problème est convexe.
  • Le multiplicateur mesure le coût marginal de la contrainte, comme un prix dual.

Exercice · Active ou pas ?

facile

Résolvez avec KKT min⁡(x−3)2\min (x - 3)^2 sous x≤1x \leq 1, puis sous x≤5x \leq 5. Interprétez le multiplicateur.

Voir la solution

Forme standard : g(x)=x−1≤0g(x) = x - 1 \leq 0. Stationnarité : 2(x−3)+μ=02(x - 3) + \mu = 0.

  • Cas μ=0\mu = 0 : x=3x = 3, qui viole x≤1x \leq 1. Rejeté.
  • Cas contrainte active : x=1x = 1, d’où μ=−2(1−3)=4≥0\mu = -2(1 - 3) = 4 \geq 0. Accepté.

Le minimum est en x=1x = 1 avec μ=4\mu = 4. Le problème est convexe, c’est le minimum global. Interprétation : avec la contrainte x≤bx \leq b (pour b<3b \lt 3), la valeur optimale vaut (b−3)2(b - 3)^2, de dérivée 2(b−3)=−42(b - 3) = -4 en b=1b = 1 ; relâcher la contrainte d’une unité fait gagner environ 4.

Sous x≤5x \leq 5 : le cas μ=0\mu = 0 donne x=3x = 3, réalisable (3≤53 \leq 5). La contrainte est inactive, μ=0\mu = 0, et le minimum est le minimum libre.

En code

from scipy.optimize import minimize
def resoudre(b): # min (x - 3)² sous x <= b
res = minimize(lambda v: (v[0] - 3) ** 2, x0=[0.0], method="SLSQP",
constraints=[{"type": "ineq", "fun": lambda v: b - v[0]}]) # b - x >= 0
x = float(res.x[0])
mu = -2 * (x - 3) # tiré de la stationnarité 2(x - 3) + μ = 0
return round(x, 4), round(float(res.fun), 4), round(mu, 4)
print(resoudre(1)) # (1.0, 4.0, 4.0) : contrainte active, μ = 4
print(resoudre(5)) # (3.0, 0.0, 0.0) : contrainte inactive, μ = 0
# Sensibilité : relâcher la contrainte de 0,01 fait gagner environ 4 × 0,01
print(round((resoudre(1)[1] - resoudre(1.01)[1]) / 0.01, 4)) # 3.99

Exercice · Optimiser une fonction linéaire sur un disque

moyen

Soit a=(3,4)a = (3, 4). Résolvez min⁡aTx\min a^T x sous ∥x∥2≤1\lVert x \rVert^2 \leq 1 (avec x∈R2x \in \mathbb{R}^2). Déduisez-en le maximum de aTxa^T x sur le même disque.

Voir la solution

Forme standard : g(x)=∥x∥2−1≤0g(x) = \lVert x \rVert^2 - 1 \leq 0, de gradient 2x2x. Stationnarité : a+2μx=0a + 2\mu x = 0.

  • Cas μ=0\mu = 0 : il faudrait a=0a = 0, impossible. Rejeté.
  • Cas actif : ∥x∥=1\lVert x \rVert = 1 et x=−a/(2μ)x = -a / (2\mu). En prenant la norme, ∥a∥/(2μ)=1\lVert a \rVert / (2\mu) = 1, soit μ=∥a∥/2=2,5≥0\mu = \lVert a \rVert / 2 = 2{,}5 \geq 0. D’où x∗=−a/∥a∥=(−0,6;−0,8)x^* = -a / \lVert a \rVert = (-0{,}6 ; -0{,}8).

La valeur optimale est aTx∗=−∥a∥=−5a^T x^* = -\lVert a \rVert = -5. Le problème est convexe (objectif linéaire, contrainte convexe) et vérifie Slater (l’origine est strictement réalisable) : c’est le minimum global.

Pour le maximum, on minimise −aTx-a^T x : même calcul avec −a-a, d’où x=a/∥a∥=(0,6;0,8)x = a / \lVert a \rVert = (0{,}6 ; 0{,}8) et un maximum égal à ∥a∥=5\lVert a \rVert = 5. Géométriquement, on va dans la direction de aa (ou son opposée) jusqu’au bord du disque.

En code

import numpy as np
from scipy.optimize import minimize
a = np.array([3.0, 4.0])
disque = [{"type": "ineq", "fun": lambda x: 1 - x @ x}] # 1 - ||x||² >= 0
res_min = minimize(lambda x: a @ x, x0=[0.0, 0.0], method="SLSQP", constraints=disque)
res_max = minimize(lambda x: -a @ x, x0=[0.0, 0.0], method="SLSQP", constraints=disque)
print(res_min.x.round(4), round(res_min.fun, 4)) # [-0.6 -0.8] -5.0
print(res_max.x.round(4), round(-res_max.fun, 4)) # [0.6 0.8] 5.0
print(-a / (2 * res_min.x)) # [2.5 2.5] : μ = 2,5 >= 0

Exercice · Un problème mixte

difficile

Résolvez min⁡(x−2)2+(y−1)2\min (x - 2)^2 + (y - 1)^2 sous l’égalité x+y=2x + y = 2 et l’inégalité y≥xy \geq x. Donnez les multiplicateurs et vérifiez toutes les conditions KKT.

Voir la solution

Forme standard : h(x,y)=x+y−2=0h(x, y) = x + y - 2 = 0 et g(x,y)=x−y≤0g(x, y) = x - y \leq 0. Le lagrangien est L=(x−2)2+(y−1)2+λ(x+y−2)+μ(x−y)L = (x - 2)^2 + (y - 1)^2 + \lambda(x + y - 2) + \mu(x - y), et la stationnarité s’écrit :

2(x−2)+λ+μ=0,2(y−1)+λ−μ=02(x - 2) + \lambda + \mu = 0, \qquad 2(y - 1) + \lambda - \mu = 0

Cas μ=0\mu = 0 : x−2=y−1x - 2 = y - 1, soit x=y+1x = y + 1. Avec x+y=2x + y = 2 : y=0,5y = 0{,}5, x=1,5x = 1{,}5. Mais x−y=1>0x - y = 1 \gt 0 viole l’inégalité. Rejeté.

Cas actif (x=yx = y) : avec x+y=2x + y = 2, on obtient (1,1)(1, 1). La stationnarité donne −2+λ+μ=0-2 + \lambda + \mu = 0 et λ−μ=0\lambda - \mu = 0, d’où λ=μ=1\lambda = \mu = 1.

Vérification : réalisabilité (1+1=21 + 1 = 2 et 1−1=0≤01 - 1 = 0 \leq 0), μ=1≥0\mu = 1 \geq 0, complémentarité (μ×0=0\mu \times 0 = 0), λ\lambda libre. Le problème est convexe (objectif quadratique convexe, contraintes affines) : (1,1)(1, 1) est le minimum global, de valeur 1+0=11 + 0 = 1. Géométriquement, c’est le point du segment de droite x+y=2x + y = 2, dans la zone y≥xy \geq x, le plus proche de (2,1)(2, 1).

En code

import numpy as np
from scipy.optimize import minimize
cout = lambda v: (v[0] - 2) ** 2 + (v[1] - 1) ** 2
contraintes = [{"type": "eq", "fun": lambda v: v[0] + v[1] - 2}, # x + y = 2
{"type": "ineq", "fun": lambda v: v[1] - v[0]}] # y - x >= 0
res = minimize(cout, x0=[0.0, 0.0], method="SLSQP", constraints=contraintes)
x, y = res.x
print(res.x.round(4), round(res.fun, 4)) # [1. 1.] 1.0
# Stationnarité : 2(x - 2) + λ + μ = 0 et 2(y - 1) + λ - μ = 0
lam, mu = np.linalg.solve([[1, 1], [1, -1]], [-2 * (x - 2), -2 * (y - 1)])
print(round(lam, 4), round(mu, 4)) # 1.0 1.0 : μ >= 0, et g = x - y = 0