Skip to main content

Section 6.2 Flot normalisés

On va introduire un premier modèle génératif qui construit une loi de probabilité en construisant une transformation reversible d'une loi classique.

Subsection 6.2.1 Principes des flots normalisés

Il s'agit de modèles permettant d'estimer des densités de probabilité complexes (potentiellement en grande dimension). Contrairement a d'autres méthodes qui permettent d'échantillonner la loi construite, mais ne la donnent pas explicitement les flots normalisés permettent de construire explicitement la loi. On cherche donc à approcher \(p(\boldsymbol{x})\) avec \(\boldsymbol{x} \in \mathbb{R}^d\) par une densité paramétrée \(p_{\theta}(x)\text{.}\) L'idée est la suivante: on chercher à déterminer une \textbf{transformation inversible} \(f\) tel

\begin{equation*} \boldsymbol{x}=f(\boldsymbol{z}), \quad \mbox{avec }\quad z \sim \pi_{\psi}(\boldsymbol{z}) \end{equation*}

On suppose ici que \(\pi_{\psi}(\boldsymbol{z})\) est une distribution connue comme une loi normale multivariée ou autre de paramètre \(\psi\text{.}\) Imaginons que cette transformation est connue: comment déterminer \(p(\boldsymbol{x})\text{.}\) On rappelle que par définition des loi de probabilité

\begin{equation*} \int_{X}p(\boldsymbol{x}) d(\boldsymbol{x})=\int_{Z} \pi_{\psi}(\boldsymbol{z})d \boldsymbol{z}= \int_{f^{-1}(X)} \pi_{\psi}(\boldsymbol{z})d \boldsymbol{z}=1 \end{equation*}

Maintenant on utilise le changement de variables dans l'intégrale de droite. Cela permet d'obtenir

\begin{equation*} \int_{f^{-1}(X)} \pi_{\psi}(\boldsymbol{z})d \boldsymbol{z}= \int_{X} \pi_{\psi}(f^{-1}(\boldsymbol{x}))|\mathrm{det}\frac{\partial f^{-1}}{\partial \boldsymbol{x}}| \end{equation*}

En utilisant l'égalité des intégrales précédentes (car on parle de densité de probabilité) et la réécriture juste au-dessus on obtient que

\begin{equation} p(\boldsymbol{x})= \pi_{\psi}(f^{-1}(\boldsymbol{x}))|\text{det}\frac{\partial f^{-1}}{\partial \boldsymbol{x}}|\tag{6.1} \end{equation}

On voit donc que sous réserve d'avoir une transformation inversible on peut calculer la loi \(p(\boldsymbol{x})\) à partir d'une loi connue \(\pi_{\psi}(\boldsymbol{z})\text{.}\) On voit donc qu'en construisant une transformation \(f_{\phi}\) on pourra obtenir la densité.

La seconde l'idée des flots normalisés est de remarque qu'en se limitant à un diffeomorphisme cela peut limiter l'expressivité du modèle \(p_{\theta}(\boldsymbol{x})\) qui va approcher \(p(\boldsymbol{x})\text{.}\) Pour cela on propose d'enchaîner une série de transformation pour obtenir un flot ( qu'on pourrait interpréter comme un flot discret issu d'une EDO). On parle de flot normalisé à cause de la présence du déterminant du jacobien. Le principe peut être vu sur l'image Figure 6.1.

Figure 6.1. Modèle général d'un flot normalisé.

Définition 6.2. Flot normalisé.

Soit \(p_{\theta}(\boldsymbol{x})\) une densité de probabilité paramétrée. Soit \(\pi_{\psi}(\boldsymbol{z}_0)\) la densité de base. On nomme un flot normalisé la transformation:

\begin{equation*} \boldsymbol{x}=f_{\phi}(\boldsymbol{z})= f_K\circ \dots\circ f_2(\boldsymbol{z}_1) \circ f_1(\boldsymbol{z}_0) \end{equation*}

avec \(\boldsymbol{z}_{k}=f_k((\boldsymbol{z}_{k-1})\) et \(\boldsymbol{z}_{k} \sim p_k(\boldsymbol{z}_{k})\text{.}\) Ici \(\phi\) correspond à l'ensemble des paramètres des transformations.

On commence par caractériser \(p_k(\boldsymbol{z}_{k})\text{.}\) On utilise la même changement de variable que précédemment

\begin{equation*} \boldsymbol{z}_{k}=p_{k-1}(f_k^{-1}(\boldsymbol{z}_k))|\mathrm{det}\frac{\partial f_k^{-1}}{\partial \boldsymbol{z}_k}| \end{equation*}

On utilise le théorème de la fonction inverse qui dit que pour une fonction continûment différentiable la jacobienne de l'inverse est l'inverse de la jacobienne. On a donc

\begin{equation*} \boldsymbol{z}_{k}=p_{k-1}(f_k^{-1}(\boldsymbol{z}_k)) |\mathrm{det} \left(\frac{\partial f_k}{\partial \boldsymbol{z}_{k-1}}\right)^{-1}| \end{equation*}

On utilise aussi un théorème d'algèbre linéaire qui dit que le déterminant de l'inverse d'une matrice est donné par l'inverse du déterminant de la matrice. On a donc

\begin{equation*} \boldsymbol{z}_{k}=p_{k-1}(f_k^{-1}(\boldsymbol{z}_k))| \mathrm{det}\left(\frac{\partial f_k}{\partial \boldsymbol{z}_{k-1}}\right)|^{-1} \end{equation*}

Ensuite on passe au \(\mathrm{log}\) et on utilise \(f_k^{-1}(\boldsymbol{z}_k)=\boldsymbol{z}_{k-1}\) pour récupérer:

\begin{equation} \mathrm{log}\boldsymbol{z}_{k}=\mathrm{log}(p_{k-1}(\boldsymbol{z}_{k-1}))- \mathrm{log}| \mathrm{det}\left(\frac{\partial f_k}{\partial \boldsymbol{z}_{k-1}}\right)|\tag{6.2} \end{equation}

Ensuite on commence a calculer:

\begin{equation*} p_{\theta}(\boldsymbol{x})= p_{K}(\boldsymbol{\boldsymbol{z}_{K}}) \end{equation*}

En utilisant (6.2) on obtient:

\begin{equation*} p_{\theta}(\boldsymbol{x})= \mathrm{log}(p_{K-1}(\boldsymbol{z}_{K-1}))- \mathrm{log}| \mathrm{det}\left(\frac{\partial f_K}{\partial \boldsymbol{z}_{K-1}}\right)| \end{equation*}

Et en appliquant (6.2) de façon récursive on conclut.

Maintenant qu'on a défini comment calculer la vraisemblance de notre distribution issue d'un flot normalisé, on va pouvoir définir la fonction de coût à minimiser et voir comment effectuer l'apprentissage de ce type de modèle. Soit \(p^{*}(\boldsymbol{x})\) la densité qu'on cherche à obtenir et \(p_{\theta}(\boldsymbol{x})\) notre densité modélisée par un flot normalisé de paramètre \(\theta=(\psi,\phi)\text{.}\) Dans ce cas nous souhaitons résoudre:

\begin{equation*} \mathrm{argmin}_{\theta} \mathcal{J}(\theta) = \mathrm{argmin}_{\theta} D_{KL}(p^{*} \mid \mid p_{\theta}) \end{equation*}

avec \(D_{KL}\) la divergence de Kulback-Leibler. Évidemment on ne connaît \(p_{*}\) donc on doit réécrire notre problème de minimisation.

\begin{align*} \mathcal{J}(\theta) \amp = D_{KL}(p^{*}(\boldsymbol{x}) || p_{\theta}(\boldsymbol{x})\\ \amp = \int_{\mathbb{R}^d} p^{*}(\boldsymbol{x}) \mathrm{log} \left(\frac{p^{*}(\boldsymbol{x})}{p_{\theta}(\boldsymbol{x})}\right)\text{d}\boldsymbol{x}\\ \amp = -\int_{\mathbb{R}^d} p^{*}(\boldsymbol{x}) \mathrm{log} p_{\theta}(\boldsymbol{x}) \text{d}\boldsymbol{x} + \int_{\mathbb{R}^d} p^{*}(\boldsymbol{x}) \mathrm{log} p^{*}(\boldsymbol{x})\text{d}\boldsymbol{x}\\ \amp = -\mathbb{E}_{p^{*}}\left(\mathrm{log} p_{\theta}(\boldsymbol{x})\right) + \text{cst}\\ \amp = -\mathbb{E}_{p{*}}\left[\mathrm{log} p_{\psi}\left(f_{\phi}^{-1}(\boldsymbol{x})\right) + \mathrm{log}\left|\mathrm{det} J_{f_{\phi}^{-1}}(\boldsymbol{x})\right|\right] + \text{cst} \end{align*}

Minimiser la divergence de Kullback Leibler revient donc à minimiser la dernière ligne du calcul précédent sans les constantes. Maintenant il suffit d'approcher l'espérence par une espérance empirique (méthode Monte-Carlo).

\begin{equation*} \mathrm{argmin}_{\theta} \mathcal{J}(\theta)= \mathrm{argmin}_{\theta}\left( -\frac{1}{N}\sum_{n=1}^N \left[\mathrm{log} p_{\psi}(f_\phi^{-1}(\boldsymbol{x}_n))+ \mathrm{log}\left|\mathrm{det}J_{f_\phi^{-1}}(\boldsymbol{x}_n)\right|\right]\right) \end{equation*}

Pour le gradient le calcul est immédiat, car l'espérance dépend de la loi \(p^{*}\) qui ne dépend pas de \(\theta\) par conséquent le gradient peut commuter avec l'espérance.

Subsection 6.2.2 Exemple de flots normalisés

Maintenant on va introduire des exemples de flots normalisés. Cela revient donc a proposer des transformations inversibles qui vont être plus ou moins expressives.

Subsubsection 6.2.2.1 Modèles NICE et RealNVP

Les méthodes NICE et RealNVP proposent d'appliquer des transformation qu'on pourrait dire triangulaire. C'est a dire qu'un certains nombre de dimension de notre entrée vont rester inchangés et on va appliquer une transformation sur les autres dimensions qui dépend des dimensiuon inchangées. On va commencer par introduire la méthode NICE qui est la plus simple.

Définition 6.5. Transformation du modèle NICE.

On se donne un entrée de \(x\in \mathbb{R}^d\) et une sortie \(y\in \mathbb{R}^d\text{.}\) La transformation utilisée dans l'approche RealNVP est donnée par

\begin{equation*} y=f(x)= \left\{\begin{array}{l} y_{1:m}=x_{1:m} \\ y_{m+1:d}= x_{m+1:d}+t_{\theta}(x_{1:m}) \end{array}\right. \end{equation*}

avec \(m\lt d\) et \(t_{\theta}:\mathbb{R}^m\rightarrow \mathbf{d-m}\) un réseaux de neurones.

Ce type de transformation possède deux avantages. Elle est inversible en effet l'inverse est donné par:

\begin{equation*} x=f^{-1}(y)= \left\{\begin{array}{l} x_{1:m}=y_{1:m} \\ x_{m+1:d}= (y_{m+1:d} - t_{\theta}(y_{1:m})) \end{array}\right. \end{equation*}

Le deuxième avantage est le calcul rapide de la Jacobienne et du déterminant qui sera indispensable dans le calcul de la fonction coût. En effet la jacobienne est donnée par

\begin{equation*} J = \begin{pmatrix} I_m \amp O_{m\times (d-m)}\\ \frac{\partial y_{m+1:d}}{\partial x_{1:m}} \amp I_d \end{pmatrix} \end{equation*}

et le déterminant est donné par \(I_d\text{.}\) Cela rend évidemment très simple le calcul de la fonction coût d'apprentissage. La méthode RealNVP va généraliser un peu la méthode NICE en prenant comme transformations non seulement des translations mais aussi des dilatations.

Définition 6.6. Transformation du modèle realNVP.

On se donne un entrée de \(x\in \mathbb{R}^d\) et une sortie \(y\in \mathbb{R}^d\text{.}\) La transformation utilisée dans l'approche RealNVP est donnée par

\begin{equation*} y=f(x)= \left\{\begin{array}{l} y_{1:m}=x_{1:m} \\ y_{m+1:d}= x_{m+1:d}\odot e^{s_{\theta}(x_{1:m})}+t_{\theta}(x_{1:m}) \end{array}\right. \end{equation*}

avec \(m\lt d\) et \(s_{\theta}:\mathbb{R}^m\rightarrow \mathbf{d-m}\text{,}\) \(t_{\theta}:\mathbb{R}^m\rightarrow \mathbf{d-m}\) des réseaux de neurones.

Ce type de transformation possède deux avantages. Elle est inversible en effet l'inverse est donné par:

\begin{equation*} x=f^{-1}(y)= \left\{\begin{array}{l} x_{1:m}=y_{1:m} \\ x_{m+1:d}= (y_{m+1:d} - t_{\theta}(y_{1:m}))\odot e^{-s_{\theta}(y_{1:m})} \end{array}\right. \end{equation*}

Le deuxième avantage est le calcul rapide de la Jacobienne et du déterminant qui sera indispensable dans le calcul de la fonction coût. En effet la jacobienne est donnée par:

\begin{equation*} J = \begin{pmatrix} I_m \amp O_{m\times (d-m)}\\ \frac{\partial y_{m+1:d}}{\partial x_{1:m}} \amp diag(e^{s_{\theta}(x_{1:m})}) \end{pmatrix} \end{equation*}

et le déterminant est donné par:

\begin{equation*} Det(J)= \Pi_{j=1}^{d-m}(e^{s_{\theta}(x_{1:m})})_j = exp^{\sum_{j=1}^{d-m} (s_{\theta}(x_{1:m}))_j} \end{equation*}

Ce calcul est d'autant plus simple qu'il ne nécessite pas d'inverser les réseaux de neurones qui peuvent être donc arbitrairement compliqués.

Figure 6.7. Exemple de transformation d'un distrubution Gaussienne 2D par un flot RealNVP. Image issue du papier (...)
On voit sur la figure Figure 6.7 que un flot de ce type peut évidemment translaté et dilaté la distrubution mais aussi la couper. Cela permet d'apprendre des distributions assez complexes.