Fin modélisation

This commit is contained in:
Leopold Clement 2021-08-18 16:23:09 +02:00
parent 600d9a86fa
commit 23617633bf

View file

@ -7,7 +7,7 @@
\hypersetup{
pdftitle={Titre},
pdfauthor={Auteur},
pdfauthor={Léopold Clément},
pdfsubject={Sujet},
pdfproducer={Conversion PDF},
pdfkeywords={Quelques mots-clés} %
@ -18,6 +18,7 @@
% ------------- Packages spéciaux, nécessaires pour ce rapport, à insérer ici -------------
\usepackage{minted}
\usepackage{lscape}
\usepackage[toc]{glossaries}
\makeglossaries
@ -62,6 +63,14 @@
\newcommand{\cocoa}{\gls{cocoa}}
\newglossaryentry{ns}
{
name=ns-3,
description={Simulateur réseau puissant. \url{https://www.nsnam.org/}}
}
\newcommand{\ns}{\gls{ns}}
\newglossaryentry{keras}
{
name=keras,
@ -146,6 +155,7 @@
\newcommand{\dqlearn}{Deep-Q-learning}
\newcommand{\cubic}{TCP-Cubic}
\newcommand{\newreno}{TCP-NewReno}
\newcommand{\cpp}{C++}
\newglossaryentry{rtt}
{
@ -593,16 +603,102 @@ D'autre choix sont possibles, par exemple $\mathbb{A} = \left\lbrace 0.1, 0.5, 0
\subsection{Comment quantifier la réussite de l'agent ?}
Une fois que l'on sais représenter l'état du réseau, il faut déterminer si cette état est favorable ou non.
Pour cela, il faut se demander ce que l'on veux comme caractéristique
Pour cela, il faut se demander ce que l'on veux comme caractéristique.
Je choisit comme critaire : \begin{itemize}
\item Le delai est le plus petit possible, pour avoir un système réactif,
\item il y a peu de retransmission, pour ne pas encombrer le réseau et abusé des ressources energetiques des capteurs,
\item il y a tres peu d'echec, c'est à dire de message qui dépasse le nombre de retransmission maximal,
\item le nombre de message envoyé est equitablement répartie entre les clients.
\end{itemize}
L'équité est une grandeur permetant de mesurer si certain capteurs utilise plus le réseau que d'autre.
Elle est définie pas \cite{jainQuantitativeMeasureFairness1998} pour un grandeur quelconque $\left( x_i \right) \in {\left(\R ^ {+}\right)} ^ N$:
\begin{equation}
f_A (x_i) = \frac{\left[ \sum_{k = 1}^N x_k \right] ^ 2 }{N \cdot \sum_{k = 1}^N x_k^2 }
\label{eq:modele_fair_base}
\end{equation}
Ainsi un système totalement équitable (où tout les $x_i$ sont égaux) à une équité de $1$ et un système non-équitable à une équité d'autant proche de $0$ qu'il est inéquitable.
Mais cette indice d'équité ne prend pas en compte que certain utilisateur on besoin de plus de ressource que d'autre.
Ainsi on modifie l'équation \ref{eq:modele_fair_base} pour prende un compte un besoin $\left( b_i \right) \in {\left(\R ^ {+}\right)} ^ N$ :
\begin{equation}
f_A (x_i, b_i) = \frac{\left[ \sum_{k = 1}^N \frac{x_k}{b_k} \right] ^ 2 }{N \cdot \sum_{k = 1}^N \left( \frac{x_k}{b_k} \right)^2 }
\label{eq:modele_fair_pond}
\end{equation}
Le schéma de récompence est donc, à partir des données du derniers interval de control :
\begin{equation}
r = - \beta _ \nu \frac{\sum_{k=1}^N x^e _ k}{\sum_{k=1}^N x^t_k} - \beta_\text{echec} n_\text{echec} - \beta_{RTT} max_{k} \overline{RTT} _ k + \beta_\text{equite} \frac{\left[ \sum_{k = 1}^N \frac{n^e_k}{n^t_k} \right] ^ 2 }{N \cdot \sum_{k = 1}^N \left( \frac{n^e_k}{n^t_k} \right)^2 }
\label{eq:modele:recompence}
\end{equation}
$n^e$ est le nombre de message envoyé, emition initial et retransmission, et $n^t$ le nombre de transaction, c'est à dire uniquement les émitions initiales.
$n_\text{echec}$ est le nombre de transaction ayant échouée.
Les facteurs $\beta$ permetent de pondérer l'effet des différentes composante.
\subsection{Quel type d'agent utilisé ?}
Maintenant que l'environement est fixé, on peut déterminer comment l'acteur va s'intégrer.
On choisit le fonctionement suivant : \begin{itemize}
\item L'acteur détermine $a_t$ en fonction de $s_t$,
\item les clients utilise cet $a_t$ pour trouver leur consigne $c_t$,
\item ils traitent toutes les transactions avec ses consigne pendant l'interval de control,
\item a la fin de l'interval de control, on fait la synthèse des données, on calcule $s_{t+1}$ et $r_t$,
\item on enregistre $\left( s_t, a_t, r_t, s_{t+1} \right)$,
\item on recommence avec $s_{t+1}$
\end{itemize}
Cela represente le fonctionnement normal du système.
Mais en plus de cela, il faut que l'on fasse s'optimisé la politique.
Pour cela on va procédé en deux temps : \begin{enumerate}
\item Le pré-entrainement,
\item l'entrainement en position.
\end{enumerate}
Le pré-entrainement se déroule avant le déploiment du réseau de capteur.
Il consiste à rendre la politique proche de ce qui est attendu pour que elle soit exploitable, même si elle n'est pas encore optimal.
Pour cela, il faut généré de l'expérience (les transitions $\left( s_t, a_t, r_t, s_{t+1} \right)$ que on a vu plus haut), et l'utilisé pour optimisé la politique.
Cette génération peut se faire de plusieur manière que on évoquera plus tard.
Une fois que la politique est correct, on peut la déployer sur le réseau de capteur réel.
Mais elle n'est pas fixe, puisque on continue à l'optimisé avec de l'exprérence récolté sur le réseau réel.
\subsection{Quelle politique $\pi$ est utilisé ?}
Au vu de la taille des espaces $\mathbb{S}$ et $\mathbb{A}$, on ne peut pas utilisé un Q-table car elle demanderais bien trop d'espaces mémoire.
On utilise donc un réseau de neurrones pour approximé la Q-table.
Les subtilités de cette approximation, ainsi que la discretisation de $\mathbb{S}$ et $\mathbb{A}$ sont pris en charge par \TF{}.
Puisque on est en apprentissage permanant, il faut utilisé une politique $\epsilon$-glouton.
C'est à dire que pendant la majorité du temps, on se trouve en phase d'exploitation, et on execute l'action optimal.
Mais avec une probabilité $\epsilon$, on réalise une action aléatoire, afin de tester de nouvelle possibilité.
C'est important car on ne se trouve pas dans un système déterministe, donc il ne suffit pas de tester une fois toutes les transitions.
Pour ce qui est du réseau de neurrones, on ne travaille pour l'instant que avec un réseau feed-forward, mais on peut envisagé d'utilisé des réseaux plus complexes.
\subsection{Comment récolté de l'expérience ?}
\subsubsection{Par exploration}
La recolte de transition est indipensable pour pouvoir optimisé la politique.
La récolte in situ est lente, en effet, il faut généralement $10000$ transitions pour réalisé un pas d'optimisation.
On peut descendre jusqu'à $1000$, mais le résultats est moins stable.
De plus, avec une durée d'interval de controle de $30$s, on se retrouve à devoir attendre $8h$ par pas d'optimisation.
Il faut donc trouver des solutions plus rapide que l'exploration simple si on veux pouvoir faire une centaine de pas d'apprentissage pour atteindre une convergence.
\subsubsection{Par exploration en simulateur}
Une solution simple, en théorie, est d'utilisé un simulateur.
Le plus utilisé est \ns{}.
C'est un simulateur à envenement discret, destiné à la simulation de réseau informatique permetant de travaillier sur toute les couches du modèle \osi{}.
Ainsi on peut entrainer le simulateur avec la topologie du réseau que l'on veux, et la qualité des connexions sans fils que l'on veux.
Malheureusment, c'est un simulateur complexe à utilisé : tout les scripts de simulation sont écrit en \cpp{}.
Par manque de temps et de compétence, je n'ais pas réalisé de simulation \ns{}, mais ca peut etre une piste à étudier pour le pré-entrainement.
\subsubsection{Par création artificiel de transition}
Une autre méthode possible est de créer des transitions artificiellement.
Pour cela, je commence par fixer une charge sur le réseau $f$, c'est à dire la fréquence à laquelle chaque client intéroge le capteur associé.
Celon cette charge, le réseau est plus ou moins congestioner.
Ensuite je prend plusieurs consigne de \rto{} $c_n$, et pour chaque consigne, je l'applique à l'agent, et je mesure le vecteur d'observation associé $s_n$ ainsi que $r_n$.
Puis pour chaque couple $(s_n, s_m)$, je calcule l'action $a_{n , m}$ pour passer de $c_n$ à $c_m$.
Je peu ainsi construire une série de trnasition $s_n, a_{n, m}, r_m, s_m$.
On recommence avec un autre $f$
Ces transitions sont uniquements des approximation, car elles ne tiennent pas réelement compte des effets de $s_t$ sur $s_{t+1}$ liée au temps de probagation des message dans le système.
De plus elles supposent que la charge ne change pas sur le système.
Malgrès cela, elle permet d'aller plus vite dans la génération de transition pour le pré-entrainement, car en $n$ interval de contrôl à $f$ fixe, on génère $n^2$ transitions.
\section{Implémentation de l'algorithme}
@ -614,7 +710,7 @@ Pour cela, il faut se demander ce que l'on veux comme caractéristique
\subsection{Structure du code}
\subsection{Maquette utilisée}
\subsection{Maquette utilisée\label{part_maquette}}
\subsection{Astuce pour simuler une congestion}
@ -659,8 +755,15 @@ Pour cela, il faut se demander ce que l'on veux comme caractéristique
\appendix
\begin{appendices}
\section{}
\section{Structure du code}
\begin{landscape}
\begin{figure}[htp]
\centering
\includegraphics[height=\vsize, width=\hsize, keepaspectratio]{puml/call_stack_envoie.png}
\caption[Appel de fonction pour une transaction]{Appel de fontion pour une transaction avec \coapthon{} et mes modifications. Chaque couleur représente un thread d'execution.}
\end{figure}
\end{landscape}
\end{appendices}