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 . 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.
Contrainte active ou inactive ?
Section intitulée « Contrainte active ou inactive ? »On écrit toujours un problème d’optimisation sous contraintes d’inégalité sous la forme standard :
En un point réalisable , une contrainte est active (ou saturée) si : on est sur le bord. Elle est inactive si : on a de la marge.
Reprenons l’entrepôt, avec la seule règle de la rocade : . Le coût est toujours , de minimum libre .
- Le barycentre ne respecte pas la contrainte (). 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 et un multiplicateur égal à 6.
- Si la règle était , le barycentre serait dans la zone. La contrainte serait inactive : on l’ignore, , et tout se passe comme si le multiplicateur valait 0.
Dans les deux cas, on peut écrire , avec dans le premier et dans le second. Et dans les deux cas, le produit est nul. C’est toute l’idée de KKT.
Le signe du multiplicateur
Section intitulée « Le signe du multiplicateur »Pour une égalité, le multiplicateur pouvait être de signe quelconque. Pour une inégalité, non. Écrivez la condition sous la forme : la direction de plus forte descente de doit pointer vers l’extérieur de la zone, du côté où augmente. Sinon, on pourrait encore descendre en restant dans la zone, et ne serait pas optimal. D’où la condition .
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 (), jamais attirer, et elle est nulle si la bille ne touche pas le mur.
Les conditions de Karush-Kuhn-Tucker
Section intitulée « Les conditions de Karush-Kuhn-Tucker »Considérons le problème général, avec des inégalités et des égalités :
Son lagrangien est . Si est un minimum local et que le problème est qualifié en (voir plus bas), alors il existe des multiplicateurs et tels que :
- Stationnarité : ;
- Réalisabilité primale : et ;
- Réalisabilité duale : (les sont libres) ;
- Complémentarité : pour tout .
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 méthode : énumérer les contraintes actives
Section intitulée « La méthode : énumérer les contraintes actives »La complémentarité donne une méthode de résolution systématique. Pour chaque inégalité, deux cas : ou . Avec inégalités, cela fait combinaisons. Pour chacune, on résout un système d’équations, puis on élimine les solutions qui violent une contrainte ou qui ont un négatif.
Vérifions la stationnarité au point trouvé : , et . Le gradient de l’objectif est bien équilibré par ceux des deux contraintes actives.
Qualification et suffisance
Section intitulée « Qualification et suffisance »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 ;
- 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 pour toutes les inégalités (et les égalités affines satisfaites).
Sans qualification, KKT peut échouer. Minimisez sous : le seul point réalisable est , donc c’est le minimum. Pourtant et : aucun ne vérifie . La contrainte est dégénérée (son gradient s’annule), et Slater échoue aussi puisqu’aucun ne vérifie .
Quand sont-elles suffisantes ?
Section intitulée « Quand sont-elles suffisantes ? »Si le problème est convexe (objectif convexe, inégalités convexes, égalités affines), tout point KKT est un minimum global. C’est le cas de l’entrepôt : est une somme de carrés, et les deux contraintes sont affines. Le point 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 en tous les points KKT (et en les éventuels points non qualifiés) et l’on garde la meilleure.
Pour aller plus loin : la dualité lagrangienne
Section intitulée « Pour aller plus loin : la dualité lagrangienne »Le lagrangien permet de généraliser la dualité du chapitre 4 à tout problème d’optimisation. On définit la fonction duale , puis le problème dual . La dualité faible est toujours vraie ( 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.
En résumé
Section intitulée « En résumé »- On écrit les inégalités sous la forme standard , dans un problème de minimisation.
- Les conditions KKT : stationnarité du lagrangien, réalisabilité, et complémentarité .
- 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 ( 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.
Exercices
Section intitulée « Exercices »Exercice · Active ou pas ?
facileRésolvez avec KKT sous , puis sous . Interprétez le multiplicateur.
Voir la solution
Forme standard : . Stationnarité : .
- Cas : , qui viole . Rejeté.
- Cas contrainte active : , d’où . Accepté.
Le minimum est en avec . Le problème est convexe, c’est le minimum global. Interprétation : avec la contrainte (pour ), la valeur optimale vaut , de dérivée en ; relâcher la contrainte d’une unité fait gagner environ 4.
Sous : le cas donne , réalisable (). La contrainte est inactive, , 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, μ = 4print(resoudre(5)) # (3.0, 0.0, 0.0) : contrainte inactive, μ = 0# Sensibilité : relâcher la contrainte de 0,01 fait gagner environ 4 × 0,01print(round((resoudre(1)[1] - resoudre(1.01)[1]) / 0.01, 4)) # 3.99resoudre <- function(b) { # min (x - 3)² sous x <= b res <- optimize(function(x) (x - 3)^2, c(-10, b), tol = 1e-10) x <- res$minimum c(x = x, valeur = res$objective, mu = -2 * (x - 3)) # μ par la stationnarité}round(resoudre(1), 4) # x = 1, valeur 4, μ = 4 : contrainte activeround(resoudre(5), 4) # x = 3, valeur 0, μ = 0 : contrainte inactive(resoudre(1)["valeur"] - resoudre(1.01)["valeur"]) / 0.01 # 3.99 : environ μExercice · Optimiser une fonction linéaire sur un disque
moyenSoit . Résolvez sous (avec ). Déduisez-en le maximum de sur le même disque.
Voir la solution
Forme standard : , de gradient . Stationnarité : .
- Cas : il faudrait , impossible. Rejeté.
- Cas actif : et . En prenant la norme, , soit . D’où .
La valeur optimale est . 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 : même calcul avec , d’où et un maximum égal à . Géométriquement, on va dans la direction de (ou son opposée) jusqu’au bord du disque.
En code
import numpy as npfrom scipy.optimize import minimize
a = np.array([3.0, 4.0])disque = [{"type": "ineq", "fun": lambda x: 1 - x @ x}] # 1 - ||x||² >= 0res_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.0print(res_max.x.round(4), round(-res_max.fun, 4)) # [0.6 0.8] 5.0print(-a / (2 * res_min.x)) # [2.5 2.5] : μ = 2,5 >= 0a <- c(3, 4)# La contrainte est active : on parcourt le cercle x = (cos t, sin t)valeur <- function(t) a[1] * cos(t) + a[2] * sin(t)mini <- optimize(valeur, c(0, 2 * pi))maxi <- optimize(valeur, c(0, 2 * pi), maximum = TRUE)x_min <- c(cos(mini$minimum), sin(mini$minimum))round(x_min, 4); round(mini$objective, 4) # -0.6 -0.8 ; -5round(c(cos(maxi$maximum), sin(maxi$maximum)), 4); round(maxi$objective, 4) # 0.6 0.8 ; 5round(-a / (2 * x_min), 4) # 2.5 2.5 : μ = 2,5 >= 0Exercice · Un problème mixte
difficileRésolvez sous l’égalité et l’inégalité . Donnez les multiplicateurs et vérifiez toutes les conditions KKT.
Voir la solution
Forme standard : et . Le lagrangien est , et la stationnarité s’écrit :
Cas : , soit . Avec : , . Mais viole l’inégalité. Rejeté.
Cas actif () : avec , on obtient . La stationnarité donne et , d’où .
Vérification : réalisabilité ( et ), , complémentarité (), libre. Le problème est convexe (objectif quadratique convexe, contraintes affines) : est le minimum global, de valeur . Géométriquement, c’est le point du segment de droite , dans la zone , le plus proche de .
En code
import numpy as npfrom scipy.optimize import minimize
cout = lambda v: (v[0] - 2) ** 2 + (v[1] - 1) ** 2contraintes = [{"type": "eq", "fun": lambda v: v[0] + v[1] - 2}, # x + y = 2 {"type": "ineq", "fun": lambda v: v[1] - v[0]}] # y - x >= 0res = minimize(cout, x0=[0.0, 0.0], method="SLSQP", constraints=contraintes)x, y = res.xprint(res.x.round(4), round(res.fun, 4)) # [1. 1.] 1.0
# Stationnarité : 2(x - 2) + λ + μ = 0 et 2(y - 1) + λ - μ = 0lam, 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# On élimine l'égalité (y = 2 - x) ; y >= x devient x <= 1cout <- function(x) (x - 2)^2 + (2 - x - 1)^2res <- optimize(cout, c(-10, 1), tol = 1e-10)x <- res$minimum; y <- 2 - xround(c(x, y, res$objective), 4) # 1 1 1
# Stationnarité : 2(x - 2) + λ + μ = 0 et 2(y - 1) + λ - μ = 0mult <- solve(rbind(c(1, 1), c(1, -1)), c(-2 * (x - 2), -2 * (y - 1)))round(mult, 4) # 1 1 : λ = 1, μ = 1 >= 0