\( \newcommand{\R}{\mathbb{R}} \newcommand{\Rp}{\mathbb{R_+}} \newcommand{\Z}{\mathbb{Z}} \newcommand{\Rn}{\mathbb{R}^n} \newcommand{\N}{\mathbb{N}} \renewcommand{\to}{\rightarrow} \newcommand{\from}{\colon} \renewcommand{\Vec}{\mathsf{vec}} \newcommand{\Ker}{\mathrm{Ker}} \renewcommand{\Im}{\mathrm{Im}} \newcommand{\rang}{\mathrm{rang}} \newcommand{\O}{\mathcal{O}} \newcommand{\C}{\mathcal{C}} \newcommand{\U}{\mathcal{U}} \newcommand{\x}{\mathbf{x}} \newcommand{\X}{\mathbf{X}} \newcommand{\z}{\mathbf{z}} \newcommand{\w}{\mathbf{w}} \newcommand{\W}{\mathbf{W}} \newcommand{\a}{\mathbf{a}} \newcommand{\b}{\mathbf{b}} \newcommand{\B}{\mathbf{B}} \newcommand{\dpartial}[2]{{\partial #1 \over \partial #2}} \newcommand{\d}{\mathbf{d}} \)

TD 6 : Backpropagation et Pytorch

Programmation pour l’IA

Pour comprendre un peu mieux comment autograd fonctionne, on va s’intĂ©resser au circuit suivante :

g s σ z₀ p + z₁ p->s t × z₂ t->p t2 × z₃ t2->p a a a->p a->t a->t2 b b b->t b->t2 c 3 c->t2

Ici seuls a et b ont explicitement été marqués comme requires_grad=True.

  1. Quel est la valeur de chaque porte de ce circuit (en fonction de \(a\) et \(b\)) ?
  2. Donnez \(ÌŁ\dpartial{z_0}{g}\) pour toutes les portes \(g\) en fonction de \(z_0,\dots,z_3,a,b\). On rappelle que si la sortie de \(g\) est connectĂ©e Ă  \(g_1,\dots,g_k\), alors \(\dpartial{z_0}{g} = \sum_{i=1}^k \dpartial{z_0}{g_i}\dpartial{g_i}{g}\)
  3. En déduire le gradient du circuit (par rapport à \(a\) et \(b\)).

Étant donnĂ©e un jeu de donnĂ©es \(S = \{(x_1,y_1),\dots,(x_n,y_n)\}\). Proposez une mĂ©thode en Pytorch pour trouver de bonnes valeurs \(a,b,c\) telles que \(y = ax^2+bx+c\) pour \(S\).

On considĂšre le code suivant :

import torch.nn as nn

m = nn.Sequential(
    nn.Linear(3,2),
    nn.ReLU(),
    nn.Linear(2,1),
    nn.Sigmoid()
)   
  1. Dessinez ce réseau.
  2. Quelle est la dimension des tenseurs x que m.forward(x) peut prendre en entrée ?
  3. La commande list(m.parameters()) retourne :
[Parameter containing:
 tensor([[ 1, 0, 2],
         [ 1, 1, 0]], requires_grad=True),
 Parameter containing:
 tensor([-1, 1], requires_grad=True),
 Parameter containing:
 tensor([[0.5, 2]], requires_grad=True),
 Parameter containing:
 tensor([-2], requires_grad=True)]

Que renvoie m(t) si t est :

  1. Un tenseur (de bonne forme) ne contenant que des \(0\)?
  2. Un tenseur (de bonne forme) ne contenant que des \(2\)?