Dans cette section, il y a des exercices supplĂ©mentaires pour vous entraĂźner. Ils suivent le mĂȘme classement de difficultĂ© que prĂ©cĂ©demment.
Considérons la fonction suivante \(f(a) = 3a^3 - 2a^2 + a\) avec \(a = 2.0\).
Consigne : Utiliser les deux approches suivantes pour calculer le gradient de cette fonction par rapport Ă \(a\) :
1) Calculez à la main la dérivée de \(f\) par rapport à \(a\). Puis évaluez ce gradient pour \(a = 2.0\).
2) Faites l'implĂ©mentation de la mĂȘme fonction avec PyTorch, calculez et Ă©valuez son gradient.
3) Comparez le résultat obtenu par PyTorch avec le calcul manuel.
Astuce :
La dĂ©rivĂ©e de \(f(a)\) par rapport Ă \(a\) est Ă©gale Ă \(9aÂČ - 4a + 1\)
Résultat attendu :
Le gradient est égal à 29 dans les deux cas.
Considérons la fonction suivante \(f(a, b) = a \cdot b + a^2\) avec \(a = 2.0\) et \(b = 3.0\).
Consigne : Utiliser les deux approches suivantes pour calculer les dérivées partielles de cette fonction par rapport à \(a\) et \(b\) :
1) Calculez à la main la dérivée partielle de \(f\) par rapport à \(a\) et par rapport à \(b\). Puis évaluez ces dérivées pour \(a = 2.0\) et \(b = 3.0\).
2) Faites l'implĂ©mentation de la mĂȘme fonction avec PyTorch, calculez et Ă©valuez le gradient de cette fonction.
3) Comparez le résultat obtenu par PyTorch avec le calcul manuel.
Astuce :
Résultat attendu :
Les dĂ©rivĂ©es partielles sont, dans les deux cas, Ă©gales Ă : \(âf/âa = 7\) et \(âf/âb = 2\).
On vous donne les données suivantes :
# Données bruitées suivantes
torch.manual_seed(0)
x = torch.linspace(-3, 3, 100)
y_true = 2 * x**2 + 3 * x + 1 + 0.5 * torch.randn(x.size()) # avec bruit
y_true[::10] += 15 # tous les 10 points, on ajoute une grosse valeur
Objectif : Trouver une courbe 2D de la forme :
$$y = f(x) =a x^2 + b x + c$$oĂč : \(a\), \(b\) et \(c\) sont des paramĂštres appris automatiquement en minimisant l'erreur entre les prĂ©dictions du modĂšle et les donnĂ©es rĂ©elles.
Consignes : Implémenter une boucle d'entraßnement pour ajuster les paramÚtres d'une courbe d'ordre 2 aux données fournies en utilisant une fonction de perte MAE et MSE.
1) RĂ©utilisez la boucle d'entraĂźnement de lâexercice 3 qui s'arrĂȘte au bout de 1000 itĂ©rations et qui utilise un learning rate de 0.01.
2) Testez la fonction de perte MSE et MAE.
3) Pour chaque fonction de perte, affichez les paramĂštres appris \(a\), \(b\) et \(c\).
4) Pour chaque fonction de perte, tracez les données réelles et les données prédites et comparez visuellement les résultats.
6) Quelle différence observez-vous dans la convergence et les paramÚtres appris ?
7) Pourquoi la MSE et la MAE ne donnent-elles pas exactement le mĂȘme rĂ©sultat ?
8) Dans quel cas préfÚreriez-vous utiliser MSE ? Dans quel cas préfÚreriez-vous utiliser MAE ?
Astuce :
Résultat attendu : Vous devez obtenir des valeurs pour les paramÚtres proches de :
et un graphique similaire Ă celui ci-dessous :
On considĂšre la fonction suivante :
$$f(a, b) = a^2 + b^2$$Objectif : Comprendre la descente de gradient en visualisant la surface de la fonction et la trajectoire de convergence.
Consignes :
1) Calculez à la main le gradient de \(f(a,b)\) et ses dérivées partielles .
2) Implémentez une boucle de descente de gradient avec un point de départ choisi (par exemple \(a=2.5\), \(b=-2.0\)) et un learning rate de 0.1.
3) Stockez les points de la trajectoire au cours des itérations.
4) Tracez la surface 3D de \(f(a, b)\) avec Matplotlib.
5) Ajoutez sur la surface des flÚches représentant les étapes de la descente de gradient.
6) Expliquez ce que représente la trajectoire observée et pourquoi elle converge vers \((a, b) = (0,0)\).
7) Testez plusieurs learning rate (ex: 0.02, 0.1, 0.5, 2.0) pour observer convergence lente, rapide, ou divergence.
Astuce :
ax.plot_surface pour la surface 3D.ax.quiver pour tracer les flÚches en 3D.Astuce avancée :
Squelette de code :
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # nécessaire pour la 3D # 1) Créer une grille pour la surface A = np.linspace(-3, 3, 100) B = np.linspace(-3, 3, 100) AA, BB = np.meshgrid(A, B) # à compléter : calculer Z = f(a,b) = a^2 + b^2 Z = ... # 2) Préparer une figure 3D fig = plt.figure(figsize=(7, 5)) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(AA, BB, Z, alpha=0.5) # 3) Descente de gradient depuis un point de départ lr = 0.1 # learning rate a, b = 2.5, -2.0 n_iter = 15 traj = [(a, b, a**2 + b**2)] for _ in range(n_iter): # à compléter : calculer le gradient ga, gb ga, gb = ... # à compléter : mettre à jour a et b avec le learning rate a, b = ... traj.append((a, b, a**2 + b**2)) # 4) Représenter la trajectoire (quiver pour flÚches) for (a1, b1, z1), (a2, b2, z2) in zip(traj[:-1], traj[1:]): # à compléter : dessiner une flÚche de (a1,b1,z1) vers (a2,b2,z2) ax.quiver(...) ax.set_xlabel('a') ax.set_ylabel('b') ax.set_zlabel('f(a,b)') ax.set_title('Surface de perte et descente de gradient') plt.tight_layout() plt.show()
Résultat attendu :
Un graphique 3D montrant la surface convexe de la fonction et la descente du point de départ vers le minimum global en \((0,0)\) avec lr=0.1 :