corrections de plein de remarques encore

This commit is contained in:
Laureηt 2023-08-24 15:29:51 +02:00
parent 6383c0d83c
commit 52dc6b9de6
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
7 changed files with 154 additions and 176 deletions

BIN
assets/pvd-results.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/pvd_sample_front.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/pvd_sample_inside.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/sample_1_kpfcnn.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/sample_2_kpfcnn.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/sample_3_kpfcnn.png (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -28,7 +28,8 @@
\usepackage{caption}
\usepackage{placeins}
\usepackage{calligra}
\usepackage{siunitx}
\sisetup{locale=FR}
\usepackage{tikz}
\usepackage{pgf-pie}
@ -145,10 +146,13 @@
\newacronym{go}{Go}{Gigaoctet}
\newacronym{kpconv}{KPConv}{Kernel Point Convolution}
\newacronym{kpfcnn}{KP-FCNN}{Kernel Point Fully Convolutional Neural Network}
\newacronym{kpcnn}{KP-CNN}{Kernel Point Convolutional Neural Network}
\newacronym{pvconv}{PVConv}{Point Voxel Convolution}
\newacronym{spvconv}{SPVConv}{Sparse Point Voxel Convolution}
\newacronym{cao}{CAO}{Conception Assistée par Ordinateur}
\newacronym{edp}{EDP}{Équation aux Dérivées Partielles}
% \newglossary{symbols}{sym}{sbl}{Notations mathématiques et symboles}
@ -184,8 +188,6 @@
Je tiens à remercier Xavier Roynard, Michele Alessandro Bucci et Brian Staber, mes tuteurs de stage, ainsi que les équipes de Safran pour leur accueil et leur accompagnement tout au long de ce stage.
J'aimerais également remercier l'ensemble de mes professeurs de l'\gls{n7}, pour m'avoir permis d'acquérir les connaissances nécessaires à la réalisation de ce projet.
% \gls{fn}
}
\clearpage
@ -300,7 +302,7 @@ Les approches d'optimisation assistées par surfaces de réponse permettent de r
\end{itemize}
\smallskip
En particulier, une représentation latente parcimonieuse de la géométrie faciliterait l'exploration de l'espace de recherche et l'utilisation de métamodèles classiques pour la prédiction des quantités d'intérêt.
Toutefois, il est important de noter que les profils capables de générer de la portance, et par conséquent, de la puissance pour le moteur, présentent des similitudes marquées entre eux. Ces similitudes se manifestent généralement par de subtiles variations, principalement au niveau des bords d'attaque ou des bords de fuite. Cette observation conduit à l'hypothèse qu'une représentation latente parcimonieuse des aubes, qu'elles soient destinées à des turbines ou à des compresseurs, existe potentiellement. Cette représentation latente pourrait être exploitée pour explorer de manière plus efficiente l'espace de recherche en vue d'optimiser les quantités d'intérêt, ou pour vérifier la conformité aux contraintes de conception.
Récemment, les modèles génératifs profonds comme les \glspl{vae} ou les \glspl{gan} ont été appliqués avec succès à des données structurées (e.g. des images). Ceux-ci permettent de construire un espace latent représentatif d'un jeu de données spécifique et de générer de nouveaux échantillons qui partagent des caractéristiques importantes du jeu de données d'entraînement.
@ -316,7 +318,13 @@ L'étude vise tout d'abord à étudier la bibliographie disponible d'un côté s
Ce chapitre présente les différents concepts et méthodes nécessaires à la compréhension du travail réalisé durant ce stage.
Dans le cadre de cette étude, nous nous intéressons à la génération de géométries d'aubes de turbines. Ces géométries font parties d'une modalité de données peu commune, les maillages (qui sont un type de graphes) ou les nuages de points. Ces modalités sont relativement peu étudiée dans la littérature de l'apprentissage automatique comparé aux modalités plus classique comme les images, le texte ou encore l'audio. En effet, ces données sont non structurées et il est donc nécessaire d'utiliser des méthodes spécifiques pour les traiter.
Dans le cadre de cette étude, nous nous intéressons à la génération de géométries d'aubes de turbines par l'intermédiaire de maillages. Cette approche est motivée par plusieurs raisons, dont les considérations spécifiques suivantes:
\begin{itemize}
\item Les données que nous traitons sont destinées à alimenter des simulations numériques, où l'espace est discrétisé pour résoudre numériquement des \gls{edp} liées à la mécanique des solides ou des fluides.
\item Les protocoles de \gls{cao}, bien qu'efficaces pour la représentation géométrique, présentent des défis liés à la propriété des formats et aux différentes manières de représenter une même géométrie. Ceci peut être vu dans des logiciels tels que Catia, où diverses représentations de \gls{cao} peuvent coexister pour une géométrie donnée, rendant complexe la création d'un processus inverse.
\end{itemize}
Les maillages sont un domaine relativement peu exploré dans la littérature de l'apprentissage automatique, et cette exploration est encore plus limitée pour les représentations par \gls{cao}, en comparaison avec les modalités plus classiques telles que les images, le texte ou encore l'audio. La complexité découle en partie du caractère non structuré de ces données. En conséquence, il est nécessaire d'utiliser des méthodes spécifiques pour traiter ces données.
Il reste pertinent de noter que les méthodes présentées dans ce chapitre sont récentes et que la littérature évolue très rapidement. De plus, les méthodes existantes sont très nombreuses et il est impossible de toutes les présenter. Nous avons donc choisi de présenter les méthodes les plus pertinentes pour permettre une bonne compréhension globale du travail réalisé durant ce stage.
@ -326,7 +334,9 @@ Il reste pertinent de noter que les méthodes présentées dans ce chapitre sont
Les graphes sont des structures de données qui permettent de représenter des relations entre des entités. Un graphe est défini par un ensemble de nœuds et un ensemble d'arêtes. Les arêtes représentent des relations entre les nœuds. Ces relations peuvent être de différents types, comme des relations de parenté, de proximité ou encore de similarité. Les graphes peuvent être dirigés ou non. Dans le cas d'un graphe dirigé, les arêtes sont orientées et représentent une relation unidirectionnelle. Dans le cas d'un graphe non dirigé, les arêtes ne sont pas orientées et représentent une relation bidirectionnelle. Les graphes peuvent être pondérés ou non. Dans le cas d'un graphe pondéré, les arêtes sont associées à une valeur qui représente l'intensité de la relation entre les nœuds.
Les graphes offrent une représentation intuitive de diverses structures telles que les réseaux de communication, les réseaux sociaux, les molécules ou encore les maillages. Par conséquent, les graphes sont un type de données largement présents dans la nature et sont très répandu dans le domaine de l'ingénierie. De manière générale, les graphes peuvent être considérés comme une généralisation des données structurées, telles que les images ou les séries temporelles. En effet, toute données structurées/régulières peut facilement être traduite en un graphe régulier.
Les graphes offrent une représentation intuitive de diverses structures, visibles dans la figure~\ref{fig:graph_example}, telles que les réseaux de communication, les réseaux sociaux, les molécules ou encore les maillages. Par conséquent, les graphes sont un type de données largement présents dans la nature et sont très répandu dans le domaine de l'ingénierie. De manière générale, les graphes peuvent être considérés comme une généralisation des données structurées, telles que les images ou les séries temporelles. En effet, toute données structurées/régulières peut facilement être traduite en un graphe régulier.
Les maillages constituent une catégorie spécifique de graphes largement employée pour la représentation de surfaces. En plus des éléments caractéristiques des graphes, les maillages intègrent généralement des attributs associés à chaque triangle qui le compose. Ces attributs englobent des propriétés telles que les normales, les textures et les caractéristiques physiques, entre autres.
\begin{figure}[h!]
\centering
@ -340,13 +350,90 @@ Les graphes offrent une représentation intuitive de diverses structures telles
Les \glspl{gnn} sont une famille de modèles qui permettent de traiter ce type de structures de données. Ces modèles sont majoritairement basés sur des opérations de convolution et d'agrégation, similairement aux opérations de convolution et de pooling utilisées dans les réseaux de neurones pour les modalités plus classique comme les images.
On retrouve de même dans les \glspl{gnn} des architectures avancées, inspirées des réseaux de neurones classiques, comme les réseaux résiduels~\cite{gao_graph_2019}, les réseaux récurrents~\cite{li_gated_2017} ou l'attention~\cite{velickovic_graph_2018,brody_how_2022}.
% Mais on retrouve aussi des architectures spécifiques aux \gls{gnn} comme PointNet~\cite{qi_pointnet_2017,qi_pointnet_2017-1} ou GraphSAGE~\cite{hamilton_inductive_2017}, qui ne permettent de traiter uniquement que des données non structurées
Les applications les plus courantes de ces réseaux incluent la classification~\cite{kipf_semi-supervised_2017} de documents, la détection de fraudes~\cite{ma_comprehensive_2021} et les systèmes de recommandation~\cite{gao_survey_2023}. En revanche, la génération de graphes est moins répandue et se limite souvent dans la littérature à la génération de petites molécules~\cite{kipf_graph_2020,simonovsky_graphvae_2018}.
% ~\cite{thomas_kpconv_2019}
% ~\cite{tang_searching_2020}
% ~\cite{liu_point-voxel_2019}
\FloatBarrier
\section{Métriques et distances}
Il existe de nombreuses distances et métriques spécifiques permettant d'analyser les distributions et les ensembles de données sous forme de nuages de points. Dans cette section, nous présentons certaines de ces mesures, qui sont couramment utilisées dans les articles présentés plus loin.
\glsunset{kld}
\subsection{\acrfull*{kld}}
Soit deux distributions de probabilités discrètes $P$ et $Q$ sur un ensemble $X$.
\begin{equation}
D_{\text{KL}}(P\|Q) = \sum_{x \in X} P(x) \log \frac{P(x)}{Q(x)}
\end{equation}
La Divergence de Kullback-Leibler est une mesure de la dissimilarité entre deux distributions de probabilité. Elle évalue la quantité d'information perdue lorsque l'on tente d'approximer une distribution par une autre. La \gls{kld} n'est pas une distance, elle ne satisfait pas la propriété de symétrie ($D_{\text{KL}}(P\|Q) \neq D_{\text{KL}}(Q\|P)$) ni l'inégalité triangulaire ($D_{\text{KL}}(P\|R) \not\leq D_{\text{KL}}(P\|Q) + D_{\text{KL}}(Q\|R)$).
\glsunset{hd}
\subsection{\acrfull*{hd}}
Soit $X$ et $Y$ deux nuages de points.
\begin{equation}
d_\text{H}(X, Y) = \max \left\{ \sup_{x \in X} \inf_{y \in Y} d(x,y), \sup_{y \in Y} \inf_{x \in X} d(x, y) \right\}
\end{equation}
La distance de Hausdorff est une mesure quantitative utilisée pour évaluer la similarité ou la dissimilarité entre deux ensembles de points dans un espace métrique. Elle calcule la plus grande distance d'un point d'un ensemble à son point le plus proche dans l'autre ensemble. En d'autres termes, elle capture la plus grande distance entre les ensembles, ce qui en fait un outil utile pour comparer des formes, des structures ou des distributions de points.
\glsunset{cd}
\subsection{\acrfull*{cd}}
Soit $X$ et $Y$ deux nuages de points.
\begin{equation}
d_{\text{CD}}(X, Y) = \sum_{x \in X} \min_{y \in Y} \|x - y\|^2_2 + \sum_{y \in Y} \min_{x \in X} \|x - y\|^2_2
\end{equation}
La distance de Chamfer est une mesure de similarité entre deux ensembles de points dans un espace métrique. Elle évalue la proximité entre les points des ensembles en calculant la somme des distances entre chaque point d'un ensemble et son point le plus proche dans l'autre ensemble.
\glsunset{emd}
\subsection{\acrfull*{emd}}
Soit $X$ et $Y$ deux nuages de points tels que $|X| = |Y|$, et $\phi: X \to Y$ une bijection.
\begin{equation}
d_{\text{EMD}}(X, Y) = \min_{ \phi: X \to Y } \sum_{x \in X} \| x - \phi(x) \|_2
\end{equation}
La distance du transport optimal, également appelée distance du "Earth Mover", est une mesure de similarité entre deux distributions de masse dans un espace métrique. Elle évalue le coût minimum nécessaire pour déplacer une distribution de masse en une autre en respectant certaines contraintes de déplacement. Cette distance est couramment utilisée pour comparer des distributions de données, telles que des histogrammes, des vecteurs de caractéristiques ou des nuages de points, en prenant en compte non seulement les distances entre les éléments correspondants, mais aussi les coûts associés à leur déplacement.
\glsunset{jsd}
\subsection{\acrfull*{jsd}}
Soit $S_g$ un ensemble de nuages de points générés et $S_r$ un ensemble de nuages de points de référence.
\begin{equation}
\text{JSD}(S_g, S_r) = \frac12 D_{\text{KL}}(S_g \| M) + \frac12 D_{\text{KL}}(S_r \| M), \quad M = \frac12 (S_g + S_r)
\end{equation}
La divergence de Jensen-Shannon est une mesure de la similarité entre deux distributions de probabilité. Elle est calculée comme la moyenne des \glspl{kld} entre chaque distribution et la moyenne de ces distributions. Contrairement à la \gls{kld}, la \gls{jsd} est symétrique et bornée entre 0 et 1.
Cependant, la \gls{jsd} utilise la distribution globale des nuages de points et non la distribution des nuages de points individuellements. Ainsi, un modèle qui produit toujours une "forme moyenne" peut obtenir un score \gls{jsd} parfait sans apprendre de distributions significatives.
\glsunset{cov}
\subsection{\acrfull*{cov}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence et $D$ une distance entre nuages de points.
\begin{equation}
\text{COV}(S_g, S_r) = \frac{ | \{ \argmin_{Y \in S_r} D(X, Y) | X \in S_g \} | }{ |S_r| }
\end{equation}
La couverture évalue le nombre de nuages de points de référence qui sont appariés à au moins une forme générée.
La couverture permet de quantifier la diversité des générations mais est sensible à la perte de modes, cependant elle n'évalue pas la qualité des nuages de points générés.
Ainsi, des nuages de points générés de faible qualité mais diversifiés peuvent obtenir des scores de couverture élevés.
\glsunset{mmd}
\subsection{\acrfull*{mmd}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence et $D$ une distance entre nuages de points.
\begin{equation}
\text{MMD}(S_g, S_r) = \frac{1}{|S_r|} \sum_{Y \in S_r} \min_{X \in S_g} D(X, Y)
\end{equation}
La distance de correspondance minimale, est une mesure qui évalue la différence entre deux ensembles ordonnés. Elle calcule la plus petite somme des distances entre les éléments des deux ensembles.
Cependant, la \gls{mmd} est en réalité très peu sensible aux nuages de points de qualité médiocre dans $S_g$, étant donné leur faible probabilité d'être appariés avec des nuages de points réels dans $S_r$. Dans un cas extrême, on pourrait envisager que $S_g$ soit composé principalement de nuages de points de très mauvaise qualité, ainsi que de nuages de point pratiquement identiques à ceux de $S_r$. Dans ce cas, on obtiendrait un score de raisonnablement élevé.
\glsunset{1-nna}
\subsection{\acrfull*{1-nna}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence, $N_X$ les voisins les plus proches de $X$ dans $S_{-X} = S_r \cup S_g - \{X\}$, $N_Y$ les voisins les plus proches de $Y$ dans $S_{-Y} = S_r \cup S_g - \{Y\}$ et $\mathbb{1}$ la fonction indicatrice.
\begin{equation}
\text{1-NNA}(S_g, S_r) = \frac{ \sum_{X \in S_g} \mathbb{1}[N_X \in S_g] + \sum_{Y \in S_r} \mathbb{1}[N_Y \in S_r] }{ |S_g| + |S_r| }
\end{equation}
Pour chaque point d'un ensemble de nuages de points, cette mesure évalue par une classification par plus proche voisin, si celui-ci provient de $S_g$ ou de $S_r$. La précision de cette classification est ensuite calculée comme la moyenne des précisions de chaque point de $S_g$ et de $S_r$.
En supposant que $S_g$ et $S_r$ soient échantillonnés à partir de la même distribution, la précision d'un tel classificateur devrait converger vers 50\% avec un nombre suffisant d'échantillons. Plus la précision se rapproche de 50\%, plus les similarités entre $S_g$ et $S_r$ sont prononcées, ce qui indique une meilleure capacité du modèle à apprendre la distribution cible. Dans notre contexte, le plus proche voisin peut être calculé à l'aide de la \gls{cd} ou de l'\gls{emd}. Contrairement à la \gls{jsd}, le \gls{1-nna} considère la similarité entre les distributions de formes plutôt qu'entre les distributions totale des points. Contrairement au \gls{cov} et au \gls{mmd}, la \gls{1-nna} mesure directement la similarité des distributions et prend en compte à la fois la diversité et la qualité.
\FloatBarrier
\section{Modèles génératifs}
@ -368,7 +455,7 @@ Il existe plusieurs sous familles de modèles génératifs, chacune basées sur
\label{fig:gan-architecture}
\end{figure}
Les \glspl{gan}~\cite{goodfellow_generative_2014} sont la famille de modèles génératifs la plus renommée et également la plus ancienne. Ces modèles reposent sur un principe compétitif impliquant deux réseaux de neurones, visibles sur la figure~\ref{fig:gan-architecture}. Le premier réseau, connu sous le nom de générateur, a pour objectif de produire de nouvelles données. Le deuxième réseau, appelé discriminateur, est chargé de distinguer les données générées par le générateur des données réelles. Le générateur est entraîné à tromper le discriminateur tandis que le discriminateur est entraîné à identifier les données générées par rapport aux données réelles. Cette compétition entre les deux réseaux permet de former le générateur à générer des données de plus en plus réalistes. Ce type d'apprentissage est auto-supervisé, car il ne nécessite pas l'utilisation d'annotations sur les données pour entraîner le modèle.
Les \glspl{gan}~\cite{goodfellow_generative_2014} sont la famille de modèles génératifs la plus renommée. Ces modèles reposent sur un principe compétitif impliquant deux réseaux de neurones, visibles sur la figure~\ref{fig:gan-architecture}. Le premier réseau, connu sous le nom de générateur, a pour objectif de produire de nouvelles données. Le deuxième réseau, appelé discriminateur, est chargé de distinguer les données générées par le générateur des données réelles. Le générateur est entraîné à tromper le discriminateur tandis que le discriminateur est entraîné à identifier les données générées par rapport aux données réelles. Cette compétition entre les deux réseaux permet de former le générateur à générer des données de plus en plus réalistes. Ce type d'apprentissage est auto-supervisé, car il ne nécessite pas l'utilisation d'annotations sur les données pour entraîner le modèle.
Mathématiquement, on peut poser le problème d'optimisation suivant:
\begin{equation}
@ -393,7 +480,7 @@ Face à ces inconvénients, et puisque nous ne possédons pas de grandes quantit
\label{fig:vae-architecture}
\end{figure}
Les \glspl{vae}~\cite{kingma_auto-encoding_2022,kipf_variational_2016,doersch_tutorial_2021} constituent une autre famille de modèles génératifs, également bien connue comme les \glspl{gan} et relativement tout aussi anciens. Ces modèles reposent sur l'entraînement simultané de deux réseaux de neurones: un encodeur et un décodeur. L'objectif de l'encodeur est de transformer les données d'entrée en une distribution de probabilité, tandis que le décodeur génère de nouvelles données à partir de cette distribution. Comme pour les \glspl{gan}, ces modèles visent à estimer une distribution de données qui se rapproche le plus possible de la distribution des données d'entraînement, c'est-à-dire qu'ils apprennent à reproduire fidèlement les données d'origine.
Les \glspl{vae}~\cite{kingma_auto-encoding_2022,kipf_variational_2016,doersch_tutorial_2021} constituent une autre famille de modèles génératifs, également bien connue comme les \glspl{gan}. Ces modèles reposent sur l'entraînement simultané de deux réseaux de neurones: un encodeur et un décodeur. L'objectif de l'encodeur est de transformer les données d'entrée en une distribution de probabilité, tandis que le décodeur génère de nouvelles données à partir de cette distribution. Comme pour les \glspl{gan}, ces modèles visent à estimer une distribution de données qui se rapproche le plus possible de la distribution des données d'entraînement, c'est-à-dire qu'ils apprennent à reproduire fidèlement les données d'origine.
La particularité inhérente aux \glspl{vae} réside dans l'espace latent intermédiaire situé entre l'encodeur et le décodeur.
La recherche sur l'interprétabilité des réseaux de neurones et leur visualisations~\cite{olah2017feature} établissent que les espaces latents permettent d'extraire les informations sous-jacentes (non directement perceptibles) des données d'entrée. Travailler sur ces informations s'avère avantageux car elles décrivent plus simplement les données d'entrée.
@ -410,7 +497,7 @@ Cependant, il est tout de même possible de trouver une borne inférieure de l'
p(\boldsymbol{x}) \propto \log p(\boldsymbol{x}) & = \mathbb{E}_{ q_\phi( \boldsymbol{z} | \boldsymbol{x} ) } \left[ \log \frac{ p(\boldsymbol{x}, \boldsymbol{z}) } { q(\boldsymbol{z}|\boldsymbol{x}) }\right] - D_{\text{KL}}(q_\phi(\boldsymbol{z}|\boldsymbol{x}) \ \| \ p(\boldsymbol{z}|\boldsymbol{x})) \\
& \geq \mathbb{E}_{ q_\phi( \boldsymbol{z} | \boldsymbol{x} ) } \left[ \log \frac{ p(\boldsymbol{x}, \boldsymbol{z}) } { q_\phi(\boldsymbol{z}|\boldsymbol{x}) }\right] \label{eq:elbo}
\end{align}
Ainsi, puisque la \gls{kld} est toujours positive et car $\log p(\boldsymbol{x})$ est constant par rapport à $\phi$, maximiser l'\gls{elbo} (\ref{eq:elbo}) revient à maximiser l'évidence et donc la vraissemblance de nos données d'entrée $p(\boldsymbol{x})$. En simplifiant l'\gls{elbo}, on dérive une fonction de coût pour l'entrainement du \gls{vae}:
Ainsi, puisque la \gls{kld} est toujours positive et car $\log p(\boldsymbol{x})$ est constant par rapport aux paramètres $\phi$ de l'encodeur, maximiser l'\gls{elbo} (\ref{eq:elbo}) revient à maximiser l'évidence et donc la vraissemblance de nos données d'entrée $p(\boldsymbol{x})$. En simplifiant l'\gls{elbo}, on dérive une fonction de coût pour l'entrainement du \gls{vae}:
\begin{equation}
\mathbb{E}_{ q_\phi( \boldsymbol{z} | \boldsymbol{x} ) } \left[ \log \frac{ p(\boldsymbol{x}, \boldsymbol{z}) } { q_\phi(\boldsymbol{z}|\boldsymbol{x}) }\right] = \underbrace{ \mathbb{E}_{ q_\phi( \boldsymbol{z} | \boldsymbol{x} ) } [ \log p_\theta(\boldsymbol{x}|\boldsymbol{z}) ]}_{\text{reconstruction term}} - \underbrace{ D_{\text{KL}}(q_\phi(\boldsymbol{z}|\boldsymbol{x}) \ \| \ p(\boldsymbol{z})) }_{\text{prior matching term}}
\end{equation}
@ -419,8 +506,6 @@ Une fois la convergence atteinte, l'intéret de cet espace latent, lorsqu'il est
Tout comme les \glspl{gan}, de nombreuses améliorations (β-VAE~\cite{burgess_understanding_2018,higgins_beta-vae_2022,alemi_deep_2019}, f-VAE~\cite{su_f-vaes_2018}) et variations (SetVAE~\cite{kim_setvae_2021}, AutoDecoder~\cite{shah_auto-decoding_2020}, GraphVAE~\cite{simonovsky_graphvae_2018}) ont été proposées pour les \glspl{vae}. Ces modèles sont plus faciles à entraîner que les \glspl{gan} et présentent une plus grande stabilité. Cependant, les \glspl{vae} ont tendance à générer des données floues et peu réalistes~\cite{yacoby_failure_2021}, et en général produisent des résultats de moins bonne qualité que les \glspl{gan}, en particulier pour des résolutions élevées.
% nous avons choisi d'explorer ces modèles dans un premier temps lors de nos experiementations.
\FloatBarrier
\glsunset{nf}
\subsection{\acrfull*{nf}}
@ -434,90 +519,20 @@ Tout comme les \glspl{gan}, de nombreuses améliorations (β-VAE~\cite{burgess_u
\label{fig:nf-architecture}
\end{figure}
% on est capable de calculer exactement le log likelyhood, et donc de train direct dessus, contrairement aux VAE où on train sur l'ELBO ou les GANS où y'a pas du tout de log likelyhood, jsute un minmnax game
Les \glspl{nf}~\cite{kobyzev_normalizing_2021} constituent une autre catégorie de modèles génératifs qui ont suscité un intérêt croissant au cours des dernières années. Cette approche gagne en popularité du fait de sa capacité à opérer directement sur les densités de probabilité, ouvrant ainsi la voie au calcul précis des probabilités d'événements spécifiques. Ces modèles se basent sur des transformations inversibles, bijectives, continues et différentiables. Ces transformations sont appliquées à une distribution de base, généralement une distribution simple comme une gaussienne isotropique, pour obtenir une distribution plus complexe et plus proche de la distribution des données réelles.
Les \glspl{nf}~\cite{kobyzev_normalizing_2021} sont une autre classe de modèles génératifs qui ont gagné en popularité ces dernières années, puisque ces méthodes proposent de travailler directement sur les densités de probabilité, contrairement aux \glspl{vae} et \glspl{gan}. Ces modèles se basent sur des transformations inversibles, bijectives, continues et différentiables. Ces transformations sont appliquées à une distribution de base, généralement une distribution simple comme une gaussienne isotropique, pour obtenir une distribution plus complexe et plus proche de la distribution des données réelles.
Les transformations inversibles utilisées dans les \glspl{nf} sont souvent paramétrisées par des réseaux de neurones, ce qui permet d'apprendre des fonctions non linéaires complexes. En utilisant plusieurs transformations en séquence, on peut construire des modèles génératifs flexibles capables de capturer des distributions complexes.
Les transformations inversibles utilisées dans les \glspl{nf} sont souvent paramétrisées par des réseaux de neurones, ce qui permet d'apprendre des fonctions non linéaires. En utilisant plusieurs transformations en séquence, on peut construire des modèles génératifs capables de capturer des distributions complexes. En pratique, toutefois, les contraintes inhérentes à ces transformations limitent considérablement les architectures envisageables, restreignant ainsi la capacité de ces moddèles à surpasser les performances génératives d'autres méthodes.
Dans la littérature, ces réseaux sont assez peu appliqués aux types de données qui nous intéressent, à l'exception notable de PointFlow~\cite{yang_pointflow_2019} qui aura posé certaines bases pour évaluer les réseaux génératifs de nuages de points. Comme par exemple la démocratisation des distances et métriques suivantes:
Dans la littérature, l'application de ces réseaux aux types de données qui nous intéressent est relativement limitée. De manière générale, leur utilisation est restreinte pour toutes les applications traitant des données de grande dimension. Une exception notable est représentée par PointFlow~\cite{yang_pointflow_2019} qui aura posé certaines bases pour évaluer les réseaux génératifs de nuages de points, notamment via la création d'un dataset de référence qui repose sur ShapeNet~\cite{shapenet2015}, un dataset décrivant une variété d'objets en trois dimensions, visibles sur la figure~\ref{fig:shapenet}, modifié par Furthest Point Sampling pour contenir uniquement 2048 points par nuages.
\glsunset{kld}
\subsubsection{\acrfull*{kld}}
\begin{figure}[h!]
\centering
\includegraphics[width=0.9\textwidth]{shapenet.png}
\caption{Exemple de datasets d'objets 3D.}
\label{fig:shapenet}
\end{figure}
Soit deux distributions de probabilités discrètes $P$ et $Q$ sur un ensemble $X$.
\begin{equation}
D_{\text{KL}}(P\|Q) = \sum_{x \in X} P(x) \log \frac{P(x)}{Q(x)}
\end{equation}
La Divergence de Kullback-Leibler est une mesure de la dissimilarité entre deux distributions de probabilité. Elle évalue la quantité d'information perdue lorsque l'on tente d'approximer une distribution par une autre. La \gls{kld} n'est pas une distance, elle ne satisfait pas la propriété de symétrie ($D_{\text{KL}}(P\|Q) \neq D_{\text{KL}}(Q\|P)$) ni l'inégalité triangulaire ($D_{\text{KL}}(P\|R) \not\leq D_{\text{KL}}(P\|Q) + D_{\text{KL}}(Q\|R)$).
\glsunset{hd}
\subsubsection{\acrfull*{hd}}
Soit $X$ et $Y$ deux nuages de points.
\begin{equation}
d_\text{H}(X, Y) = \max \left\{ \sup_{x \in X} \inf_{y \in Y} d(x,y), \sup_{y \in Y} \inf_{x \in X} d(x, y) \right\}
\end{equation}
La distance de Hausdorff est une mesure quantitative utilisée pour évaluer la similarité ou la dissimilarité entre deux ensembles de points dans un espace métrique. Elle calcule la plus grande distance d'un point d'un ensemble à son point le plus proche dans l'autre ensemble. En d'autres termes, elle capture la plus grande distance entre les ensembles, ce qui en fait un outil utile pour comparer des formes, des structures ou des distributions de points.
\glsunset{cd}
\subsubsection{\acrfull*{cd}}
Soit $X$ et $Y$ deux nuages de points.
\begin{equation}
d_{\text{CD}}(X, Y) = \sum_{x \in X} \min_{y \in Y} \|x - y\|^2_2 + \sum_{y \in Y} \min_{x \in X} \|x - y\|^2_2
\end{equation}
La distance de Chamfer est une mesure de similarité entre deux ensembles de points dans un espace métrique. Elle évalue la proximité entre les points des ensembles en calculant la somme des distances entre chaque point d'un ensemble et son point le plus proche dans l'autre ensemble.
\glsunset{emd}
\subsubsection{\acrfull*{emd}}
Soit $X$ et $Y$ deux nuages de points tels que $|X| = |Y|$, et $\phi: X \to Y$ une bijection.
\begin{equation}
d_{\text{EMD}}(X, Y) = \min_{ \phi: X \to Y } \sum_{x \in X} \| x - \phi(x) \|_2
\end{equation}
La distance du transport optimal, également appelée distance du "Earth Mover", est une mesure de similarité entre deux distributions de masse dans un espace métrique. Elle évalue le coût minimum nécessaire pour déplacer une distribution de masse en une autre en respectant certaines contraintes de déplacement. Cette distance est couramment utilisée pour comparer des distributions de données, telles que des histogrammes, des vecteurs de caractéristiques ou des nuages de points, en prenant en compte non seulement les distances entre les éléments correspondants, mais aussi les coûts associés à leur déplacement.
\glsunset{jsd}
\subsubsection{\acrfull*{jsd}}
Soit $S_g$ un ensemble de nuages de points générés et $S_r$ un ensemble de nuages de points de référence.
\begin{equation}
\text{JSD}(S_g, S_r) = \frac12 D_{\text{KL}}(S_g \| M) + \frac12 D_{\text{KL}}(S_r \| M), \quad M = \frac12 (S_g + S_r)
\end{equation}
La divergence de Jensen-Shannon est une mesure de la similarité entre deux distributions de probabilité. Elle est calculée comme la moyenne des \glspl{kld} entre chaque distribution et la moyenne de ces distributions. Contrairement à la \gls{kld}, la \gls{jsd} est symétrique et bornée entre 0 et 1.
Cependant, la \gls{jsd} utilise la distribution globale des nuages de points et non la distribution des nuages de points individuellements. Ainsi, un modèle qui produit toujours une "forme moyenne" peut obtenir un score \gls{jsd} parfait sans apprendre de distributions significatives.
\glsunset{cov}
\subsubsection{\acrfull*{cov}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence et $D$ une distance entre nuages de points.
\begin{equation}
\text{COV}(S_g, S_r) = \frac{ | \{ \argmin_{Y \in S_r} D(X, Y) | X \in S_g \} | }{ |S_r| }
\end{equation}
La couverture évalue le nombre de nuages de points de référence qui sont appariés à au moins une forme générée.
La couverture permet de quantifier la diversité des générations mais est sensible à la perte de modes, cependant elle n'évalue pas la qualité des nuages de points générés.
Ainsi, des nuages de points générés de faible qualité mais diversifiés peuvent obtenir des scores de couverture élevés.
\glsunset{mmd}
\subsubsection{\acrfull*{mmd}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence et $D$ une distance entre nuages de points.
\begin{equation}
\text{MMD}(S_g, S_r) = \frac{1}{|S_r|} \sum_{Y \in S_r} \min_{X \in S_g} D(X, Y)
\end{equation}
La distance de correspondance minimale, est une mesure qui évalue la différence entre deux ensembles ordonnés. Elle calcule la plus petite somme des distances entre les éléments des deux ensembles.
Cependant, la \gls{mmd} est en réalité très peu sensible aux nuages de points de qualité médiocre dans $S_g$, étant donné leur faible probabilité d'être appariés avec des nuages de points réels dans $S_r$. Dans un cas extrême, on pourrait envisager que $S_g$ soit composé principalement de nuages de points de très mauvaise qualité, ainsi que de nuages de point pratiquement identiques à ceux de $S_r$. Dans ce cas, on obtiendrait un score de raisonnablement élevé.
\glsunset{1-nna}
\subsubsection{\acrfull*{1-nna}}
Soit $S_g$ un ensemble de nuages de points générés, $S_r$ un ensemble de nuages de points de référence, $N_X$ les voisins les plus proches de $X$ dans $S_{-X} = S_r \cup S_g - \{X\}$, $N_Y$ les voisins les plus proches de $Y$ dans $S_{-Y} = S_r \cup S_g - \{Y\}$ et $\mathbb{1}$ la fonction indicatrice.
\begin{equation}
\text{1-NNA}(S_g, S_r) = \frac{ \sum_{X \in S_g} \mathbb{1}[N_X \in S_g] + \sum_{Y \in S_r} \mathbb{1}[N_Y \in S_r] }{ |S_g| + |S_r| }
\end{equation}
Pour chaque point d'un ensemble de nuages de points, cette mesure évalue par une classification par plus proche voisin, si celui-ci provient de $S_g$ ou de $S_r$. La précision de cette classification est ensuite calculée comme la moyenne des précisions de chaque point de $S_g$ et de $S_r$.
En supposant que $S_g$ et $S_r$ soient échantillonnés à partir de la même distribution, la précision d'un tel classificateur devrait converger vers 50\% avec un nombre suffisant d'échantillons. Plus la précision se rapproche de 50\%, plus les similarités entre $S_g$ et $S_r$ sont prononcées, ce qui indique une meilleure capacité du modèle à apprendre la distribution cible. Dans notre contexte, le plus proche voisin peut être calculé à l'aide de la \gls{cd} ou de l'\gls{emd}. Contrairement à la \gls{jsd}, le \gls{1-nna} considère la similarité entre les distributions de formes plutôt qu'entre les distributions totale des points. Contrairement au \gls{cov} et au \gls{mmd}, la \gls{1-nna} mesure directement la similarité des distributions et prend en compte à la fois la diversité et la qualité.
Il existe cependant de nombreux autres datasets 3D, tels que ModelNet\cite{wu_3d_2015}, KITTI~\cite{liao_kitti-360_2022}, S3DIS~\cite{armeni_cvpr16} ou encore le récent Objaverse~\cite{deitke_objaverse_2022} et sa version XL~\cite{deitke_objaverse-xl_2023}.
\FloatBarrier
\glsunset{vdm}
@ -555,7 +570,7 @@ Cependant puisque toutes ces opérations sont linéaires et gaussiennes, si l'on
\begin{equation}
q(\boldsymbol{x}_t | \boldsymbol{x}_0) = \mathcal{N} ( \boldsymbol{x}_t; \sqrt{\overline\alpha_t} \boldsymbol{x}_0, (1 - \overline\alpha_t) \mathbf{I} ), \quad \overline\alpha_t = \prod_{t=1}^t \alpha_t
\end{equation}
L'objectif de la diffusion est de trouver une approximation du processus inverse $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t) \approx p(\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$.
L'objectif de la diffusion est de trouver une approximation du processus inverse $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t) \approx p(\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$ (i.e. via un réseau de neurones, conditionnée sur $t$).
Cependant via une dérivation de l'\gls{elbo} et un conditionnement additionnel, on peut montrer que cela revient à minimiser la \gls{kld} entre $q(\boldsymbol{x}_{t-1} | \boldsymbol{x}_t, \boldsymbol{x_0})$ et $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$. Ensuite, via une application de la formule de Bayes, on obtient:
\begin{equation}
q(\boldsymbol{x}_{t-1} | \boldsymbol{x}_t, \boldsymbol{x_0}) \propto \mathcal{N} ( \boldsymbol{x}_{t-1}; \mu_q (\boldsymbol{x}_t, \boldsymbol{x}_0), \Sigma_q (\boldsymbol{x}_t) )
@ -570,7 +585,7 @@ On peut finalement simplifier cette expression via une reparamétrisation:
\end{equation}
Si l'on réeffectue une dérivation de l'\gls{elbo} avec ces nouvelles expressions, on en conclut qu'il suffit de trouver une approximation $\epsilon_\theta (\boldsymbol{x}_t, t) \approx \epsilon_0$. En pratique on utilise un réseau de neurones que l'on entraine à minimiser $\| \epsilon_0 - \epsilon_\theta (\boldsymbol{x}_t, t) \|_2^2$. Une fois cette approximation trouvée, on peut facilement remonter à $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$. Formellement, l'entrainement de ce réseau de neurones est décrit dans l'algorithme \ref{alg:ddpm_training}.
\begin{algorithm}
\begin{algorithm}[h!]
\caption{DDPM training}
\label{alg:ddpm_training}
\begin{algorithmic}[1]
@ -587,9 +602,9 @@ Si l'on réeffectue une dérivation de l'\gls{elbo} avec ces nouvelles expressio
\end{algorithmic}
\end{algorithm}
Après avoir achevé l'entraînement adéquat de notre modèle, on peut désormais appliquer $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$ itérativement pour passer d'un échantillon $x_T$ à sa prédiction $\hat{x}_0$. Dans les faits, le réseau commence à halluciner des reconstructions qui présentent une forte ressemblance avec nos données d'entraînement, il génère donc de nouvelles données. Formellement, l'échantillonnage est décrit dans l'algorithme \ref{alg:ddpm_sampling}.
Après avoir achevé l'entraînement adéquat de notre modèle, on peut désormais appliquer $p_\theta (\boldsymbol{x}_{t-1} | \boldsymbol{x}_t)$ itérativement pour passer d'un échantillon $x_T$ à sa prédiction $\hat{x}_0$. Dans les faits, le réseau génère des reconstructions qui ressemblent fortement à nos données d'apprentissage, créant ainsi de nouvelles données. Formellement, l'échantillonnage est décrit dans l'algorithme \ref{alg:ddpm_sampling}.
\begin{algorithm}
\begin{algorithm}[h!]
\caption{DDPM sampling}
\label{alg:ddpm_sampling}
\begin{algorithmic}[1]
@ -626,7 +641,7 @@ Une amélioration significative des \glspl{vdm} réside dans la mise en œuvre i
Les \glspl{vae} sont fréquemment employés à cet effet. L'entrainement des \glspl{ldm} ne changent pas par rapport aux \glspl{vdm}, seul le domaine d'apprentissage du modèle est modifié. Ainsi cette approche induit généralement une réduction de la complexité du réseau, entraînant ainsi une diminution du temps nécessaire à l'entraînement, tout en exerçant une influence forte sur la qualité des résultats obtenus.
\FloatBarrier
% \FloatBarrier
\subsubsection{Conditionnement \& Guidance}
Jusqu'à présent, les modèles génératifs ont démontré leur capacité à générer des données conformes à une distribution de données apprise. Cependant, il est fréquemment nécessaire d'échantillonner une sous-distribution spécifique de nos données. À cette fin, il est possible de conditionner le modèle en utilisant une seconde donnée d'entrée, tel qu'une image, un scalaire, un audio, ou du texte, à l'instar des modèles de type \gls{t2i} tels que DALL·E 2 ou Stable Diffusion.
@ -654,14 +669,12 @@ On identifie alors:
\begin{figure}[h!]
\centering
\includegraphics[width=0.8\textwidth]{classifier-guidance.png}
\caption{Gradients du classificateur de la Classifier Guidance.}
\caption{Gradients de $f_\phi (y | \boldsymbol{x}_t)$ de la Classifier Guidance.}
\vspace*{-11pt}
\caption*{Source: \href{https://perceptron.blog/defusing-diffusion/}{Perceptron.blog, 2023}.}
\label{fig:classifier_guidance}
\end{figure}
% https://perceptron.blog/defusing-diffusion/
La seconde méthode est appelée Classifer-Free Guidance~\cite{ho_classifier-free_2022, nichol_glide_2022} et repose sur l'entraînement d'un unique réseau de neurones ayant pour objectif d'apprend à la fois la distribution conditionnelle et non conditionnelle. En réarrangeant l'équation \ref{eq:165}, on obtient:
\begin{equation}
\nabla_{\boldsymbol{x}_t} \log p (y | \boldsymbol{x}_t) = \nabla_{\boldsymbol{x}_t} \log p (\boldsymbol{x}_t, y) - \nabla_{\boldsymbol{x}_t} \log p (\boldsymbol{x}_t) \label{eq:rearange}
@ -691,7 +704,7 @@ Cette approche présente divers avantages:
\end{itemize}
Formellement, l'algorithme d'entraînement par \gls{cfg} est décrit dans l'algorithme \ref{alg:classifier-free-guidance}, l'agorithme d'échantillonnage est décrit dans l'algorithme \ref{alg:classifier-free-guidance-sampling}.
\begin{algorithm}
\begin{algorithm}[h!]
\caption{DDPM training with classifier-free guidance}
\label{alg:classifier-free-guidance}
\begin{algorithmic}[1]
@ -711,7 +724,7 @@ Formellement, l'algorithme d'entraînement par \gls{cfg} est décrit dans l'algo
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\begin{algorithm}[h!]
\caption{DDPM sampling with classifier-free guidance}
\label{alg:classifier-free-guidance-sampling}
\begin{algorithmic}[1]
@ -734,12 +747,6 @@ Formellement, l'algorithme d'entraînement par \gls{cfg} est décrit dans l'algo
Dans notre cas d'application, nous pouvons conditionner sur les scalaires représentant les performances de nos maillages.
% https://liorsinai.github.io/coding/2023/01/04/denoising-diffusion-3-guidance.html#guided-diffusion
% \cite{zhou_3d_2021}
% \cite{nguyen_point-set_2021}
% \cite{zeng_lion_2022}
\FloatBarrier
\glsunset{arm}
\subsection{\acrfull*{arm}}
@ -755,8 +762,6 @@ Dans notre cas d'application, nous pouvons conditionner sur les scalaires repré
Les modèles auto-régressifs sont des méthodes de génération de séquences qui utilisent les éléments précédents pour prédire chaque élément suivant. Ces modèles sont largement utilisés dans le domaine du traitement du langage naturel, où ils ont montré d'excellentes performances. Cependant, l'application de ces modèles à la génération de graphes présente des défis particuliers en raison de la structure complexe des graphes. En effet, les graphes sont des structures de données non régulières et non séquentielles, ce qui rend difficile l'utilisation des modèles auto-régressifs. Malgré cela, plusieurs approches~\cite{nash_polygen_2020,liao_efficient_2020} ont été proposées pour adapter ces modèles à la génération de graphes. Cependant, il est important de noter que ces modèles deviennent de moins en moins précis de manière exponentielle à mesure que la taille de la séquence à générer augmente. De ce fait nous n'avons pas encore utilisé ces modèles dans nos travaux.
% fouttre des figures algos, ça sera plus simple
\FloatBarrier
\glsunset{nerf}
\subsection{\acrfull*{nerf}}
@ -823,10 +828,7 @@ Chaque aube du jeu de données est une déformation d'une aube nominale. Ainsi t
Chaque échantillon est constitué de deux fichiers distincts. Le premier est un fichier au format .vtk qui contient le maillage de l'aube, comprenant les positions 3D, les normales et la connectivité de chaque point du maillage. Ce fichier .vtk inclut également les champs physiques associés à chaque point, tels que la température, la pression, etc. Le second fichier est un fichier .csv contenant des métadonnées globales spécifiques à l'échantillon, telles que les entrées et les sorties de la simulation \gls{cfd}. L'ensemble de ces fichiers pèsent environ 60 \gls{go} et sont stockés dans un dossier spécifique read-only sur le cluster de calcul de Safran.
% TODO: rajouter la liste exhaustive de **tous** les champs phyisques
% TODO: mettre ici un plot de la distribution des données (perfs + positions et autres)
Cet ensemble de données peut être séparé en deux sous-ensembles : un ensemble d'apprentissage de 1000 échantillons (83\% des données) et un ensemble de validation de 200 échantillons (17\% des données). L'ensemble d'apprentissage est utilisé pour entraîner les modèles génératifs, tandis que l'ensemble de validation est utilisé pour évaluer les performances des modèles génératifs.
Cet ensemble de données peut être séparé en deux sous-ensembles: un ensemble d'apprentissage de 1000 échantillons (83\% des données) et un ensemble de validation de 200 échantillons (17\% des données). L'ensemble d'apprentissage est utilisé pour entraîner les modèles génératifs, tandis que l'ensemble de validation est utilisé pour évaluer les performances des modèles génératifs.
Afin de simplifier le chargement des données, j'ai choisi d'utiliser la bibliothèque HuggingFace Datasets~\cite{lhoest-etal-2021-datasets}. Cette bibliothèque se distingue par son utilisation innovante de la technologie Apache Arrow~\cite{arrow} pour stocker les données de manière tabulaire en colonnes, permettant des lectures sans copie (zero copy reads) ainsi que des opérations de mapping efficaces prenant en charge le multi-threading. Grâce à une approche de chargement paresseux (lazy loading), elle évite les problèmes de mémoire et assure la reproductibilité en sauvegardant en cache les transformations intermédiaires des données.
@ -839,8 +841,6 @@ En complément de Rotor37\_1200, j'ai également effectué des travaux sur un en
\label{fig:example-rotor37-11000}
\end{figure}
% parler de la simulation full, qui comporte plusieurs millions de points, ainsi que la nacelle ?
\FloatBarrier
\section{Description de l'environnement de travail}
@ -853,8 +853,6 @@ En outre, chaque employé a accès à la suite professionnelle Office 365, qui f
La stack technique utilisée par l'équipe est basée sur Python, avec des bibliothèques telles que PyTorch, PyTorch Geometric, PyTorch Lightning, NumPy, SciPy, GPy, Matplotlib, Seaborn, Scikit-Learn, etc. Nous utilisons également des outils de gestion d'environnement virtuels Python tels que Conda et Micromamba, ainsi que de l'outils de versionnement git. Le cluster de calcul étant coupé d'internet, nous utilisons un artifcatory pour télécharger les dépendances nécessaire à nos projets.
% TODO: décrire le process de réservation slurm ?
\FloatBarrier
\section{Application de l'état de l'art}
@ -880,11 +878,11 @@ Nous avons ensuite étendu ces expérimentations à des architectures spécifiqu
\label{fig:graphvar_results}
\end{figure}
En effet, dans le contexte des graphes, les opérations de "upsampling" n'existent pas de manière directe. Par conséquent, nous avons rencontré des difficultés lors du passage du vecteur latent (représentant une distribution gaussienne) à une représentation sous forme de graphe (noeuds + connectivité) dans le décodeur du \gls{vae}.
En effet, dans le contexte des graphes, les opérations de ``upsampling" n'existent pas de manière uniquel. Par conséquent, nous avons rencontré des difficultés lors du passage du vecteur latent (représentant une distribution gaussienne) à une représentation sous forme de graphe (noeuds + connectivité) dans le décodeur du \gls{vae}.
Une première solution simple consistait en l'utilisation de une ou plusieurs couches denses (\glspl{mlp}) pour convertir le vecteur latent en un couple de matrices décrivant les positions et la connectivité des noeuds. Cependant, cette approche posait problème en raison de la taille des graphes que nous manipulions. En effet, avec des graphes de $n=3.10^4$ nœuds, cela impliquait une matrice de connectivité de taille $n^2 = 9.10^8$, ce qui faisait aisaiment exploser la complexité lorsque nous utilisions des couches denses.
Une première solution simple consistait en l'utilisation de une ou plusieurs couches denses (\glspl{mlp}) pour convertir le vecteur latent en un couple de matrices décrivant les positions et la connectivité des noeuds. Cependant, cette approche posait problème en raison de la taille des graphes que nous manipulions. En effet, avec des graphes de $n = \SI{3.0e4}{}$ nœuds, cela impliquait une matrice de connectivité de taille $n^2 = \SI{9.0e8}{}$, ce qui faisait aisaiment exploser la complexité lorsque nous utilisions des couches denses.
Pour donner un ordre de grandeur, si l'on utilisait un espace latent de taille $8$, rien que pour prédire les positions 3D des points dans notre maillage (sans prendre en compte la connectivité), l'utilisation d'une seule couche dense impliquait déjà $8 \times 3.10^4 \times 3 = 7,2.10^6$ paramètres. Prédire la connectivité était tout simplement impossible, car il aurait fallu une couche dense avec plus de $8 \times (3.10^4)^2 = 7,2.10^9$ paramètres, ce qui dépassait largement les capacités de calcul de nos ressources GPU.
Pour donner un ordre de grandeur, si l'on utilisait un espace latent de taille $8$, rien que pour prédire les positions 3D des points dans notre maillage (sans prendre en compte la connectivité), l'utilisation d'une seule couche dense impliquait déjà $\SI{7.2e6}{}$ paramètres. Prédire la connectivité était tout simplement impossible, car il aurait fallu une couche dense avec plus de $\SI{7.2e9}{}$ paramètres, ce qui dépassait largement les capacités de calcul de nos ressources GPU.
Une seconde solution consitait à utiliser une architecture plus intelligente, telle que Graph U-Net~\cite{gao_graph_2019}. Cette approche permettait d'éviter l'utilisation de couches denses dans le décodeur grâce à des connexions résiduelles (skip connections). Cependant, ce faisant l'information ne passait pas entièrement par l'espace latent entre le décodeur et l'encodeur. Par conséquent, il était impossible de créer un modèle génératif complet avec cette architecture, puisqu'une partie de l'information pour générer des échantillons était compris dans les skip connections.
@ -897,30 +895,6 @@ Une seconde solution consitait à utiliser une architecture plus intelligente, t
Face aux difficultés rencontrées avec les réseaux basés sur les VAE et les limitations de l'architecture Graph U-Net, nous avons pris la décision de mettre de côté ces approches. Et plus largement puisque la connectivité de nos graphes est "locale" (les noeuds des nos maillages sont connectés à leurs voisins proches dans l'espace), nous avons décidé de nous orienter vers des approches basées uniquement sur les positions des noeuds. En effet, la connectivité d'un nuage de points peut être retrouvé via diverses techniques~\cite{peng_shape_2021,sulzer_deep_2022,andrade-loarca_poissonnet_2023}.
\FloatBarrier
\subsection{Test de PointFlow}
L'approche la plus connue pour utiliser des \glspl{nf} sur des nuages de points est PointFlow~\cite{yang_pointflow_2019}. Adapter l'implémentation originale afin d'y intégrer l'utilisation de Rotor37\_1200 s'est avéré être une tâche aisée, entraînant des résultats supérieurs à ceux obtenus par GraphVAE, bien que sans être exceptionnels. La structure du code s'est cependant révélée relativement difficile à manipuler pour toute autre tâche plus complexe (comme souvent avec du code académique).
\begin{figure}[h!]
\centering
{\Huge \calligra Fuck Rosetta}
\caption{Résultats de PointFlow sur Rotor37\_1200.}
\label{fig:pointflow_results}
\end{figure}
PointFlow a néanmoins apporté une contribution significative à la création d'un dataset de référence ShapeNet15K pour la génération de nuages de points, qui est actuellement exploité par de multiples articles de recherche. ShapeNet15K repose sur ShapeNet~\cite{shapenet2015}, un ensemble de données dédiée à une variété d'objets en trois dimensions (tels que des avions, des chaises, des voitures, etc.), modifié par Furthest Point Sampling pour contenir uniquement 2048 points par nuages.
De plus, PointFlow a joué un rôle essentiel dans l'implémentation de différentes métriques et distances en CUDA, telles que la \gls{cd}, l'\gls{emd}, et bien d'autres.
\begin{figure}[h!]
\centering
\includegraphics[width=0.9\textwidth]{shapenet.png}
\caption{Exemple de datasets d'objets 3D.}
\label{fig:shapenet}
\end{figure}
Il existe cependant de nombreux autres datasets 3D, tels que ModelNet\cite{wu_3d_2015}, KITTI~\cite{liao_kitti-360_2022}, S3DIS~\cite{armeni_cvpr16} ou encore le récent Objaverse~\cite{deitke_objaverse_2022} et sa version XL~\cite{deitke_objaverse-xl_2023}.
\FloatBarrier
\subsection{Présentation de PointNet}
@ -941,28 +915,28 @@ Par la suite, une avancée significative du modèle PointNet a conduit à l'éme
\begin{figure}[h!]
\centering
\includegraphics[width=0.8\textwidth]{kpconv-architecture.png}
\caption{Architecture de KP-FCNN et KP-CNN, construit avec des \glspl{kpconv}.}
\caption{Architecture de \gls{kpfcnn} et \gls{kpcnn}, basés sur des \glspl{kpconv}.}
\label{fig:kpconv_archi}
\end{figure}
Une autre architecture largement reconnue dans le domaine du traitement de nuages de points, présentant des similitudes avec PointNet++, est nommée \gls{kpconv}~\cite{thomas_kpconv_2019}. Cette architecture utilise un échantillonnage basé sur une grille de voxels et des opérations d'agrégation via des \glspl{kpconv}, qui sont des convolutions sur boules. Cette architecture est également très efficace, et surpasse généralement les autres architectures sur les taches de segmentation.
Une autre architecture largement reconnue dans le domaine du traitement de nuages de points, présentant des similitudes avec PointNet++, est nommée \gls{kpconv}~\cite{thomas_kpconv_2019}. Cette architecture utilise un échantillonnage basé sur une grille de voxels et des opérations d'agrégation via des \glspl{kpconv}, qui sont des convolutions sur boules. Les auteurs de \gls{kpconv} proposent deux architectures, \gls{kpconv} permettant de traiter des problèmes de classification, et \gls{kpfcnn} permettant de traiter des problèmes de segmentation. Ces deux architectures sont illustrées sur la figure~\ref{fig:kpconv_archi}.
\FloatBarrier
\subsection{Test de KP-FCNN}
\subsection{Test de \gls{kpfcnn}}
Dans notre situation, nous avons la possibilité d'opter pour le réseau KP-FCNN, initialement conçu pour la segmentation, mais pouvant être ajusté pour la prédiction de bruit pour une utilisation dans \gls{ddpm}. À cette fin, nous faisons usage de la bibliothèque easy\_kpconv, implémentant les \glspl{kpconv} et nous permettant de créer un code clair et réutilisable.
Dans notre situation, nous avons la possibilité d'opter pour le réseau \gls{kpfcnn}, initialement conçu pour la segmentation, mais pouvant être ajusté pour la prédiction de bruit pour une utilisation dans \gls{ddpm}. À cette fin, nous faisons usage de la bibliothèque easy\_kpconv, implémentant les \glspl{kpconv} et nous permettant de créer un code clair et réutilisable.
\begin{figure}[h!]
\centering
\includegraphics[width=0.8\textwidth]{kpfcnn-results.png}
\caption{Résultats de KP-FCNN sur Rotor37\_1200.}
\includegraphics[width=0.3333\textwidth]{sample_1_kpfcnn.png}\includegraphics[width=0.3333\textwidth]{sample_2_kpfcnn.png}\includegraphics[width=0.3333\textwidth]{sample_3_kpfcnn.png}
\caption{Résultats d'un \gls{vdm} \gls{kpfcnn} sur Rotor37\_1200.}
\label{fig:kpfcnn_results}
\end{figure}
Comme on l'observe dans la figure~\ref{fig:kpfcnn_results}, cette architecture permet de générer des nuages de points en forme d'aube. Cependant, on remarque que les générations sont d'assez mauvaise qualité puisque les nuages de points semblent comporter une part de bruit résiduel importante. Certaines générations ne ressemblent de même pas du tout à des aubes, mais plutôt à des nuages de points aléatoires.
Autre point négatif, le decodeur de KP-FCNN étant composé de \glspl{mlp}, il n'est pas scalable. En effet le réseau actuel comporte environ 4 millions de paramètres, dont une large majorité se situent dans le décodeur.
Comme illustré dans la Figure~\ref{fig:kpfcnn_results}, lorsque cette architecture est associée à un modèle de diffusion, elle démontre la capacité de générer des nuages de points adoptant une structure en forme d'aube. Cependant, on remarque que les générations sont d'assez mauvaise qualité puisque les nuages de points semblent comporter une part de bruit résiduel importante. Certaines générations ne ressemblent même pas du tout à des aubes, mais plutôt à des nuages de points aléatoires.
Autre point négatif, le decodeur de \gls{kpfcnn} étant composé de \glspl{mlp}, il n'est pas scalable. En effet le réseau actuel comporte environ 4 millions de paramètres, dont une très large majorité se situent dans le décodeur.
% TODO verif le nb de params
% TODO: verif le nb de params
\FloatBarrier
\subsection{Présentation des \acrfullpl*{pvconv}}
@ -993,12 +967,12 @@ Le premier papier ayant utilisé une architecture du type PVCNN++ pour la géné
\begin{figure}[h!]
\centering
\includegraphics[width=0.8\textwidth]{pvd-results.png}
\includegraphics[width=0.45\textwidth]{pvd_sample_front.png}\includegraphics[width=0.45\textwidth]{pvd_sample_inside.png}
\caption{Résultats de PVD sur Rotor37\_1200.}
\label{fig:pvd_results}
\end{figure}
Comme on l'observe sur la figure~\ref{fig:pvd_results}, les générations que produisent PVD sont de très bonne qualité. Contrairement à KP-FCNN, les générations ne présentent pas de bruits résiduels. Cependant PVD est un réseau assez lourd, (27,6 millions de paramètres) et nécéssite un entrainement plutot long d'environ 10 heures pour produire de bon résultats.
Comme on l'observe sur la figure~\ref{fig:pvd_results}, les générations que produisent PVD sont de très bonne qualité. Contrairement à \gls{kpfcnn}, les générations ne présentent pas de bruits résiduels, la densité des points générés correspond à celle présente dans les données d'entrainement, cependant on remarque quand même quelques points au centre de l'aube, ce qui pourrait impacter la reconstruction d'un maillage. De plus, PVD est un réseau assez lourd, (27,6 millions de paramètres) et nécéssite un entrainement plutot long d'environ 10 heures pour produire de bon résultats.
\FloatBarrier
\glsunset{ldm}
@ -1096,12 +1070,6 @@ Ainsi si l'on entraine un \gls{gp} sur des couples (nuage de points, critère de
\label{fig:gp_train_30_pca}
\end{figure}
% \begin{figure}[h!]
% \centering
% \includegraphics[width=1\textwidth]{gp_train_32_pod.png}
% \caption{Entrainement d'un \gls{gp} sur 32 modes POD de Rotor37\_1200}
% \end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=1\textwidth]{gp_massflow_1_pca.png}
@ -1116,7 +1084,11 @@ Ainsi si l'on entraine un \gls{gp} sur des couples (nuage de points, critère de
\label{fig:gp_efficiency_1_pca}
\end{figure}
Comme illustré dans les figures \ref{fig:gp_massflow_1_pca} et \ref{fig:gp_efficiency_1_pca}, il est nettement observable qu'il y a un changement dans la densité de probabilité des modes \glspl{pca} lorsque nous conditionnons nos générations. Cette observation claire indique que notre modèle est compétent pour générer avec précision des données conditionnées. En outre, on peut également constater sa capacité à générer des données qui se situent en dehors de la distribution d'entraînement, à condition que ces données demeurent relativement proches de ladite distribution. Par exemple, il est totalement inenvisageable de demander la génération d'aubes ayant des valeurs différentes pour les attributs in\_massflow et out\_massflow. Cette impossibilité résulte du fait que de telles combinaisons ne se trouvent pas dans le jeu de données d'entraînement, et qu'elles sont également physiquement incohérentes dans un système clos.
La figure~\ref{fig:gp_train_30_pca} illustre la validation du modèle de processus gaussien (\gls{gp}) en utilisant des données de test. En traçant la prédiction du \gls{gp} par rapport aux valeurs réelles, on observe une relation linéaire avec une pente de 1. Cette observation est confirmée numériquement par la proximité de $Q^2$ à 1. Ces résultats indiquent que le \gls{gp} est capable de prédire les indicateurs de performance des aubes, en se basant sur leurs modes \gls{pca}.
De manière complémentaire, il est intéressant de noter que les distributions de in\_massflow, out\_massflow et compression\_rate présentent une grande similitude. Cette similarité est attendu, étant donné la forte corrélation physique entre ces trois critères. Un schéma similaire se manifeste entre les distributions de isentropic\_efficiency et polyentropic\_efficiency.
Comme illustré dans les figures \ref{fig:gp_massflow_1_pca} et \ref{fig:gp_efficiency_1_pca}, il est nettement observable qu'il y a un changement dans la densité de probabilité des critères de performance lorsque nous conditionnons nos générations. Cette observation suggère que le conditionnement du modèle a effectivement un impact sur les critères de performance, selon le \gls{gp}. Cependant, pour confirmer cette hypothèse, il faudrait de procéder à une simulation numérique \gls{cfd}. En outre, on peut également constater sa capacité à générer des données qui se situent en dehors de la distribution d'entraînement, à condition que ces données demeurent relativement proches de ladite distribution. Par exemple, il est totalement inenvisageable de demander la génération d'aubes ayant des valeurs différentes pour les attributs in\_massflow et out\_massflow. Cette impossibilité résulte du fait que de telles combinaisons ne se trouvent pas dans le jeu de données d'entraînement, et qu'elles sont également physiquement incohérentes dans un système clos.
\FloatBarrier
\chapter{Conclusion}
@ -1131,12 +1103,6 @@ En perspective d'amélioration, il serait pertinent d'explorer des méthodes vis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\appendix
% TODO: faire une annexe avec une chié de formules
%% ajouter les annexes ici
\backmatter
\addcontentsline{toc}{chapter}{Bibliographie}