\documentclass[
  11pt,
  a4paper,
  twoside,
  openany
]{book}

% Packages
\usepackage{fontspec}
\usepackage[nomath]{libertinus-otf}
\usepackage[a4paper, hmargin=2cm, vmargin=3cm]{geometry}
\usepackage{graphicx}
\usepackage{microtype}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{bbold}
\usepackage[numbers]{natbib}
\usepackage[french]{babel}
\usepackage{nomencl}
\usepackage{caption}
\usepackage{placeins}

% pdfx loads both hyperref and xcolor internally
% \usepackage{hyperref}
% \usepackage{xcolor}
\usepackage[a-3u]{pdfx}

% We use \hypersetup to pass options to hyperref
\hypersetup{
  colorlinks = true,
  breaklinks = true,
}

% must be loaded after hyperref
\usepackage{glossaries}
\renewcommand*{\glstextformat}[1]{\textcolor{black}{#1}}

% paragraph settings
\setlength{\parindent}{0cm}
\setlength{\parskip}{7pt}%

% assets path
\graphicspath{{../assets/}}

% header and footer settings
\usepackage{lastpage}
\usepackage{fancyhdr}

% normal pages
\pagestyle{fancy}
\fancyhf{}
\rfoot{\hypersetup{hidelinks}\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0pt}% Line at the header invisible
\renewcommand{\footrulewidth}{0pt}% Line at the footer invisible

% chapter pages
\fancypagestyle{plain}{
  \fancyhf{}
  \rfoot{\hypersetup{hidelinks}\thepage/\pageref{LastPage}}
  \renewcommand{\headrulewidth}{0pt}% Line at the header invisible
  \renewcommand{\footrulewidth}{0pt}% Line at the footer invisible
}

\title{
  \huge \textbf{Rapport de Projet de Fin d'Études}
}
\author{
  Laurent Fainsin \\
  {\tt laurent@fainsin.bzh}
}
\date{
  \vspace{10.5cm}
  Département Sciences du Numérique \\
  Troisième année \\
  2022 — 2023
}

\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\argmin}{arg\,min}

\newacronym{n7}{ENSEEIHT}{École nationale supérieure d'électrotechnique, d'électronique, d'informatique, d'hydraulique et des télécommunications}
\newacronym{pfe}{PFE}{Projet de Fin d'Études}

\newacronym{ml}{ML}{Machine Learning}
\newacronym{dl}{DL}{Deep Learning}
\newacronym{ai}{AI}{Artificial Intelligence}
\newacronym{ann}{ANN}{Artificial Neural Network}
\newacronym{pde}{PDE}{Partial Differential Equation}
\newacronym{mse}{MSE}{Mean Squared Error}
\newacronym{mae}{MAE}{Mean Absolute Error}
\newacronym{rmse}{RMSE}{Root Mean Squared Error}
\newacronym{mape}{MAPE}{Mean Absolute Percentage Error}

\newacronym{pca}{PCA}{Principal Component Analysis}
\newacronym{pod}{POD}{Proper Orthogonal Decomposition}
\newacronym{relu}{ReLU}{Rectified Linear Unit}
\newacronym{mlp}{MLP}{Multi-Layer Perceptron}

\newacronym{cfd}{CFD}{Computational Fluid Dynamics}
\newacronym{cnn}{CNN}{Convolutional Neural Network}
\newacronym{pvcnn}{PVCNN}{Point-Voxel CNN}

\newacronym{gnn}{GNN}{Graph Neural Networks}
\newacronym{gan}{GAN}{Generative Adversarial Network}
\newacronym{ae}{AE}{Auto-Encoder}
\newacronym{vae}{VAE}{Variational Auto-Encoder}

\newacronym{nf}{NF}{Normalizing Flows}

\newacronym{kld}{KLD}{Kullback-Leibler Divergence}
\newacronym{hd}{HD}{Haussdorf Distance}
\newacronym{cd}{CD}{Chamfer Distance}
\newacronym{emd}{EMD}{Earth Mover Distance}
\newacronym{jsd}{JSD}{Jensen-Shannon Divergence}
\newacronym{cov}{COV}{Coverage}
\newacronym{mmd}{MMD}{Minimum Matching Distance}
\newacronym{1-nna}{1-NNA}{1-Nearest Neighbor Accuracy}

\newacronym{vdm}{VDM}{Variational Diffusion Model}
\newacronym{ldm}{LDM}{Latent Diffusion Model}
\newacronym{cfg}{CFG}{Classifier-Free Guidance}
\newacronym{ddpm}{DDPM}{Denoising Diffusion Probabilistic Model}

\newacronym{arm}{ARM}{Auto-Regressive Model}
\newacronym{nerf}{NeRF}{Neural Radiance Fields}

\newacronym{gp}{GP}{Gaussian Process}

\makenoidxglossaries
% \makeglossaries

% \nomenclature{DDPM}{test}
% \makenomenclature

\begin{document}

\frontmatter

\vbox{
  \centering
  \includegraphics[width=5cm]{inp_n7.jpg}
  \hspace{1cm}
  \includegraphics[width=5cm]{safran_logo.png}
  \vspace{2cm}
  \maketitle
}

{
  \thispagestyle{empty}
  \chapter*{Remerciements}
  \addcontentsline{toc}{chapter}{Remerciements}
}

Je tiens à remercier Xavier Roynard, Michel 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.

\clearpage

{
  \hypersetup{hidelinks}
  \addcontentsline{toc}{chapter}{Table des matières}
  \tableofcontents
}

\clearpage

{
  \hypersetup{hidelinks}
  \addcontentsline{toc}{chapter}{Table des figures}
  \listoffigures
}

\clearpage

{
  \hypersetup{hidelinks}
  \addcontentsline{toc}{chapter}{Glossaire}
  \printnoidxglossaries
  % \printglossaries
}

% {
%   \hypersetup{hidelinks}
%   \addcontentsline{toc}{chapter}{Nomenclature}
%   \printnomenclature
% }

% \listoftables
% \addcontentsline{toc}{chapter}{Liste des tableaux}

\mainmatter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\glsresetall

\chapter{Introduction}

\section{Présentation de l'entreprise}

yoink un truc à Xavier, flemme de réécrire wikipedia

\section{Contexte du stage}

\begin{figure}[h]
  \centering
  \includegraphics[width=16cm]{aube.jpg}
  \caption{Aubes du moteur Leap-1A}
  \vspace*{-11pt}
  \caption*{Copyright \href{https://medialibrary.safran-group.com/Photos/media/179440}{Cyril Abad / CAPA Pictures / Safran}}
\end{figure}

Dans le domaine industriel, les codes de simulation numérique sont désormais un outil indispensable pour la conception de systèmes complexes, en particulier pour les modules de réacteurs d'avions ou d'hélicoptères.

De telles simulations sont par exemple utilisées pour évaluer les performances aérodynamiques d'un composant tel qu'une aube de turbine. En partant d'une géométrie de nominale, dans la phase d'optimisation, la pièce est progressivement modifiée afin d'optimiser certaines quantités d'intérêt.

Malheureusement, ce processus de conception itératif présente deux limites:
\begin{itemize}
  \item Le coût de calcul d'une simulation numérique de type \gls{cfd} est lourd, plusieurs heures sont nécessaires pour un unique calcul.
  \item Le nombre de degrés de liberté pour la géométrie d'un profil complexe discrétisée avec un maillage non structuré est important, ce qui rend impossible l'exploration complète de l'espace de recherche de la solution optimale.
\end{itemize}

\smallskip
Les approches d'optimisation assistées par surfaces de réponse permettent de répondre partiellement à ces difficultés. Cependant cette stratégie admet deux limitations intrinsèques:
% citation needed for surface de réponse
\begin{itemize}
  \item Elles nécessitent un long de travail de paramétrisation.
  \item Elles souffrent grandement du fléau de la dimension (i.e. la taille des problèmes considérés est généralement limitée).
\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.

Récemment, les modèles génératifs profonds comme les \gls{vae} ou les \gls{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.

Cependant, dans le cas de la simulation numérique, les données prennent souvent la forme de graphes en raison de l'utilisation de maillages pour représenter les surfaces des pièces à concevoir. Dans le contexte d'une application industrielle, il est donc crucial d'adapter les modèles susmentionnés afin de pouvoir utiliser des données non structurées en entrée. Les \gls{gnn} permettent de traiter des données non structurées telles que des maillages ou des nuages de points.

Différentes solutions ont été proposées dans la littérature pour réaliser des convolutions et agrégations sur graphes ou nuages de points. Cependant, peu d'entre elles conviennent à l'application des réseaux sur graphes sur des données générées par des simulations numériques, car l'ordre de grandeur du nombre de nœuds est généralement trop important.

Le but de ce stage est d'évaluer le potentiel de ces nouvelles méthodes sur des jeux de données réalisés en internes et représentatifs pour Safran. Et éventuellement de proposer des améliorations spécifiques aux maillages utilisés en simulations numériques.

L'étude vise tout d'abord à étudier la bibliographie disponible d'un côté sur les modèles génératifs et d'un autre sur les réseaux convolutionnels sur graphes. L'objectif est, dans une première phase, de faire un benchmark des différentes solutions de modèles génératifs sur graphe de type \gls{vae} et \gls{gan} afin de créer une représentation latente des géométries d'aubes 3D. Pour cela un dataset avec quelques milliers d'échantillons d'aubes 3D et leurs performances aérodynamique est disponible à Safran. Le modèle résultant sera ensuite testé pour générer de nouvelles géométries et pour prédire les quantités d'intérêt par le biais de métamodèles classiques. Enfin, si l'avancement sur les premières tâches le permet, d'autres modèles génératifs peuvent être considérés comme le \gls{nf} ou les \gls{vdm}.

\chapter{État de l'art}

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ées 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.

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.

\FloatBarrier
\glsreset{gnn}
\section{\gls{gnn}}

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.

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{example-graphs.jpg}
  \caption{Exemple de graphes}
  \vspace*{-11pt}
  \caption*{Source: \href{https://blogs.nvidia.com/blog/2022/10/24/what-are-graph-neural-networks/}{NVIDIA, 2022}}
  \label{fig:graph_example}
\end{figure}

Les \gls{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 \gls{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{Modèles génératifs}

Les modèles génératifs sont une famille de modèles qui permettent de générer de nouvelles données d'une distribution de données au préalablement apprise. Ces modèles sont très utilisés dans le domaine de l'apprentissage automatique pour générer des images, du texte ou encore de la musique. Ces modèles sont encore relativement peu utilisés dans le domaine de l'ingénierie pour générer des pièces industrielles.

Il existe plusieurs sous familles de modèles génératifs, chacune basées sur des principes différents, possédant ainsi des avantages et des inconvénients. Il est donc important de bien comprendre les différences entre ces modèles pour pouvoir choisir le modèle le plus adapté à la problématique. Plusieurs études ont déjà été réalisées pour comparer ces modèles, nous nous baserons donc partiellement sur ces études\cite{faez_deep_2020,guo_systematic_2022,zhu_survey_2022} pour présenter les modèles les plus pertinents pour notre problématique.

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{generative-overview.png}
  \caption{Principales familles de modèles génératifs}
  \vspace*{-11pt}
  \caption*{Source: \href{https://lilianweng.github.io/posts/2021-07-11-diffusion-models/}{Lilian Weng, 2021}}
  \label{fig:generative_models}
\end{figure}

\FloatBarrier
\glsreset{gan}
\subsection{\gls{gan}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{gan-architecture.png}
  \caption{Architecture d'un \gls{gan}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://lilianweng.github.io/posts/2017-08-20-gan/}{Lilian Weng, 2017}}
  \label{fig:gan-architecture}
\end{figure}

Les \gls{gan} sont la famille de modèles génératifs la plus renommée et également la plus ancienne\cite{goodfellow_generative_2014}. Ces modèles reposent sur un principe compétitif impliquant deux réseaux de neurones. 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 \gls{gan} ont su démontrer leur efficacité pour générer des images réalistes. Cependant, ces modèles sont très difficiles à entraîner\cite{arjovsky_towards_2017}. Les \gls{gan} sont par exemple suceptibles à de nombreux problème\cite{zhao_bias_2018}, tel que le problème de \textit{mode collapse}, où le générateur génère toujours la même image, mais aussi le problème de \textit{non convergence}, où le générateur et/ou le discriminateur ont une fonction de cout instable et ne convergent ainsi pas vers un équilibre de Nash, ou encore au problème de \textit{vanishing gradient}, où le discriminateur devient trop efficace et empêche le générateur d'apprendre.

Au fil des années, de nombreuses améliorations\cite{salimans_improved_2016}, variations (WGAN\cite{arjovsky_wasserstein_2017}, etc.) et cas d'applications (CycleGAN\cite{zhu_unpaired_2020}, SGAN\cite{odena_semi-supervised_2016}, SRGAN\cite{ledig_photo-realistic_2017}, DragGAN\cite{pan_drag_2023}, etc.) ont été proposées, mais ces modèles restent complexes à entraîner et à évaluer. De plus, ces modèles sont très sensibles aux hyperparamètres et nécessitent une grande quantité de données pour être efficaces.

Face à ces inconvénients, et puisque nous ne possédons pas de grandes quantités de données, nous avons choisi de ne pas utiliser cette famille de modèles.

\FloatBarrier
\glsreset{vae}
\subsection{\gls{vae}}

\begin{figure}[h]
  \centering
  \includegraphics[width=14cm]{vae-architecture.png}
  \caption{Architecture d'un \gls{vae}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://lilianweng.github.io/posts/2018-08-12-vae/}{Lilian Weng, 2018}}
  \label{fig:vae-architecture}
\end{figure}

Les \gls{vae} constituent une autre famille de modèles génératifs, également bien connue comme les \gls{gan} et relativement tout aussi anciens\cite{kingma_auto-encoding_2022,kipf_variational_2016,doersch_tutorial_2021}. 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 \gls{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 \gls{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 et précisement les données d'entrée.
De même, la dimension de cette espace latent est configurée par l'architecture du réseau et peut être réduite à volonté. L'encodeur et le décodeur peuvent ainsi être conceptualisés comme des opérateurs de compression et de décompression.

L'intéret de cet espace latent, lorsqu'il est accompagné de sont decodeur, est qu'il permet de générer de nouvelles données, par example en échantillonant $z = \mu + \sigma \odot \epsilon$, ou bien en interpolant entre deux points latents, ou encore en modifiant légèrement un point spécifique de cet espace. Avoir la possibilité de générer de nouvelles données semblables aux données d'origine se révèle extrêmement utile dans le domaine de l'ingénierie, offrant ainsi des possibilités de création et de conception de nouvelles données basées sur des modèles existants.

Tout comme les \gls{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 \gls{vae}. Ces modèles sont plus faciles à entraîner que les \gls{gan} et présentent une plus grande stabilité. Cependant, les \gls{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 \gls{gan}, en particulier pour des résolutions élevées.

% parler de l'opti du log likely hood, de l'elbo, placer ce qu'on optimise quoi

nous avons choisi d'explorer ces modèles dans un premier temps lors de nos experiementations.

\FloatBarrier
\glsreset{nf}
\subsection{\gls{nf}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{nf-architecture.png}
  \caption{Architecture d'un \gls{nf}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://lilianweng.github.io/posts/2018-10-13-flow-models/}{Lilian Weng, 2018}}
  \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 \gls{nf} sont une autre classe de modèles génératifs qui ont gagné en popularité ces dernières années\cite{kobyzev_normalizing_2021}, puisque ces méthodes proposent de travailler directement sur les densités de probabilité, contrairement aux \gls{vae} et \gls{gan}. Ces modèles se basent 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 \gls{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.

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:

\subsubsection{\gls{kld}}

Soit deux distributions de probabilités discrètes $P$ et $Q$ sur un ensemble $X$.

$$ D_{\text{KL}}(P\|Q) = \sum_{x \in X} P(x) \log \frac{P(x)}{Q(x)} $$

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)$).

\subsubsection{\gls{hd}}

Soit $X$ et $Y$ deux nuages de points.

$$ 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\} $$

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.

\subsubsection{\gls{cd}}

Soit $X$ et $Y$ deux nuages de points.

$$ 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 $$

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.

\subsubsection{\gls{emd}}

Soit $X$ et $Y$ deux nuages de points tels que $|X| = |Y|$, et $\phi: X \to Y$ une bijection.

$$ d_{\text{EMD}}(X, Y) = \min_{ \phi: X \to Y } \sum_{x \in X} \| x - \phi(x) \|_2 $$

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.

\subsubsection{\gls{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.

$$ \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) $$

La divergence de Jensen-Shannon est une mesure de la similarité entre deux distributions de probabilité. Elle est calculée comme la moyenne des \gls{kld} entre chaque distribution et la moyenne de ces distributions.
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.

\subsubsection{\gls{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.

$$ \text{COV}(S_g, S_r) = \frac{ | \{ \argmin_{Y \in S_r} D(X, Y) | X \in S_g \} | }{ |S_r| } $$

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.

\subsubsection{\gls{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.

$$ \text{MMD}(S_g, S_r) = \frac{1}{|S_r|} \sum_{Y \in S_r} \min_{X \in S_g} D(X, Y) $$

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é, mais ayant des sous-ensembles de points très similaires à ceux de $S_r$. Dans ce cas, on obtiendrait un score de raisonnablement élevé.

\subsubsection{\gls{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.

$$ \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| } $$

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}, le \gls{1-nna} mesure directement la similarité des distributions et prend en compte à la fois la diversité et la qualité.

\FloatBarrier
\glsreset{vdm}
\subsection{\gls{vdm}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{vdm-architecture.png}
  \caption{Architecture d'un \gls{vdm}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://lilianweng.github.io/posts/2021-07-11-diffusion-models/}{Lilian Weng, 2021}}
  \label{fig:vdm-architecture}
\end{figure}

Les \gls{vdm} sont la famille de réseaux générateurs la plus récente et aussi la plus performante\cite{dhariwal_diffusion_2021}. La manière la plus simple de décrire ces modèles est de les considérer comme une mélange des \gls{vae} et des \gls{nf}. En effet, le principe des \gls{vdm} est de trouver un processus réversible entre notre distribution de données et distribution totalement différente, mais que l'on connait de préférence parfaitement mathématiquement, comme une gaussienne isotropique par exemple. Dans leur architecture, les \gls{vdm} peuvent être vus comme des \gls{vae} hiérarchiques où la taille de la dimension latente est égale à celle des données d'entrée, et où les encodeurs ne sont pas appris, mais sont déterminés par le processus de diffusion. De même, contrairement aux \gls{nf}, les \gls{vdm} ne sont pas basés sur des transformations déterministes et continues, mais sur des transformations stochastiques et discrètes.

On note p les "encodeurs" et q les "décodeurs" de la chaine de markov. On note $x_0$ un échantillon de notre distribution de données, $x_T$ un échantillon d'une normale isotropique, et $x_t$ tout échantillon intermédiaire. On note $t$ le temps de diffusion, $T$ le temps final de diffusion.

$$ q(x_t | x_{t-1}) = \mathcal{N} ( x_t; \sqrt{\alpha_t} x_0, (1 - \alpha_t) I ) $$

comme somme de gaussienne on peut montrer que :

$$ q(x_t | x_0) = \mathcal{N} ( x_t; \sqrt{\overline\alpha_t} x_0, (1 - \overline\alpha_t) I ) $$

où $\overline\alpha_t = \prod_{t=1}^t \alpha_t$.

% remplacer par les trois petits points
donc $ x_t =  \sqrt{\overline\alpha_t} x_0 + \sqrt{1 - \overline\alpha_t} \epsilon $

où $\epsilon \sim \mathcal{N}(0, I)$

% insérer ici image chaine markov

Il est possible de démontrer théoriquement~\cite{luo_understanding_2022} l'équivalence entre les \gls{vdm} et les méthodes de score matching lorsque le nombre de nœuds dans la chaîne de Markov, noté par $T$, tend vers l'infini. Les méthodes de score matching~\cite{song_generative_2020}, constituent une famille de techniques permettant l'estimation de la densité de probabilité associée à un ensemble de données. Elles se basent exclusivement sur le calcul du gradient de cette densité de probabilité, éliminant ainsi la nécessité du calcul laborieux de la constante de normalisation. Une fois le gradient estimé, la densité de probabilité peut être retrouvée au moyen de méthodes d'échantillonnage telles que la méthode de recuit de Langevin~\cite{song_generative_2020}.

Plusieurs catégories de modèles sont disponibles pour aborder le problème de la diffusion, parmi lesquelles émerge la plus reconnue, à savoir les \gls{ddpm} \cite{ho_denoising_2020}. Cette approche vise à identifier une correspondance réversible et discrète entre les données observées et une distribution gaussienne isotropique. Ce processus de mise en correspondance est appris au moyen d'un modèle paramétrique (i.e. un réseau de neurones). À cette fin, des données altérées par une certaine quantité de bruit sont fournies en entrée, et le réseau est sollicité pour prédire la composante de bruit ajoutée. En utilisant cette prédiction, il devient possible de calculer l'erreur, de propager cette dernière en sens inverse et, par conséquent, d'optimiser le réseau.

Après avoir achevé l'entraînement adéquat de notre modèle, nous acquérons ainsi la capacité de débruiter nos données altérées par un bruit gaussien. Néanmoins, l'intérêt majeur réside dans le fait de solliciter notre réseau pour débruiter du bruit pure (i.e. $SNR=0$). À ce stade, le réseau commence à générer des reconstructions qui présentent une forte ressemblance avec nos données d'entraînement, entraînant ainsi des phénomènes d'hallucination.

\FloatBarrier
\glsreset{ldm}
\subsubsection{\gls{ldm}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=6cm]{ldm-compression.jpg}\hspace*{5mm}\includegraphics[width=10cm]{ldm-architecture.png}
  \caption{Architecture d'un \gls{ldm}}
  \vspace*{-11pt}
  \caption*{Source: Rombach \& Blattmann, et al.\cite{rombach_high-resolution_2022}}
  \label{fig:ldm-architecture}
\end{figure}

Une amélioration significative des \gls{vdm} réside dans la mise en œuvre intelligente des espaces latents. Cette méthode, dénommée \gls{ldm}~\cite{rombach_high-resolution_2022}, repose sur l'observation selon laquelle l'exploitation des informations latentes, souvent de dimension nettement réduite, confère des avantages substantiels en termes de représentativité des données. La transition des \gls{vdm} vers les \gls{ldm} consiste en l'introduction préalable d'un second modèle, qu'il soit paramétrique ou non, destiné à obtenir une représentation latente. L'autoencodeur est fréquemment employé pour reconstruire fidèlement les données d'entrée, tandis que les représentations latentes alimentent le réseau de propagation subséquent. Cette approche induit 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
\subsubsection{Conditionnemnt \& 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 donnée d'entrée, tel que du texte, à l'instar des modèles de type "texte2image" tels que DALL·E 2 ou Stable Diffusion.

Jusqu'à présent, capable de générer des données selon une distribution de données apprise. Cependant nous avons souvent besoin d'échantilloner une sous distribution de nos données. Pour cela, il est possible de conditionner le modèle sur une donnée d'entrée, comme par example du texte comme les modèles de text2image tels que DALL-E2 ou Stable Diffusion.

Deux méthodes sont possibles pour permettre à des modèles de diffusion de générer des données conditionnées.

% TODO: vérifier les citations, pas sur que ça corresponde

La première méthode est appelée Classifier Guidance~\cite{dhariwal_diffusion_2021} et repose sur l'entraiement d'un classifier annexe $f_\phi(y | x_t)$ entrainé sur des données bruitées $x_t$ ainsi que leur classes associées $y$. Le logarithme du gradient de ce classifier est alors utilisé pour guider le modèle de diffusion. Ainsi selon la formulation du score matching on obtient:

$${x_t} \log q_\theta (x_t, y) = {x_t} \log q (x_t) + \gamma {x_t} \log q (y | x_t)$$
$$\approx -\frac{1}{\sqrt{1 - \alpha_t}} \epsilon_\theta (x_t, t) + \gamma {x_t} \log f_\phi (y | x_t)$$

% 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 equation 165, on obtient:

$$ {x_t} \log p (y, x_t) = {x_t} \log p (x_t, y) - {x_t} \log p (x_t) $$

substituion de l'équation 166:

...

Cette approche présente divers avantages. Premièrement, elle s'appuie sur un unique réseau de neurones, contrairement à la méthode guidée par classificateur qui en utilise deux. Deuxièmement, l'entraînement ne devient pas significativement plus complexe ; nous procédons de la même manière qu'auparavant, en ajoutant simplement les embeddings et en parfois excluant ces embeddings pour apprendre en conditionnement non contraint. Troisièmement, les données telles que le texte se prêtent difficilement à une classification en classes, et l'approche sans classificateur permet l'utilisation de vecteurs scalaires pour le conditionnement.

Dans notre cas d'application, nous pouvons conditionner sur les scalaires representant les performances de nos maillages.

% https://liorsinai.github.io/coding/2023/01/04/denoising-diffusion-3-guidance.html#guided-diffusion


Plusieurs sous-familles de modèles existent pour faire de la diffusion, la plus connue d'entre elles étant les \gls{ddpm}\cite{ho_denoising_2020}. Cette méthode consiste à trouver un mapping réversible entre nos données et une gaussienne isotropique.

L'étape d'entraînement du réseau repose sur une méthodologie relativement simple. Tout d'abord, nous sélectionnons un échantillon du jeu de données. Pour générer un échantillon bruité, nous l'altérons en ajoutant un bruit gaussien, dont l'intensité est ajustée selon un programme prédéfini. Ensuite, cet échantillon bruité est introduit dans le réseau, qui effectue une prédiction du bruit ajouté. Pour évaluer la précision de cette prédiction, nous comparons les résultats avec le bruit réel, ce qui nous permet de calculer un coût en utilisant la métrique \gls{mse}. En procédant à la rétropropagation de ce coût, nous mettons à jour les poids du réseau grâce à un algorithme d'optimisation approprié. Ce processus est répété pour chaque échantillon du jeu de données, en variant les intensités du bruit utilisé, jusqu'à atteindre la convergence, c'est-à-dire lorsque le modèle atteint un état stable et performant.

Une fois notre modèle correctement entraîné, nous sommes donc en mesure de débruiter nos données. Toutefois, l'intérêt majeur réside dans la situation où nous demandons à notre réseau de débruiter un signal de bruit pur (le rapport signal/bruit est de zéro). À ce moment-là, le réseau commence à générer des répliques (des hallucinations) qui ressemblent de manière frappante à nos données d'entraînement.

\cite{zhou_3d_2021}
\cite{nguyen_point-set_2021}
\cite{zeng_lion_2022}

\cite{nichol_point-e_2022}
\cite{nam_3d-ldm_2022}

\FloatBarrier
\glsreset{arm}
\subsection{\gls{arm}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{arm-architecture.png}
  \caption{Architecture d'un \gls{arm}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://colah.github.io/posts/2015-08-Understanding-LSTMs/}{Christopher Olah, 2015}}
  \label{fig:arm-architecture}
\end{figure}

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.

\FloatBarrier
\glsreset{nerf}
\subsection{\gls{nerf}}

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{nerf-architecture.png}
  \caption{Architecture d'un \gls{nerf}}
  \vspace*{-11pt}
  \caption*{Source: \href{https://theaisummer.com/nerf/}{AI Summer, 2022}}
  \label{fig:nerf-architecture}
\end{figure}

Les \gls{nerf} représentent une autre famille de modèles génératifs qui ont gagné en popularité récemment\cite{mildenhall_nerf_2020}. Ces modèles ont la capacité de générer des rendus 3D hautement réalistes à partir de données d'entraînement en utilisant des réseaux de neurones. Contrairement aux approches traditionnelles de rendu 3D basées sur des maillages, les \gls{nerf} exploitent des représentations continues et implicites des scènes en décrivant les propriétés radiométriques et géométriques en chaque point de l'espace 3D.

Le principe des \gls{nerf} est de modéliser une fonction de densité de rayon (ou "ray density function") qui caractérise l'interaction de la lumière avec les objets de la scène. Cette fonction est ensuite utilisée pour estimer la couleur et la profondeur des rayons traversant la scène, permettant ainsi de générer des images photoréalistes.

L'un des aspects fascinants des \gls{nerf} réside dans leur capacité à apprendre des scènes complexes et à générer des rendus à partir d'un nombre limité de vues ou de données d'entraînement. Grâce à leur architecture neuronale et à leur capacité à modéliser la distribution des couleurs et des formes, les \gls{nerf} sont en mesure de synthétiser des scènes réalistes même à partir de quelques images.

Les \gls{nerf} sont donc une alternative aux méthodes traditionnelles de reconstructions de scènes par résolution du problème inverse 3D. Cependant ces modèles peuvent aussi être utilisé conjointement avec d'autres réseau pour permettre d'obtenir des réseaux génératifs\cite{nichol_point-e_2022,takikawa_neural_2021,nam_3d-ldm_2022}.

Dans notre cas, étant donné que notre jeu de données n'est pas adapté à l'application des \gls{nerf}, car cela nécessiterait un processus de prétraitement complexe (comprenant la conversion de nos maillages/scènes en images via un moteur de rendu) ainsi qu'un post-traitement conséquent (utilisation du "marching cube") de notre ensemble de données. Par conséquent, nous ne choisirons pas d'adopter cette approche. De plus, dans le contexte industriel, les outils destinés à la manipulation d'objets implicites ne sont pas encore suffisamment avancés pour être déployés en production.

\chapter{Déroulement du stage}

Ce chapitre présente un aperçu détaillé du déroulement de mon stage de 6 mois (Du 21 Mars 2023 au 21 Septembre 2023) au sein de Safran. Tout au long de cette période, j'ai travaillé en tant que Stagiaire Ingénieur en Machine Learning au sein du département Safran Tech, dans l'équipe flex (chercher acronyme bidule), dont le but est de développer des outils de simulation et de modélisation pour les besoins de Safran. J'ai été encadré par Xavier Roynard, Michel Alessandro Bucci et Brian Staber.

Je décrirai dans les prochaines sections les différentes étapes de mon stage, les tâches qui m'ont été confiées ainsi que les projets auxquels j'ai contribué.

\FloatBarrier
\section{Lecture de la littérature}

Les premiers jours de mon stage ont été dédiés à mon intégration au sein de l'entreprise. J'ai rencontré mes tuteurs de stage qui m'ont présenté l'équipe et les différents membres du département. Une visite des locaux de l'entreprise m'a été proposée, accompagnée d'explications sur les mesures de sécurité en vigueur. J'ai également pris connaissance des outils et des logiciels utilisés dans le cadre de mon projet. Ces premiers jours ont été l'occasion pour moi de participer à des réunions d'équipe, en présence d'autres stagiaires et d'ingénieurs, afin de me familiariser avec les différents projets en cours et de préciser les objectifs de mon stage.

Les deux premières semaines de mon stage ont été dédiées à la lecture approfondie de la littérature scientifique liée à mon domaine d'étude. J'ai effectué des recherches bibliographiques afin de recueillir des informations pertinentes sur les avancées récentes, les théories et les techniques utilisées dans le domaine des modèles génératifs. J'ai majoritairement consulté des articles de conférence et des documents en ligne pour obtenir une vue d'ensemble complète des travaux antérieurs réalisés par des chercheurs et des ingénieurs. Pour appronfondir mes recherches, j'ai également utilisé des outils, tels que Semantic Scholar ou Papers with code, pour trouver les codes sources des papiers ainsi que des papiers ayant pour citation ou référence les articles que j'avais déjà lus, me permettant ainsi de découvrir de nouvelles publications pertinentes.

Lors de ma lecture, j'ai pris des notes (via les logiciels Logseq et Zotero) sur les concepts clés, les méthodologies et les résultats des études. J'ai analysé et comparé les différentes approches proposées dans la littérature afin de mieux comprendre les avantages et les limites de chaque méthode. Cette phase de lecture m'a permis d'acquérir une solide base de connaissances et de me familiariser avec les travaux existants dans le domaine. Ces connaissances préliminaires ont été essentielles pour orienter mes travaux ultérieurs de développement et de recherche lors du stage.

Au cours de cette période, j'ai également eu des discussions régulières avec mes tuteurs de stage pour discuter des articles lus, clarifier certains points et définir la direction à suivre pour mon projet. Ces échanges m'ont permis d'approfondir ma compréhension et de cibler les aspects spécifiques sur lesquels je devais me concentrer lors des prochaines phases de mon stage.

\FloatBarrier
\section{Prise en main des données}

En parallèle de ma lecture de la littérature, j'ai entamé l'exploration des données fournies par Safran. J'ai acquis une compréhension des différents formats de données spécifiques utilisés par l'entreprise pour stocker les résultats des simulations numériques de mécaniques des fluides. De plus, j'ai appris à manipuler ces données en utilisant des outils tels que Paraview\cite{ParaView}.

Le principal ensemble de données sur lequel j'ai travaillé pendant mon stage s'appelle Rotor37\_1200. Il s'agit d'un ensemble de données de simulation \gls{cfd} d'une des 37 pales d'une turbine d'un moteur d'avion. Cet ensemble de données contient 1200 échantillons, qui ont été créé via un processus d'optimisation consistant en l'exploration de paramètres en quête de la maximisation d'un critère de performance.

\begin{figure}[h!]
  \centering
  \includegraphics[width=14cm]{online_adaptative_sampling_DOE}
  \caption{Processus d'optimisation ayant permis de générer l'ensemble de données Rotor37\_1200}
  \label{fig:process-rotor37-1200}
\end{figure}

\begin{figure}[h!]
  \centering
  \includegraphics[width=4.5cm]{rotor37_1.png}\includegraphics[width=4.5cm]{rotor37_2.png}\includegraphics[width=4.5cm]{rotor37_3.png}
  \caption{Échantillon de l'ensemble de données Rotor37\_1200 sous plusieurs angles}
  \label{fig:example-rotor37-1200}
\end{figure}

Chaque aube du jeu de données est une déformation de l'aube nominale. Ainsi tous les maillages possèdent le même nombre de points et la même connectivité. Pour donner un ordre de grandeur, chaque maillage est constitué de 29773 points, 59328 triangles et 89100 arêtes.

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 qui contient des métadonnées globales spécifiques à l'échantillon, telles que les entrées et les sorties de la simulation \gls{cfd}.

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.

\FloatBarrier
\section{Description de l'environnement de travail}

L'équipe de mes tuteurs est basée à Châteaufort, sur le plateau de Saclay, où se trouve le site de l'entreprise. J'ai réussi à trouver un logement dans le nord de Palaiseau, à environ 40 minutes de trajet en bus. En moyenne, le nombre d'employés présents sur le site s'élève à environ mille personnes.

Les locaux de l'entreprise se présentent sous la forme de vastes openspaces, partagés par un maximum d'une dizaine de personnes. Ils sont séparés par de grandes baies vitrées et répartis dans 3 bâtiments sur plusieurs étages. Les bureaux sont spacieux équipés d'au moins un grand écran, d'un clavier et d'une souris. Nous disposons également de salles de réunion, de salles de détente et d'une salle de sport.

Chaque employé dispose d'une station de travail sous la forme d'un ordinateur portable, connecté à un dock sur le bureau. Afin de réaliser des calculs intensifs, nous avons la possibilité de nous connecter au cluster de calcul local, appelé Rosetta, utilisant le système slurm. Ce cluster est composé d'environ 3000 cœurs CPU, 50 GPU et dispose de plusieurs téraoctets de RAM et de stockage disque. Pour le développement de nos projets, nous exploitons la forge interne de Safran, qui est une plateforme GitLab dédiée. En outre, chaque employé a accès à la suite professionnelle Office 365, qui facilite la gestion des documents et des e-mails.

\FloatBarrier
\section{Application de l'état de l'art}

En complément de ma recherche bibliographique, j'ai consacré du temps à tester différentes implémentations des papiers que j'ai pu trouver. Voici la liste des implémentations et idées que j'ai pris le temps d'évaluer, ainsi que mes observations à leur sujet. plus ou moins chronolgique

\subsection{Approche par \gls{vae}}

% parler du fait que pytorch geometric à facilité un peu la tache d'implem

L'une de nos premières initiatives a été de tester des réseaux basés sur les \gls{vae}. Après avoir lu des articles de recherche sur les \gls{vae}, j'ai réalisé plusieurs implémentations sur des images pour me familiariser avec ces concepts. Nous avons ensuite étendu ces expérimentations à des architectures spécifiques aux graphes. Les résultats obtenus étaient encourageants: le réseau était capable de générer des structures, mais la qualité des générations n'était pas exceptionnelle. De plus, nous avons constaté que le réseau était beaucoup trop volumineux par rapport à sa fonctionnalité.

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}.

Une première solution simple consistait en l'utilisation de une ou plusieurs couches denses 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 30000 nœuds, cela impliquait une matrice de connectivité de taille $30000^2$, ce qui faisait aisaiment exploser la complexité lorsque nous utilisions des couches denses.

Pour donner un ordre de grandeur, si l'on utilisai 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à pratiquement 1 million de paramètres ($8 \times 30000 \times 3$). Prédire la connectivité était tout simplement impossible, car il aurait fallu une couche dense avec plus de $7$ milliards de paramètres ($8 \times 30000 \times 30000$), 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. Cette approche permettait d'éviter l'utilisation de couches denses dans le décodeur grâce aux 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.

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 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 facilement être retrouvé via diverses techniques\cite{peng_shape_2021,sulzer_deep_2022}

\subsection{Approche par \gls{nf}}

% Pointflow (à l'origine du dataset PointFlow, une modif de shapenet, code à chier)

\subsection{Approche par \gls{vdm}}

Pour prédire le bruit dans le processus de diffusion, conformément à la section intitulée "État de l'art" dans ce document, il est essentiel de sélectionner une architecture de réseau de neurones. Dans notre cas, puisque nous travaillons sur nuages de points, il convient d'utiliser des architectures adaptées à ce type de données.

Dans le contexte de l'apprentissage sur les nuages de points, une architecture a émergé comme la norme, à savoir PointNet. PointNet est une architecture basée sur des shared MLPs (Multi-Layer Perceptrons, qui peuvent être vus comme des convolutions de noyau 1x1) qui permettent de traiter des nuages de points, indépendemment du nombre de points. archi interessante car permutation invariant, mais aussi robuste à certaines transformations comme les rotations et translations.
Par la suite, amélioration de pointnet et désormais la norme, PointNet++ propose une approche profonde hiérarchique qui exploite une combinaison d'échantillonnage, d'agrégation et de suréchantillonnage pour permettre l'extension d'opérateurs locaux aux champs globaux réceptifs, entre autres.

Par la suite, une amélioration conséquente du modèle PointNet a abouti à l'émergence de PointNet++, désormais considérée comme l'architecture de référence dans le domaine. PointNet++ présente une approche hiérarchique en profondeur qui capitalise sur une fusion de techniques d'échantillonnage (furthest point sampling) et d'agrégations (knn) des points du nuage. Cette approche permet ainsi d'élargir la portée des opérateurs locaux pour englober des champs globaux réceptifs, et ainsi améliorer les performances du réseau.

% insérer ici image archite pointnet et poitnet++

% KPConv (c'est français, pas mal non ?)
autre archi bien connue dans le traitement de point clouds, archi semblable à pointnet++, mais le sampling est fait via une grille de voxelle, et l'aggragation est faite via des KPConv, qui sont une ball query. c'est français

Une autre architecture largement reconnue dans le domaine du traitement de nuages de points, présentant des similitudes avec PointNet++, est nommée KPConv. Cette architecture utilise un échantillonnage basé sur une grille de voxels et l'opération d'agrégation par des 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.

Appliqué à de la diffusion, KPFCNN

% PVCNN (code à chier, basé sur pointnet)
point voxel convolution, efficace, mais bcp de cuda

% SPVCNN (torchsparse, pas réussi à faire marcher pour la diffusion)
version plus efficace, mais pas trop réussi à faire marche, cuda très esotérique

% PVD (checkpoint, code à chier, trop chiant les opérations de voxelization devox en cuda + les métriques qui changent entre chaque papiers emd chamfer 1-NNA, en cuda aussi)
archi basée sur PointNet++, mais pas de sampling, juste des pvconv

% LION (pas de checkpoint, mais code utile)z
le plus récent

à dire en plus, les metrics pour évaluer la qualité des nuages de points générés ne sont pas vraiment normalisées, changent d'un papier à l'autre, ou implem change d'un papier à l'autre.

%%% old stuff, merge with what's before

Les premiers résultats concluant que nous avons obtenus ont été avec l'architecture KPFCNN. Cette architecture est basée sur PointNet++ et utilise des convolutions de type KPConv. Nous avons utilisé cette archi pour prédire le bruit lors de l'entraiment d'un \gls{vdm} (schedulers via huggingface diffusers). Les résultats étaient encourageants, mais nous avons constaté que le réseau avait du mal à apprendre à prédire le bruit en fin de sampling. en effet, les aubes finales semblaient encore un peu bruitées.
<insérer image ici>

\subsection{Approche par \gls{ldm}}

Pour essayer d'améliorer ces résultats, on peut apprendre à faire de la diffusion sur des variables latente, plutout que direct sur nos données. avantage, réduciton de dimension + informtion latente.

dans un premier temps on compresse donc nos nuages de point via une PCA, ça marche du feu de dieu

on test d'autres méthodes parameter free, comme la POD, marche moins bien

second temps, on compress nuages de points via un AE, pas encore finis, mais inch ça marche

\subsection{Application du \gls{cfg}}

conditionnemnt, classifier-free guidance

\subsection{Vérification par \gls{gp}}

pour vérif si la génération est bonne, on entraine des GP


\chapter{Conclusion}

% conclusion, présenter résultats, adéquation objectifs, enirchessiement personnel, connaissance techniques et rapport humain.

"Et éventuellement de proposer des améliorations spécifiques aux maillages utilisés en simulations numériques." en intro -> réduire la taille des maillages, ça serait bien. même si j'imagine que pas trop possible car les ingé des aubes veullent une très grande résolution dans leurs simu, même sur des surfaces plutôt planes, qui pourraient être représentées par moins de points.

🎉

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\appendix

%% ajouter les annexes ici

\backmatter

\addcontentsline{toc}{chapter}{Bibliographie}
\bibliography{zotero,others,softs}
\bibliographystyle{plainnat}

\end{document}
