people/a/AlammarJay/visual-interactive-guide-basics-neural-networks/index_fr.html
<!--#include virtual="/header-start.html" -->
<title>Guide visuel et interactif des bases des réseaux neuronaux</title>
<meta content="https://jalammar.github.io/visual-interactive-guide-basics-neural-networks/" name="url">
<meta content="Alammar, Jay" name="author">
<meta content="Jay Alammar" name="copyright">
<meta content="Guide visuel et interactif des bases des réseaux neuronaux" property="og:title"/>
<meta content="Guide visuel et interactif des bases des réseaux neuronaux" property="twitter:title"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.16.0/d3.js" type="text/javascript"></script>
<script src="../js/d3-selection-multi.v0.4.min.js" type="text/javascript"></script>
<script src="../js/d3-jetpack.js" type="text/javascript"></script>
<link href="../style.css" rel="stylesheet" type="text/css"/>
<link href="https://jalammar.github.io/feed.xml" rel="alternate"
title="Jay Alammar - Visualizing machine learning one concept at a time." type="application/rss+xml"/>
<script type="text/javascript"> var _paq = _paq || [];</script>
<!--#include virtual="/header-end.html" -->
<div class="prediction">
<p><span class="discussion">Discussions:
<a class="hn-link" href="https://news.ycombinator.com/item?id=13183171">Hacker News (63 points, 8 commentaires)</a>, <a
href="https://www.reddit.com/r/programming/comments/5igdix/a_visual_and_interactive_guide_to_the_basics_of/">Reddit r/programming (312 points, 37 commentaires)</a>
<br/>
<span class="discussion">Traductions:
<a href="index.html">Anglais</a>
<a href="https://camporeale.github.io/guia-interactiva-visual-conceptos-basicos-redes-neuronales/">Espagnol</a>
</span></span></p>
<div class="img-div">
<img alt="NNs 2 variables" src="NNs_2_variables.png"/>
</div>
<p><strong>Mise à jour </strong>: La 2ᵉ partie est maintenant en ligne : <a
href="https://jalammar.github.io/feedforward-neural-networks-visual-interactive/"> Regard visuel et interactif sur
les mathématiques de base des réseaux neuronaux</a>
</p>
<section>
<h2>Motivation</h2>
<p>Je ne suis pas un expert de l'<a href="/tech/info/soft/data/science/ml">apprentissage automatisé</a>. Je suis
ingénieur logiciel de formation et j'ai eu peu d'interactions avec l'<a
href="/tech/info/soft/data/science/ml/IA.html">IA</a>. J'ai toujours voulu plonger plus profondément dans le <a
href="/tech/info/soft/data/science/ml"><i lang="en">machine learning</i></a>, mais sans jamais trouver mon
"entrée". C'est pourquoi lorsque <a href="/org/us/company/alphabet/google">Google</a> a publié <a
href="/org/us/company/alphabet/x/brain/product/soft/tensorflow">TensorFlow</a> en Open Source en
<time>2015-11</time>, j'ai été super excité et j'ai su que c'était le moment de m'y mettre et de commencer le long
trajet de l'apprentissage. Sans vouloir dramatiser, pour moi, c'était comme être une sorte de Prométhée apportant
le feu à l'humanité depuis le Mont Olympe de l'<a href="/tech/info/soft/data/science/ml">apprentissage
automatique</a>. Je me souvenais encore que tout le domaine du <a
href="/tech/info/soft/prod/server/sgbd/BigData.html">Big Data</a> et des technologies comme Hadoop avaient été
énormément accélérés lorsque les chercheurs de <a href="/org/us/company/alphabet/google">Google</a> avaient publié
leur article sur Map-Reduce. Cette fois ce n'était pas un article – c'est le logiciel-même qu'ils utilisent en
interne, après des années et des années d'évolution.</p>
<p>J'ai donc commencé à apprendre ce que je pouvais sur les bases du sujet, et ai pu constater le besoin de
ressources plus accessibles pour des personnes n'ayant aucune expérience dans le domaine. Ceci est mon effort dans
ce sens.</p>
</section>
<section>
<h2>Commencez ici</h2>
<p>Commençons par un exemple simple. Disons que vous aidez une amie qui veut acheter une maison. On lui a proposé
{{400000 | number}}$ pour une maison de 2000 pieds² (185 m²). Est-ce un bon prix ou non ?</p>
<p>Ce n'est pas facile à dire sans données de référence. Vous demandez donc à des amis ayant acheté une maison dans
la même zone, ce qui vous mène à 3 points de données :</p>
<div class="one_variable">
<table>
<thead>
<tr>
<th>Surface (pieds²) (`x`)</th>
<th>Prix (`y`)</th>
</tr>
</thead>
<tbody>
<tr>
<td>2104</td>
<td>{{399900 | number}}</td>
</tr>
<tr>
<td>1600</td>
<td>{{329900 | number}}</td>
</tr>
<tr>
<td>2400</td>
<td>{{369000 | number}}</td>
</tr>
</tbody>
</table>
</div>
<p>Personnellement, mon premier instinct serait de prendre le prix moyen par pied². Cela revient à 180 $ par
pied².</p>
<p>Bienvenue dans votre premier <a href="/tech/info/soft/data/science/ml/nn">réseau neuronal</a> ! Bon ce n'est pas
encore du niveau de <a href="https://fr.wikipedia.org/wiki/Siri_(logiciel)">Siri</a>, mais vous en connaissez
maintenant une brique fondamentale. Et elle ressemble à ceci :</p>
<div class="img-div">
<img alt="simple NN 1" src="simple_NN_1.png"/>
</div>
<p>Des diagrammes comme celui-ci vous montrent la structure du réseau et comment il calcule une prédiction. Le
calcul commence au noeud d'entrée à gauche. La valeur d'entrée va à droite. Elle y est multipliée par le poids et
le résultat devient notre sortie.</p>
<p>Multiplier 2000 pieds² par 180 nous donne {{360000 | number}} $. Cela se résume à ça à ce niveau. Calculer la
prédiction est une simple multiplication. Mais avant cela, nous avons eu besoin de réfléchir au poids par lequel
nous allions multiplier. Ici nous avons commencé par une moyenne ; plus tard nous examinerons de meilleurs <a
href="/tech/info/soft/proj/impl/algo">algorithmes</a> capables de supporter plus d'entrées et des modèles plus
compliqués. Trouver le poids est notre étape d'"entraînement". Donc chaque fois que vous entendez que quelqu'un
"entraîne" un <a href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a>, cela veut juste dire trouver
les poids que nous utilisons pour calculer la prédiction.</p>
<div class="img-div">
<img alt="NNs formula no bias" src="NNs_formula_no_bias.png"/>
</div>
<p>Ceci une forme de prédiction. Il s'agit d'un modèle prédictif simple qui prend une entrée, effectue un calcul, et
fournit une sortie (la sortie pouvant être des valeurs continues, la terme technique pour ce que nous avons serait
un "modèle de <a href="/science/discipline/hard/form/math/stat/regress">régression</a>").</p>
<p>Essayons de visualiser ce processus (à des fins de simplicité, changeons notre unité de prix de 1 $ à 1000 $.
Notre poids est maintenant de 0,180 plutôt que 180):</p>
<div class="img-div-large">
<img alt="data points graph, animated" src="data_points_graph_animated.gif"/>
</div>
</section>
<section>
<h2>Plus dur, meilleur, plus rapide, plus solide</h2>
<p>Pouvons-nous faire mieux qu'estimer le prix sur la base de la moyenne de nos points de données ? Essayons.
Commençons par définir ce que veux dire faire mieux dans ce scénario. Si nous appliquons notre modèle aux 3 points
de données dont nous disposons, quelle qualité fournirait-il ?</p>
<div class="img-div-large">
<img alt="" src="data_points_error_animated.gif"/>
</div>
<p>Cela fait beaucoup de jaune. Le jaune, c'est mal. Le jaune, c'est de l'erreur. Nous voulons réduire le jaune
autant que possible.</p>
<div class="one_variable">
<table>
<thead>
<tr>
<th>Surface (`x`)</th>
<th>Prix ($1000) (<span class="y_">`"y_"`</span>)</th>
<th>Prédiction (<span class="y">`y`</span>)</th>
<th><span class="y_">`"y_"`</span>-<span class="y">y</span></th>
<th>(<span class="y_">`"y_"`</span>-<span class="y">`y`</span>)²</th>
</tr>
</thead>
<tbody>
<tr>
<td>2104</td>
<td>399,9</td>
<td>379</td>
<td>21</td>
<td>449</td>
</tr>
<tr>
<td>1600</td>
<td>329,9</td>
<td>288</td>
<td>42</td>
<td>1756</td>
</tr>
<tr>
<td>2400</td>
<td>369</td>
<td>432</td>
<td>-63</td>
<td>3969</td>
</tr>
<tr>
<td class="bottom-left-corner"></td>
<td class="bottom-left-corner"></td>
<td class="bottom-left-corner" colspan="2"><span class="total"> Moyenne :</span></td>
<td><b>2058</b></td>
</tr>
</tbody>
</table>
</div>
<p>Ici on peut voir la <span class="y_">valeur du prix réel</span>, la <span class="y">valeur du prix prédite</span>
et la <span class="error-value">différence entre elles</span>. Nous aurons alors besoin de faire la moyenne de ces
différence afin d'avoir un nombre qui nous indique la quantité d'erreur dans ce modèle prédictif. Le problème est
que la 3ᵉ ligne a une valeur de -63. Nous devons traiter cette valeur négative si nous voulons utiliser la
différence entre prédiction et prix comme instrument de mesure de l'erreur. C'est une des raisons pour lesquelles
nous introduisons une colonne supplémentaire qui montre l'erreur au carré, éliminant ainsi la valeur négative.</p>
<p>C'est maintenant notre définition de faire mieux – un meilleur modèle est un modèle qui a moins d'erreur.
L'erreur est mesurée comme la moyenne des erreurs pour chaque point de notre ensemble de données. Pour chaque
point, l'erreur est mesurée par la différence entre la valeur réelle et la valeur prédite, élevée à la puissance
2. On appelle ça l'<a href="https://fr.wikipedia.org/wiki/Erreur_quadratique_moyenne">erreur quadratique
moyenne</a>. L'utiliser comme guide pour entraîner notre modèle en fait notre <a
href="/science/discipline/hard/form/math/stat/regress/cost"><strong>fonction de coût</strong> (ou encore
<strong>fonction de perte</strong>)</a>.
</p>
<p>Maintenant que nous avons défini notre instrument de mesure de ce qui fait un meilleur modèle, expérimentons
quelques autres valeurs de poids et comparons-les avec notre choix de la moyenne :</p>
<figure class="img-div-large">
<img alt="lines and errors, animated" src="lines_and_errors_animated.gif"/>
<figcaption>Nous ne pouvons pas beaucoup améliorer le modèle en faisant varier encore le poids. Mais en ajoutant
un biais nous pouvons trouver des valeurs qui améliorent le modèle.
</figcaption>
</figure>
<p>Nos lignes peuvent mieux approcher nos valeurs maintenant que nous avons cette valeur `b` ajoutée à la formule
linéaire. Dans ce contexte, nous l'appelons un "biais". Cela fait ressembler notre <a
href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a> à ceci :</p>
<div class="img-div">
<img alt="NNs bias" src="NNs_bias.png"/>
</div>
<p>Nous pouvons le généraliser en disant qu'un <a href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a>
avec 1 entrée et 1 sortie (<em>attention spoiler :</em> et aucune couche cachée) ressemble à ceci :</p>
<div class="img-div">
<img alt="NNs bias #2" src="NNs_bias_2.png"/>
</div>
<p>Dans ce graphique, `W` et `b` sont des valeurs que nous trouvons au cours de l'entraînement. `x` est l'entrée que
nous branchons dans la formule (surface en pieds² dans notre exemple). Y est le prix prédit.</p>
<p>Le calcul d'une prédiction utilise maintenant cette formule :</p>
<div class="img-div">
<img alt="NNs formula" src="NNs_formula.png"/>
</div>
<p>Notre modèle actuel calcule donc les prédictions en branchant la surface de la maison comme `x` dans cette
formule :</p>
<div class="img-div">
<img alt="NNs formula ex" src="NNs_formula_ex.png"/>
</div>
</section>
<section>
<h2>Entraînez votre dragon</h2>
<p>Que diriez-vous d'essayer d'entraîner notre <a href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a>
d'exemple ? Minimisez la <a
href="/science/discipline/hard/form/math/stat/regress/cost">fonction de coût</a> en ajustant les curseurs de
poids et de biais. Pouvez-vous obtenir une erreur en-dessous de 799 ?</p>
<div class="training-chart" id="training-one-chart"></div>
<table class="training-table" id="training-one">
<tr>
<td>Erreur</td>
<td colspan="2"><span class="error-value"></span></td>
</tr>
<tr>
<td class="error-cell" colspan="3"><span class="error-value-message"></span></td>
</tr>
<tr>
<td><label for="training-one-weightSlider">Poids</label></td>
<td><input class="weight" id="training-one-weightSlider" max="0.4" min="0" step="0.001" type="range"/></td>
<td class="slider-value"><span class="weight">0</span></td>
</tr>
<tr>
<td><label for="training-one-biasSlider">Biais</label></td>
<td><input class="bias" id="training-one-biasSlider" max="460" min="0" step="1" type="range"/></td>
<td class="slider-value"><span class="bias">0</span></td>
</tr>
</table>
<div class="nn-graph-area" id="neural-network-graph"></div>
</section>
<section>
<h2>Automatisation</h2>
<p>Félicitations pour avoir entraîné manuellement votre premier <a href="/tech/info/soft/data/science/ml/nn">réseau
de neurones</a> ! Regardons maintenant comment automatiser ce processus d'entraînement. Ci-dessous se trouve un
autre exemple avec une fonctionnalité supplémentaire d'auto-pilotage. Il s'agit des boutons Itération DG. Ils
utilisent un algorithme appelé "<a href="/science/discipline/hard/form/math/stat/regress/gradient">Descente de
Gradient</a>" pour essayer d'itérer vers les valeurs correctes de poids et biais corrects qui minimise la <a
href="/science/discipline/hard/form/math/stat/regress/cost">fonction de coût</a>.
</p>
<div class="figure">
<div class="col graphs">
<div class="training-chart" id="training-one-gd-chart"></div>
<div class="training-chart mini-charts">
<div class="error-chart col-xs-6" id="training-one-gd-error-chart"></div>
<div class="error-chart col-xs-6" id="training-one-gd-heatmap"></div>
</div>
</div>
<div class="col">
<table class="training-table" id="training-one-gd">
<tr>
<td class="gd-buttons" colspan="3">
<input class="gradient-descent-button" type="button" value="Itération DG"/> <input
class="gradient-descent-10-button" type="button" value="10 itérations DG"/> <input
class="gradient-descent-100-button" type="button" value="100 itérations DG"/>
</td>
</tr>
<tr>
<td>Erreur</td>
<td colspan="2"><span class="error-value"></span></td>
</tr>
<tr>
<td class="error-cell" colspan="3"><span class="error-value-message"></span> </td>
</tr>
<tr>
<td><label for="training-one-gd-weightSlider">Poids</label></td>
<td><input class="weight" id="training-one-gd-weightSlider" max="0.4" min="0" step="0.0001" type="range"/>
</td>
<td class="slider-value"><span class="weight">0</span></td>
</tr>
<tr>
<td><label for="training-one-gd-biasSlider">Biais</label></td>
<td><input class="bias" id="training-one-gd-biasSlider" max="460" min="0" step="0.1" type="range"/></td>
<td class="slider-value"><span class="bias">0</span></td>
</tr>
</table>
<div class="nn-graph-area" id="neural-network-gd-graph"></div>
</div>
</div>
<p>Les 2 nouveaux graphiques sont là pour vous aider à suivre les valeurs d'erreur à mesure que vous bidouillez les
paramètres (poids et biais) du modèle. Il est important de garder une trace de l'erreur car le processus
d'entraînement vise à réduire cette erreur autant que possible.</p>
<p>Comment la <a href="/science/discipline/hard/form/math/stat/regress/gradient">descente de gradient</a> sait-elle
où devrait être sa prochaine itération ? Par calcul : en connaissant la fonction que l'on minimise (notre <a
href="/science/discipline/hard/form/math/stat/regress/cost">fonction de coût</a>, la moyenne de `("y_" - y)^2`
pour l'ensemble de nos points de données), et en connaissant ses entrées à un moment donné (des poids et biais
donnés), les <a href="/science/discipline/hard/form/math/ens/rel/func/deriv">dérivées</a> de la <a
href="/science/discipline/hard/form/math/stat/regress/cost">fonction de coût</a> nous indiquent dans quelle
direction pousser `W` et `b` afin de minimiser l'erreur.</p>
<p>Vous en apprendrez plus sur la <a href="/science/discipline/hard/form/math/stat/regress/gradient">descente de
gradient</a> et comment l'utiliser pour calculer les nouveaux poids & biais dans les premiers exposés du <a
href="https://www.coursera.org/learn/machine-learning">cours sur l'apprentissage automatique de Coursera</a>.
</p>
</section>
<section>
<h2>Puis il y en eut deux</h2>
<p>La taille de la maison est-elle la seule variable influant sur son coût ? À l'évidence il existe d'autres
facteurs. Ajoutons une autre variable et voyons comment nous pouvons y ajuster notre <a
href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a>.</p>
<p>Disons que notre amie a fait un peu de recherche et a trouvé pas mal de points de données supplémentaires. Elle a
aussi trouvé combien de salles de bain avait chaque maison :</p>
<div class="two_variables">
<table>
<thead>
<tr>
<th>Surface (pieds²) (`x1`)</th>
<th>Salles de bain (`x2`)</th>
<th>Prix (`y`)</th>
</tr>
</thead>
<tbody>
<tr>
<td>2104</td>
<td>3</td>
<td>{{399900 | number}}</td>
</tr>
<tr>
<td>1600</td>
<td>3</td>
<td>{{329900 | number}}</td>
</tr>
<tr>
<td>2400</td>
<td>3</td>
<td>{{369000 | number}}</td>
</tr>
<tr>
<td>1416</td>
<td>2</td>
<td>{{232000 | number}}</td>
</tr>
<tr>
<td>3000</td>
<td>4</td>
<td>{{539900 | number}}</td>
</tr>
<tr>
<td>1985</td>
<td>4</td>
<td>{{299900 | number}}</td>
</tr>
<tr>
<td>1534</td>
<td>3</td>
<td>{{314900 | number}}</td>
</tr>
<tr>
<td>1427</td>
<td>3</td>
<td>{{198999 | number}}</td>
</tr>
<tr>
<td>1380</td>
<td>3</td>
<td>{{212000 | number}}</td>
</tr>
<tr>
<td>1494</td>
<td>3</td>
<td>{{242500 | number}}</td>
</tr>
</tbody>
</table>
</div>
<p>Notre <a href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a> à 2 variables ressemble à ceci :</p>
<div class="img-div">
<img alt="NNs 2 variables" src="NNs_2_variables.png"/>
</div>
<p>Nous devons maintenant trouver 2 poids (1 pour chaque entrée) et 1 biais pour créer notre nouveau modèle.</p>
<p>Calculer `y` ressemble à ceci :</p>
<div class="img-div">
<img alt="NNs formula two variables" src="NNs_formula_two_variables.png"/>
</div>
<p>Mais comment trouvons-nous `W1` et `W2` ? C'est un peu plus compliqué que lorsque nous n'avions à nous soucier
que d'une seule valeur de poids. Dans quelle mesure avoir une salle de brain supplémentaire affecte la manière
dont nous prédisons la valeur d'une maison ?</p>
<p>Essayez de trouver les bons poids et biais. Vous allez commencer ici à voir la complexité dans laquelle nous
commençons à plonger à mesure que le nombre de nos entrées augmente. Nous commençons à avoir du mal à créer des
formes en 2D simples qui nous permettent de visualiser le modèle d'un coup d'œil. Au lieu de cela, nous allons
devoir nous reposer principalement sur la manière dont la valeur d'erreur évolue lorsque nous ajustons les
paramètres de notre modèle.</p>
<div class="figure">
<div class="col graphs">
<div class="error-chart" id="training-two-chart"></div>
</div>
<div class="col">
<table class="training-table" id="training-two-table">
<tr>
<td class="gd-buttons" colspan="3">
<input class="gradient-descent-button" type="button" value="Itération DG"/> <input
class="gradient-descent-10-button" type="button" value="10 itérations DG"/> <input
class="gradient-descent-100-button" type="button" value="100 itérations DG"/>
</td>
</tr>
<tr>
<td>Erreur</td>
<td colspan="2"><span class="error-value"></span></td>
</tr>
<tr>
<td class="error-cell" colspan="3"><span class="error-value-message"></span> </td>
</tr>
<tr>
<td><label for="weight0Slider">Poids n°1</label></td>
<td><input class="weight" id="weight0Slider" max="0.4" min="-0.4" step="0.0001" type="range"/></td>
<td class="slider-value"><span id="weight0">0</span></td>
</tr>
<tr>
<td><label for="weight1Slider">Poids n°2</label></td>
<td><input class="weight" id="weight1Slider" max="200" min="-100" step="0.0001" type="range"/></td>
<td class="slider-value"><span id="weight1">0</span></td>
</tr>
<tr>
<td><label for="biasSlider">Bias</label></td>
<td><input class="bias" id="biasSlider" max="300" min="-100" step="0.1" type="range"/></td>
<td class="slider-value"><span class="bias">0</span></td>
</tr>
</table>
<div class="nn-graph-area" id="neural-network-two-graph"></div>
</div>
</div>
<p>Notre fidèle <a href="/science/discipline/hard/form/math/stat/regress/gradient">descente de gradient</a> nous
aide encore une fois. Elle reste utile pour nous aider à trouver les bons poids et biais.</p>
</section>
<section>
<h2>Paramètres</h2>
<p>Maintenant que vous avez vu des <a href="/tech/info/soft/data/science/ml/nn">réseaux de neurones</a> avec 1 ou 2
paramètres, vous pouvez deviner comment ajouter des paramètres et les utiliser pour calculer vos predictions. Le
nombre de poids continuera d'augmenter, et notre <a href="/tech/info/soft/proj/impl">implémentation</a> de la <a
href="/science/discipline/hard/form/math/stat/regress/gradient">descente de gradient</a> devra être ajustée à
chaque fois que l'on ajoute un paramètre, afin qu'elle puisse mettre à jour les nouveaux poids associés aux
nouveaux paramètres.</p>
<p>Il est important de noter ici que l'on n'alimente pas aveuglément le réseau avec tout ce que l'on sait de nos
exemples. Nous devons être sélectifs quant aux paramètres que nous fournissons au modèle. La sélection et le
traitement des paramètres et une discipline à part entière qui a son propre lot de considérations et bonnes
practiques. Si vous souhaitez voir un exemple du processus consistant à examiner un ensemble de données dans le
but de choisir quelles caractéristiques fournir en entrée d'un modèle de prédiction, regardez <a
href="https://www.kaggle.com/omarelgabry/titanic/a-journey-through-titanic">Un voyage sur le Titanic</a>. Il
s'agit d'un bloc-notes où <a href="https://twitter.com/Omar_ElGabry">Omar EL Gabry</a> relate son processus de
résolution du <a href="https://www.kaggle.com/c/titanic">défi Titanic de Kaggle</a>. Kaggle publie la liste des
passagers du Titanic incluant des données comme les nom, sexe, âge, cabine et si la personne a survécu ou non. Le
défi consiste à élaborer un modèle capable de prédire si une personne a survécu ou non étant données leurs autres
informations.</p>
</section>
<section>
<h2>Classement</h2>
<p>Continuons à affiner notre exemple. Supposons que notre amie nous donne une liste de maisons. Cette fois, elle a
indiqué lesquelles selon elle ont une bonne taille et le nombre de salles de bains :</p>
<div class="two_variables">
<table>
<thead>
<tr>
<th>Surface (pieds²) (`x1`)</th>
<th>Salles de bain (`x2`)</th>
<th>Libellé (`y`)</th>
</tr>
</thead>
<tbody>
<tr>
<td>2104</td>
<td>3</td>
<td>Bon</td>
</tr>
<tr>
<td>1600</td>
<td>3</td>
<td>Bon</td>
</tr>
<tr>
<td>2400</td>
<td>3</td>
<td>Bon</td>
</tr>
<tr>
<td>1416</td>
<td>2</td>
<td>Mauvais</td>
</tr>
<tr>
<td>3000</td>
<td>4</td>
<td>Mauvais</td>
</tr>
<tr>
<td>1985</td>
<td>4</td>
<td>Bon</td>
</tr>
<tr>
<td>1534</td>
<td>3</td>
<td>Mauvais</td>
</tr>
<tr>
<td>1427</td>
<td>3</td>
<td>Bon</td>
</tr>
<tr>
<td>1380</td>
<td>3</td>
<td>Bon</td>
</tr>
<tr>
<td>1494</td>
<td>3</td>
<td>Bon</td>
</tr>
</tbody>
</table>
</div>
<p>Elle vous demande d'utiliser ceci pour créer un modèle capable de prédire si elle aimera une maison ou non, étant
donnés sa taille et son nombre de salles de bain. Vous utiliserez la liste ci-dessus pour élaborer le modèle, puis
elle utilisera le modèle pour classer nombre d'autres maisons. Un autre changement dans le processus est qu'elle a
une autre liste de 10 maisons qu'elle a libellées, mais qu'elle ne vous montre pas. Cette autre list sera utilisée
pour évaluer votre modèle une fois que vous l'aurez entraîné – essayant ainsi de s'assurer que votre modèle capte
les conditions qui font qu'elle aime les caractéristiques d'une maison.</p>
<p>Les <a href="/tech/info/soft/data/science/ml/nn">réseaux de neurones</a> sur lesquels nous nous sommes exercés
jusqu'à maintenant faisaient tous des "<a href="/science/discipline/hard/form/math/stat/regress">regressions</a>"
– ils calculaient et sortaient une valeur "continue" (la sortie peut être 4, ou 100,6 ou 2143,342343). En
pratique, cependant, les <a href="/tech/info/soft/data/science/ml/nn">réseaux de neurones</a> sont plus souvent
utilisés dans les problèmes de type "classement". Dans ces problèmes, la sortie du <a
href="/tech/info/soft/data/science/ml/nn">réseau de neurones</a> doit faire partie d'un ensemble de valeurs
discrètes (ou "classes") comme "Bon" ou "Mauvais". En pratique, nous aurons un modèle qui dira être à 75% sûr
qu'un choix de maison est "Bon" plutôt que juste dire "bon" ou "mauvais".</p>
<figure class="img-div">
<img alt="android tensorflow classifier results" src="android_tensorflow_classifier_results.jpg"/>
<figcaption>L'application TensorFlow dont j'ai parlé dans ma <a
href="https://jalammar.github.io/Supercharging-android-apps-using-tensorflow/">publication précédente</a> est
un bon exemple de modèle de classement en pratique.
</figcaption>
</figure>
<p>Une manière de transformer le réseau que nous avons vu en réseau de classement est de lui faire sortir 2 valeurs
– une pour chaque classe (nos classes étant maintenant "bon" et "mauvais"). Nous devons alors faire passer ces
valeurs à travers une opération appelée "<a
href="https://rasbt.github.io/mlxtend/user_guide/classifier/SoftmaxRegression/">softmax</a>". Le sortie d'un
softmax est la probabilité de chaque classe. Par exemple, disons que la couche du réseau sort 2 pour "bon" et 4
pour "mauvais" ; si nous entrons [2, 4] dans le softmax, il retournera [0,11, 0,88] en sortie. Ce qui traduit les
valeurs pour dire que le réseau est à 88% sûr que la valeur entrée est "mauvaise" et que notre amie n'aimera pas
cette maison.</p>
<p>Softmax prend un tableau et sort un tableau de la même taille. Notez que les sorties sont toutes positives et que
leur addition donne 1 – ce qui est pratique lorsque l'on sort une valeur de probabilité. Notez aussi que même si 4
est le double de 2, sa probabilité n'est pas seulement le double, mais est de 8 fois celle de 2. Il s'agit d'une
propriété utile qui exagère la différence en sortie, améliorant ainsi notre processus d'entraînement.</p>
<table>
<thead>
<tr>
<th class="titleCorner"></th>
<th>sortie</th>
</tr>
</thead>
<tbody>
<tr>
<td>softmax([ 1 ])</td>
<td>[ 1 ]</td>
</tr>
<tr>
<td>softmax([ 1, 1 ])</td>
<td>[ 0.5, 0.5 ]</td>
</tr>
<tr>
<td>softmax([ 0, 1 ])</td>
<td>[ 0.26, 0.73 ]</td>
</tr>
<tr>
<td>softmax([ 2, 4 ])</td>
<td>[ 0.11, 0.88 ]</td>
</tr>
<tr>
<td>softmax([ 5, 10 ])</td>
<td>[ 0.007, 0.993 ]</td>
</tr>
<tr>
<td>softmax([ -1, 0, 1 ])</td>
<td>[ 0.09, 0.24, 0.66 ]</td>
</tr>
<tr>
<td>softmax([ 1, 2, 4 ])</td>
<td>[ 0.04, 0.11, 0.84 ]</td>
</tr>
</tbody>
</table>
<p>Comme nous le voyons dans les 2 dernières lignes, softmax s'étend à n'importe quel nombre d'entrées. Donc si
notre amie ajoute un 3ᵉ libellé (disons “Bon, mais je devrai louer une chambre sur airbnb"), softmax s'adapte à
ce changement.</p>
<p>Prenez un moment pour explorer la forme du réseau lorsque vous faites varier le nombre de paramètres (`x1, x2,
x3…` etc) (qui peuvent être la surface, le nombre de salles de bain, le prix, la proximité de l'école/du travail…
etc) et faites varier le nombre de classes (`y1, y2, y3…` etc) (qui peuvent être "trop cher", "bonne affaire",
"bien si je loue sur airbnb", "trop petit") :</p>
<table class="form">
<tr>
<td><label for="features">Caractéristiques (`x`):</label></td>
<td><input class="input-number" id="features" max="99" min="1" name="quant[1]" step="1" type="number"
value="2"/></td>
</tr>
<tr>
<td><label for="classes">Classes (`y`):</label></td>
<td><input class="input-number" id="classes" max="99" min="1" name="quant[2]" step="1" type="number" value="2"/>
</td>
</tr>
</table>
<div class="nn-graph-area" id="shallow-neural-network-graph"></div>
<p>Vous trouverez un exemple de comment créer et entraîner ce réseau avec TensorFlow dans <a
href="https://github.com/RR0/simpleTensorFlowClassificationExample/blob/master/Exemple%20de%20base%20de%20classification%20avec%20TensorFlow.ipynb">ce
bloc-notes</a>
que j'ai créé pour accompagner cet article.</p>
</section>
<section>
<h2>Vraie motivation</h2>
<p>Si vous êtes arrivé(e) jusqu'ici, je dois vous révéler une autre motivation qui m'a incité à écrire cet article.
Cet article vise à être une introduction encore plus accessible aux didacticiels de <a
href="/org/us/company/alphabet/x/brain/product/soft/tensorflow">TensorFlow</a>. Si vous commencer à travailler
<a href="https://www.tensorflow.org/versions/r0.10/tutorials/mnist/beginners/index.html">MNIST pour débutants en
ML</a> maintenant, et tombez sur ce graphique :</p>
<figure class="img-div">
<img alt="softmax regression scalar graph" src="softmax-regression-scalargraph.png"/>
<figcaption>J'ai écrit cet article pour préparer les gens sans expérience de l'apprentissage automatique à ce
graphique dans le didacticiel introduisant à TensorFlow. C'est pourquoi j'ai simulé son style visuel.
</figcaption>
</figure>
<p>J'espère que vous vous sentez prêt et que vous comprenez maintenant ce système et comment il fonctionne. Si vous
souhaitez commencer à bricoler du code, n'hésitez pas à le récupérer du <a
href="https://www.tensorflow.org/versions/r0.10/tutorials/mnist/beginners/index.html">didacticiel</a> de
l'intro et apprendre à un <a href="/tech/info/soft/data/science/ml/nn">réseaux de neurones</a> à reconnaître des
chiffres manuscripts.</p>
<p>Vous devriez aussi poursuivre votre formation en apprendre les sous-jacents théoriques et <a
href="/science/discipline/hard/form/math">mathématiques</a> des concepts que nous avons discutés ici. Parmi les
bonnes questions à poser maintenant se trouvent :</p>
<ul>
<li>Quels autres types de <a href="/science/discipline/hard/form/math/stat/regress/cost">fonctions de coût</a>
existent ? Quelles sont les plus adaptées à quelles applications ?</li>
<li>Quel est l'algorithme pour calculer concrètement les nouveaux poids en utilisant la <a
href="/science/discipline/hard/form/math/stat/regress/gradient">descente de gradient</a> ?</li>
<li>Quelles sont les applications de l'<a href="/tech/info/soft/data/science/ml">apprentissage automatique</a>
dans les domaines que vous connaissez déjà ? Quelle nouvelle magie pouvez-vous insuffler en mixant ce pouvoir
avec d'autres dans votre livre de sorts ?</li>
</ul>
<p>Parmi de très bonnes ressources pour apprendre on trouve :</p>
<ul>
<li>Le cours sur <a href="https://www.coursera.org/learn/machine-learning">apprentissage automatique</a> de
Coursera par <a href="https://twitter.com/AndrewYNg">Andrew Ng</a>. C'est celui avec lequel j'ai commencé. Il
commence avec la regression puis passe au classement et aux <a href="/tech/info/soft/data/science/ml/nn">réseaux
neuronaux</a>.</li>
<li><a href="https://www.coursera.org/learn/neural-networks">Réseaux de neurones pour apprentissage
automatique</a> de Coursera par <a href="https://en.wikipedia.org/wiki/Geoffrey_Hinton">Geoffrey Hinton</a>.
Plus centré sur les <a href="/tech/info/soft/data/science/ml/nn">réseaux de neurones</a> et leurs applications
visuelles.</li>
<li><a
href="https://www.youtube.com/watch?v=g-PvXUjD6qg&list=PLlJy-eBtNFt6EuMxFYRiNRS07MCWN5UIA">CS231n:
Convolutional Neural Networks for Visual Recognition</a> de Stanford, par <a
href="https://twitter.com/karpathy">Andrej Karpathy</a>. Il est intéressant de voir des concepts avancés et
l'état de l'art dans la reconnaissance visuelle en utilisant des <a
href="tech/info/soft/data/science/ml/nn/deep">réseaux de neurones profonds</a>.</li>
<li>Le <a href="https://www.asimovinstitute.org/neural-network-zoo/">Neural Network Zoo</a> est une très bonne
ressource pour en apprendre plus sur les différents types de <a href="/tech/info/soft/data/science/ml/nn">réseaux
de neurones</a>.</li>
</ul>
</section>
<section>
<h2>Remerciements</h2>
<p>Merci à <a href="https://www.linkedin.com/in/yasmine-alfouzan-b05ba317">Yasmine Alfouzan</a>, <a
href="https://twitter.com/a3ammar">Ammar Alammar</a>, <a href="https://www.linkedin.com/in/khalidalnuaim">Khalid
Alnuaim</a>, <a href="https://twitter.com/fahd09">Fahad Alhazmi</a>, <a
href="https://www.linkedin.com/in/mkhdev">Mazen Melibari</a>, and <a
href="https://www.linkedin.com/in/hadeel-al-negheimish-4a73abb3">Hadeel Al-Negheimish</a> pour leur aide à
revoir les versions précédentes de cet article.</p>
<p>Merci de me contacter sur <a href="https://twitter.com/JayAlammar">Twitter</a> pour toutes corrections ou
retours.</p>
</section>
</div>
<div class="date">Rédigé <time>2016-12-14</time></div>
<div>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license"><img alt="Creative Commons License"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" style="border-width:0"/></a><br/>Cet article est
publié sous licence <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license">Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International License</a>. <br/>Exemple d'attribution : <br/> <i>Alammar, Jay
(2018). The Illustrated Transformer [Blog post]. Récupéré de <a
href="https://jalammar.github.io/illustrated-transformer/">https://jalammar.github.io/illustrated-transformer/</a></i>
<br/><br/> Note : Si vous traduisez un de mes articles, faites-le moi savoir pour que je puisse ajouter un lien vers
votre traduction de l'article d'origine. Mon email est dans la page <a
href="https://jalammar.github.io/about">À propos</a>.
</div>
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
};
i[r].l = 1 * new Date();
a = s.createElement(o);
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-71956058-1', 'auto');
ga('send', 'pageview', {
'page': '/visual-interactive-guide-basics-neural-networks/',
'title': 'Guide visuel et interactif des bases des réseaux neuronaux'
});
</script>
<!--#include virtual="/footer.html" -->
<script src="../js/bootstrap.min.js"></script>
<script>
$(document).ready(function () {
setTimeout(() => {
$.getScript("../js/nnVizUtils.js");
$.getScript("../js/simple_nn.js");
$.getScript("../js/two_variable_nn.js");
$.getScript("../js/shallow_nn_grapher.js");
}, 4000) // Wait for angular to set the DOM
});
</script>
<style>.mjx-math * {
line-height: 0;
}</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/latest.js?config=AM_CHTML"></script>