TP noté

Auteur·rice

Joseph Salmon, Tanguy Lefort

Pour ce TP noté, vous devrez charger votre fichier sur Moodle, avant 18h, mercredi 26/04/2023.

Important

Pour ce travail vous devez déposer un unique fichier au format .py, structuré avec des cellules, dont le nom est examen_tp_HAX606X_Prenom_Nom.py. Vous remplirez votre nom, prénom de manière adéquate. Si le nom de fichier ne suit pas cette forme, vous perdez 1 pt.

De plus, les personnes qui n’auront pas soumis leur devoir sur Moodle avant la limite obtiendront comme note zéro. Ainsi, pensez à soumettre une version provisoire par sécurité à la fin de la séance ! (aucune exception ne sera faite)

La note totale est sur 20 points répartis comme suit :

Minimiser une fonction sous contraintes

Méthode de la descente de gradient projeté

La descente de gradient classique permet de minimiser une fonction convexe f: \mathbb{R}^d \to \mathbb{R}: x^\star \in \argmin_{x\in \mathbb{R}^d} f(x) \enspace.

Remarque: on note \in \argmin pour désigner une solution du problème d’optimisation, le minimiseur n’étant pas forcément unique.

Pour ce faire, l’étape de descente s’effectue à l’aide de l’équation de mise à jour x_{k+1} \gets x_{k} - \gamma \nabla f(x_k) \enspace,

\gamma>0 est le pas de descente.

Il est cependant fréquent de vouloir minimiser une fonction avec des contraintes. Ici, on représente les contraintes par un ensemble \mathcal{C} \subseteq \mathbb{R}^d, où \mathcal{C} est un ensemble fermé et convexe. Le problème d’optimisation contraint s’écrit alors: x^\star \in \argmin_{x\in \mathcal{C}} f(x) \enspace. \tag{1} Une stratégie naturelle est d’utiliser la descente de gradient projeté pour résoudre ce problème: x_{k+1} \gets \Pi_\mathcal{\mathcal{C}}\left(x_{k} - \gamma \nabla f(x_k)\right) \enspace, où la fonction \Pi_\mathcal{\mathcal{C}} est la projection sur l’ensemble \mathcal{C}.

Question 1 : Visualisation des contraintes et des lignes de niveaux

Cherchons à minimiser la fonction quadratique suivante sur \mathcal{C}=[0, 1]^2 (ici d=2) : f_{test}:x\mapsto \frac{1}{2}(x-x_0)^\top Q (x-x_0)\enspace, avec x_0=(1.5, 0)^\top et Q=\begin{pmatrix} 3 & 2 \\ 2 & 3\end{pmatrix} une matrice définie positive.

Écrire un code permettant de reproduire la Figure 1 ci-dessous. On pourra utiliser l’outils mpatches venant de matplotlib.patches pour délimiter la zone de contrainte (ou proposer une autre visualisation).

Figure 1: Fonction quadratique à minimiser et contraintes

Question 2 : Descente de gradient et descente de gradient projeté

Coder la descente de gradient classique (🇬🇧: gradient descent (GD)) avec un critère d’arrêt sur la norme du gradient courant. Prendre pour pas de descente \gamma=0.05 et tracer la trajectoire des itérés avec en point initial x_{init}=(0.2, 0.5)^\top. Faire de même pour la descente de gradient projeté et visualiser pour chaque méthode la trajectoire des itérés obtenue (on pourra s’inspirer de l’ex)

Figure 2: Trajectoires des itérés pour la descente de gradient et la descente de gradient projeté

Une autre méthode pour l’optimisation sous contrainte: la descente miroir

La descente de gradient projeté (🇬🇧: projected gradient descent, PGD) suit les itérés de la descente de gradient classique puis brutalement contraint sa trajectoire à rester dans la zone de contraintes. Essayons de mitiger ce comportement brutal de la descente de gradient projeté avec la descente miroir (🇬🇧: mirror descent, MD).

Tout d’abord, notons qu’une étape de descente de gradient projeté peut s’écrire: x_{k+1} \gets \argmin_{x\in\mathcal{C}} \langle \nabla f(x_k),x\rangle + \frac{1}{2\gamma}\| x-x_k\|^2_2\enspace. \tag{2} Cette formulation fait intervenir la norme \ell_2 (ou norme euclidienne standard) sur \mathbb{R}^d. Mais on peut généraliser cette formulation en prenant non plus la norme \ell_2 mais une divergence de Bregman: D_\Psi(x, y) = \Psi(x) - \Psi(y) - \langle \nabla \Psi(y), x-y\rangle\enspace, \tag{3} pour un \Psi: \mathcal{C} \to \mathbb{R} différentiable sur l’intérieur de \mathcal{C} .

La descente miroir est alors définie par: x_{k+1} \gets \argmin_{x\in\mathcal{C}} \langle \nabla f(x_k),x\rangle + \frac{1}{\gamma}D_\Psi(x, x_k)\enspace. \tag{4}

Cas particulier

En choisissant \Psi(x)=\frac{1}{2}\|x\|^2_2 dans l’équation Équation 4, on retrouve la descente de gradient projeté classique, telle que décrite dans l’équation Équation 2.

Dans la suite, on suppose de plus que la fonction dite “miroir” \phi = \nabla \Psi:\mathcal{C} \to \mathbb{R}^d est bijective de \mathcal{C} vers \phi(\mathcal{C})=\mathbb{R}^d, et on admet que l’on peut écrire la descente miroir sous la forme: x_{k+1}\gets \phi^{-1}\left(\phi(x_k) - \gamma \nabla f(x_k)\right) \enspace. \tag{5} On visualise l’algorithme avec la Figure 3 ci-dessous:

Figure 3: Schéma de la descente miroir

Question 3 : Entropie et divergence de Bregman (d=1)

Dans le cas d=1, et \mathcal{C}=[0,1] choisissons l’entropie binaire négative définie sur ]0,1[ par \Psi(x) = x\log(x) + (1-x)\log(1-x)\enspace. Tracer la fonction \Psi et mettre en valeur son minimum; sur des sous-graphiques juxtaposés, tracer la fonction miroir et son inverse (\phi et \phi^{-1}); on pourra s’inspirer Figure 4.

Note

La fonction \phi^{-1} obtenue ci-dessus est appelée fonction logistique et est très utilisée en statistique et en apprentissage automatique.

Figure 4: Visualisation de l’entropie et autres propriétés

Question 4 : Implémentation de la descente miroir (d=2)

Implémenter la descente miroir (Équation 5) avec le choix \Psi(x)=\Psi(x_1,x_2)=\sum_{i=1}^2 x_i\log(x_i) + (1-x_i)\log(1-x_i)\enspace. On utilisera un critère d’arrêt basé uniquement sur le nombre d’itérations pour le moment.

Tester la descente miroir sur la fonction quadratique f_{test} introduite précédemment (avec \gamma=1 par exemple) en comparant la trajectoire obtenue avec la descente de gradient projeté. Commenter le résultat obtenu.

Figure 5: Visualisation des itérés pour les trois méthodes (GD, PGD, MD).

Question 5 : Monitorer la convergence (d=2)

a) Saut de dualité

Dans cette question on va introduire le saut de dualité. C’est une fonction qui indique le niveau proximité d’un point pour le problème d’optimisation Équation 1. Ainsi, le saut de dualité tend vers zéro quand on l’évalue sur une suite de points qui converge vers la solution du problème d’optimisation Équation 1, .

Pour le définir, on introduit la fonction g:\mathbb{R^2} \to \mathbb{R} définie par \begin{align*} g: \mathbb{R^2} &\to \mathbb{R}\\ x & \mapsto \frac{1}{2} x^\top Q^{-1} x + x^\top x_0 \enspace, \end{align*} et \begin{align*} h: \mathbb{R^2} &\to \mathbb{R}\\ u & \mapsto h(u)=\sum_{i=1}^2 \max(0, u_i)\enspace, \end{align*} Enfin, en notant u(x)=Q(x-x_0), la fonction Gap est définie ainsi: \begin{align*} Gap: [0,1]^2 &\to \mathbb{R} \\ x & \mapsto f(x) + g(u(x)) + h(-u(x)) \enspace, \end{align*} et pour x\notin[0,1]^2, Gap(x)=+\infty.

Afficher Gap(x_n) pour les itérés (x_{n})_{n=1,...,50} des algorithmes de descente de gradient projeté (PGD) et de descente miroir (MD). On pourra pour cela une comparaison visuelle de la convergence des deux algorithmes en affichant l’évolution de Gap(x_n) en fonction de n et du choix du pas. Ici \gamma\in\{0.1, 0.2, 0.5, 0.1, 2, 5\}. Commenter les résultats obtenus.

Figure 6: Évolution du saut de dualité avec les itérés.

b) Stabilité des itérés

A partir de la liste des itérés, on peut monitorer la stabilité de la trajectoire des itérés. Un critère d’arrêt souvent utilisé en pratique est de s’arrêter à l’étape k>1 si: \|x_k - x_{k-1}\|_2\leq \epsilon \enspace.

Pour \gamma\in\{0.1, 0.5, 1\}, visualiser l’évolution de ce critère pour PGD et MD. Commenter le résulat obtenu (on pourra s’aider en regardant le contenu de la liste itérés obtenus).

Figure 7: Évolution de la stabilités des itérés.

Question 6 : Solution avec scipy?

Utiliser la fonction minimize de scipy pour minimiser f_{test} sur [0,1]^2. Comparer et commenter avec les résultats obtenus précédement.

Question 7 : Résolution théorique du problème

Prouvez mathétatiquement quel est le minimum global de f_{test} sur l’ensemble de contraintes \mathcal{C}=[0,1]^2.

Question 8 : Changeons l’espace de contraintes

Trouver avec scipy la solution obtenue pour le problème suivant \argmin_{\mathcal{X}=(x_1,x_2)\in\mathbb{R}^2} f_{test}(x) \text{ sc } \begin{cases} y-x &< 0 \\ x^2 + 3 y^2 &\geq 0 \end{cases} \enspace.

Optimisation non-convexe

Dans cette partie, nous utiliserons une variation de la fonction f définie par f(x, y) = 0.9\sin(x) \times 0.9\cos(y) + 0.1 (x^2 + y^2) - 0.5

Cette fonction n’est pas convexe, mais admet un minimum global !

Question 9 : Visualisation de la fonction

Visualiser la fonction en 3D ainsi que ses lignes de niveau.

Figure 8: Fonction et lignes de niveau.

Question 10 : Minima et points d’initialisation

Prendre 5 points uniformément au hasard avec un générateur du module np.random fixé avec une seed fixée à 1 dans le carré [-3, 3]^2 et éxécuter une descente de gradient sans contrainte avec un pas de \gamma=0.1, comparer les résultats obtenus. Commenter les minima obtenus et les problèmes rencontrés. Que faire en pratique quand on rencontre une fonction non convexe à minimiser (proposer deux solutions possibles en les commentant brièvement).

Figure 9: Initialization et convergence.