Optimalité sous contraintes et certificats duaux
Sur la frontière imposée par une contrainte, un optimum peut avoir un gradient non nul. Pour prouver son optimalité, on peut établir une borne inférieure valable pour tous les points admissibles, puis montrer qu’un candidat l’atteint. Les multiplicateurs de Lagrange qui produisent cette borne constituent un certificat dual. Cet argument et les conditions d’optimalité sont développés au chapitre 5 de Boyd et Vandenberghe.
La vue d’ensemble de l’optimisation convexe présente les liens entre convexité et KKT ; la note sur le gradient et l’optimisation multidimensionnelle explique le gradient et la hessienne. Pour choisir les variables, l’objectif et l’ensemble admissible, voir la modélisation d’un problème d’optimisation. Ces notions se rejoignent ici dans un calcul complet.
Objectif et ensemble admissible
Pour deux variables réelles , le problème primal est
L’ensemble admissible est un triangle fermé. L’objectif est la moitié du carré de la distance au point . Comme est non vide et compact et que l’objectif est continu, le minimum est atteint. La hessienne est la matrice identité : l’objectif est strictement convexe et le minimiseur est unique.
On retrouve la forme de l’exemple de programme quadratique de CVXPY : , avec et positive semi-définie. Ici, , , , et
La constante ne change pas le minimiseur. Il faut la conserver pour obtenir les valeurs de et définies ici ; la soustraire des deux laisse l’écart primal–dual inchangé.
Calculer un candidat
Le minimum sans contraintes, , viole . Essayons la frontière , en remplaçant par :
Sur ce côté du triangle, le minimum est donc
Les deux coordonnées sont positives : le candidat appartient bien à ce côté. Minimiser sur un seul côté ne suffit toutefois pas à exclure de meilleurs points ailleurs dans le triangle. La borne duale donnera la preuve globale.
Une contrainte est active en un point lorsqu’elle est satisfaite avec égalité. Ici, , tandis que et : seule la contrainte sur la somme est active. Le gradient de l’objectif vaut . Suivre le gradient négatif augmenterait et ferait sortir de l’ensemble admissible.
Lagrangien et borne duale
Avec la convention , associons aux trois contraintes les multiplicateurs non négatifs . Selon Boyd et Vandenberghe, §§5.1.1–5.1.3, le lagrangien est
Pour des multiplicateurs fixés, la fonction duale est l’infimum de sur le domaine des variables :
Cet infimum porte sur tout . Les trois inégalités figurent déjà dans ; restreindre ce calcul au triangle changerait la fonction duale.
La hessienne de par rapport à reste . Annuler ses dérivées partielles donne donc son unique minimum global :
soit et . En complétant les carrés, on obtient
Le problème dual maximise sous . Ici, est finie pour tous les multiplicateurs finis. Pour tout point admissible et tous multiplicateurs non négatifs,
La seconde inégalité tient au fait que chaque terme ajouté multiplie un multiplicateur non négatif par une valeur de contrainte non positive. Notons la valeur optimale primale et la valeur optimale duale. Alors : c’est la dualité faible. Cet argument ne suppose pas la convexité.
Calculer les multiplicateurs et vérifier les quatre conditions KKT
La complémentarité impose que chaque multiplicateur multiplié par la valeur de sa contrainte soit nul. Comme , on a . Les équations de stationnarité donnent alors
Voici les quatre conditions KKT du §5.5.3 du manuel, vérifiées une à une :
Pour obtenir une borne duale finie, il faut aussi que . C’est automatique dans ce programme quadratique, mais les signes des multiplicateurs ne suffisent pas à le garantir pour un problème général.
Un multiplicateur positif impose que la contrainte correspondante soit active ; une contrainte inactive impose un multiplicateur nul. Une contrainte active peut néanmoins avoir un multiplicateur nul. Si l’on remplace la borne par , le minimum sans contraintes se trouve sur , avec tous les multiplicateurs nuls.
Pour un problème convexe différentiable, dont l’objectif et les fonctions d’inégalité sont convexes et les égalités affines, les conditions KKT suffisent à certifier l’optimalité globale. Ici, le certificat donne aussi une égalité numérique :
L’objectif de tout point admissible vaut au moins , et le candidat atteint cette borne. Ainsi, . Les carrés donnent directement la même conclusion :
L’égalité n’est possible qu’en . Cela prouve l’optimalité et l’unicité sans parcourir tous les points admissibles.
Borner l’erreur d’un candidat avec l’écart primal–dual
Pour un point primal admissible et des multiplicateurs duaux admissibles, l’écart primal–dual vaut . Il majore l’écart entre la valeur du candidat et la valeur optimale :
Chaque ligne ci-dessous associe un point primal et des multiplicateurs duaux admissibles. Dans les deux premières, les multiplicateurs ne sont pas optimaux.
La deuxième ligne donne et une erreur d’au plus . L’erreur réelle du candidat vaut . Un écart positif pour un couple de candidats n’établit pas un écart positif entre les valeurs optimales : ici, l’écart de dualité optimal est nul.
Ce que garantissent la régularité et la convexité
Un optimum convexe peut ne pas avoir de multiplicateurs KKT
La condition de Slater, §5.2.3, demande qu’un problème convexe possède un point dans l’intérieur relatif de son domaine commun, satisfaisant les égalités et toutes les inégalités strictement. Elle garantit la dualité forte et, si la valeur optimale est finie, l’existence de multiplicateurs finis atteignant l’optimum dual. Avec la différentiabilité, KKT devient nécessaire et suffisant pour l’optimalité. La version affinée du manuel permet aux inégalités affines de ne pas être strictes.
Dans notre programme quadratique, satisfait strictement les trois inégalités : Slater est vérifiée. Elle garantit l’existence d’un certificat optimal. En revanche, la suffisance d’un certificat KKT déjà établi pour un problème convexe ne demande pas Slater.
Considérons un autre problème convexe :
Le seul point admissible est , et . Aucun point ne satisfait : Slater échoue. L’équation de stationnarité de est . Aucun multiplicateur fini ne peut la satisfaire en .
Pour , le minimum de se situe en , d’où ; pour , . Ainsi, , mais aucun multiplicateur fini n’atteint ce supremum. Dans cet exemple, l’existence des multiplicateurs et la nécessité de KKT échouent ; la dualité forte reste valable.
Un point KKT non convexe peut être un maximum
Considérons
L’ensemble admissible est , mais l’objectif n’est pas convexe. En , avec les deux multiplicateurs nuls, l’admissibilité primale, la non-négativité des multiplicateurs, la stationnarité et la complémentarité sont toutes vérifiées. Pourtant, et : ce point KKT est le maximum strict sur l’ensemble admissible.
Le point stationnaire de n’est pas un minimum global ; . En fait, des multiplicateurs finis ne font qu’ajouter des termes affines, sans changer la courbure négative du terme quadratique. Ici, . La dualité faible reste valable, mais ne fournit aucune borne inférieure finie. Bien que satisfasse strictement les deux contraintes, le théorème de Slater pour les problèmes convexes ne s’applique pas à cet objectif non convexe.
Refaire les calculs avec Python
Ce programme utilise uniquement l’arithmétique rationnelle de la bibliothèque standard de Python. Il vérifie le point et les multiplicateurs calculés, puis recalcule les écarts et les contre-exemples. L’infimum global nécessaire au certificat découle de la mise sous forme de carrés obtenue plus haut.
from fractions import Fraction as F
def objective(x, y):
return F(1, 2) * ((x - 2)**2 + (y - 1)**2)
def dual(lam, mu, nu):
return lam - 2*mu - nu - F(1, 2)*((lam-mu)**2 + (lam-nu)**2)
def vector(values):
return '(' + ', '.join(map(str, values)) + ')'
x, y = F(3, 2), F(1, 2)
lam, mu, nu = F(1, 2), F(0), F(0)
constraints = (x+y-2, -x, -y)
multipliers = (lam, mu, nu)
stationarity = (x-2+lam-mu, y-1+lam-nu)
kkt = (
all(c <= 0 for c in constraints),
all(m >= 0 for m in multipliers),
all(s == 0 for s in stationarity),
all(m*c == 0 for m, c in zip(multipliers, constraints)),
)
assert all(kkt)
print('x=' + vector((x, y)) + ', multipliers=' + vector(multipliers))
print('constraints=' + vector(constraints))
print('stationarity=' + vector(stationarity))
print('KKT=' + vector(kkt))
for label, a, b, l in [('candidate', F(1), F(1), F(1, 4)),
('optimum', x, y, lam)]:
p, d = objective(a, b), dual(l, F(0), F(0))
print(f'{label}: f={p}, g={d}, gap={p-d}')
for l in (F(1), F(10), F(100)):
z = -1/(2*l)
g = z + l*z*z
assert g == -1/(4*l)
print(f'degenerate: lambda={l}, x_min_L={z}, g={g}')
z = F(0)
nonconvex_constraints = (z-1, -z-1)
nonconvex_multipliers = (F(0), F(0))
nonconvex_kkt = (
all(c <= 0 for c in nonconvex_constraints),
all(m >= 0 for m in nonconvex_multipliers),
-2*z + nonconvex_multipliers[0] - nonconvex_multipliers[1] == 0,
all(m*c == 0 for m, c in zip(nonconvex_multipliers, nonconvex_constraints)),
)
print('nonconvex: KKT=' + vector(nonconvex_kkt)
+ f', f(0)={-z*z}, f(-1)=f(1)={-F(1)**2}')
Sortie obtenue :
x=(3/2, 1/2), multipliers=(1/2, 0, 0)
constraints=(0, -3/2, -1/2)
stationarity=(0, 0)
KKT=(True, True, True, True)
candidate: f=1/2, g=3/16, gap=5/16
optimum: f=1/4, g=1/4, gap=0
degenerate: lambda=1, x_min_L=-1/2, g=-1/4
degenerate: lambda=10, x_min_L=-1/20, g=-1/40
degenerate: lambda=100, x_min_L=-1/200, g=-1/400
nonconvex: KKT=(True, True, True, True), f(0)=0, f(-1)=f(1)=-1
Pour des programmes quadratiques plus grands, l’exemple CVXPY lit les multiplicateurs avec l’attribut dual_value d’un objet contrainte. Il faut conserver le même ordre des contraintes et la même convention de signe, puis vérifier l’admissibilité, les résidus de stationnarité, les produits de complémentarité et la borne donnée par la fonction duale effectivement calculée. Un petit résidu de stationnarité ne suffit pas à exclure le maximum non convexe ci-dessus.