• Aucun résultat trouvé

Comme pour la méthode d’apprentissage automatique présentée dans la section précédente, le réseau de neurones à convolution est un algorithme qui se spécifie en fonction des données qui lui sont présentées lors de l’entraînement. C’est en effet en lui présentant des exemples identifiés qu’il s’ajustera et apprendra la tâche qui lui est assignée. Dans la prochaine section, les différents éléments qui composent généralement un réseau de neurones seront survolés et le processus selon lequel le réseau peut apprendre sera détaillé. Mais avant de s’attaquer au cas plus complexe du réseau de neurones à convolution, définissons quelques concepts de base sur les réseaux de neurones.

2.6.1 Réseau de neurones artificiels

L’unité de calcul de base d’un réseau de neurones artificiels est le neurone. Tel que représenté à la figure 2.12, chaque neurone reçoit des entrés {xi} provenant des autres neurones ainsi qu’un biais {b}, et les transforme, à l’aide de sa fonction d’activation {f(P

iwixi+ b)}),

en sortie (Y ). Chaque entrée est associée à un poids ({wi}) qui représente son importance

relative. Comme il sera expliqué ultérieurement, ce sont les poids wi ainsi que le biais qui seront mis à jour lors de l’entraînement. Explorons maintenant chacune de ces composantes de façon plus détaillée.

La fonction d’activation introduit la non-linéarité nécessaire au modèle pour reproduire la nature non linéaire de la fonction qu’on souhaite approximer avec notre réseau. Parmi les fonctions d’activation les plus populaires, on retrouve généralement la fonction sigmoïde, tangente hyperbolique ainsi que ReLU (rectified linear unit ), qui sont représentées à la figure

Figure 2.12 – Neurone individuel avec les entrées xi, les poids wi, le biais b, la fonction

d’activation f(x1w1+ x2w2+ b) et la sortie Y .

2.13. Dans les travaux les plus récents, on utilise généralement la fonction d’activation ReLU

Y =    0, si f (P iwixi+ b) < 0, f(P iwixi+ b), autrement , (2.32)

soit celle qui modélise le plus fidèlement le neurone biologique. Selon cette fonction d’activa- tion, si la somme pondérée des entrées est négative, la sortie sera nulle. Au contraire, si la somme pondérée des entrées est positive, on la retourne, inchangée, en sortie.

Cette fonction résulte généralement, telle que montré par Krizhevsky et al. (2012), en un entrainement plus rapide sur les gros réseaux. Bien que ReLU est habituellement préférée aux autres fonctions d’activation, elle présente également quelques désavantages. Par exemple, une unité ReLU peut « mourir » lors de l’entrainement si on choisit un taux d’apprentissage5 trop élevé, tel qu’expliqué par Karpathy6. En effet, ce nœud pourrait être mis à jour de telle sorte à

ce que ce même nœud ne soit plus jamais activé par aucun autre point de donné de l’ensemble (tel que le poids w mis à jour à une valeur nulle).

Le biais permet, quant à lui, d’effectuer une translation de la fonction d’activation. On l’intro- duit généralement pour assurer que la sortie du neurone approxime le plus fidèlement possible le signal entrant. Tel que mentionné précédemment, le biais, au même titre que les poids wi,

sont les paramètres qui sont modifiés lors de l’entrainement pour assurer la convergence du réseau.

C’est donc en rassemblant des neurones individuels en couches qui se superposent qu’on construit un réseau de neurones profond. Chacune de ces couches auront des rôles précis, selon le type de réseau choisi. Étudions d’abord un exemple simple de réseau de neurones afin

5. on reviendra sur le concept de taux d’apprentissage dans la section sur l’entrainement des réseaux de neurones.

Figure 2.13 – Différentes fonctions d’activation : sigmoïde à gauche, tangente hyperbolique au centre et ReLU à droite.

de développer notre intuition sur comment un assemblage spécifique de ces neurones et un apprentissage bien orchestré peut résulter en un réseau capable de prédire et de classifier des résultats.

Réseau de neurones à propagation avant

Un réseau de neurones doit comporter minimalement une couche d’entrée, une couche cachée, ainsi qu’une couche de sortie (figure 2.14). Pour qu’on puisse utiliser l’appellation réseau de neurones profond, on doit inclure plusieurs couches cachées, ayant chacune un rôle différent.

Figure 2.14 – Architecture du réseau de neurone à propagation avant avec une couche cachée. La couche d’entrée est l’objet sur lequel on veut faire une prédiction. Par exemple, si on voulait faire une prédiction sur l’image de la figure2.15, on déplierait l’image pour en faire un vecteur rangée, qui, pour l’ordinateur, est considéré comme une collection de nombre repré- sentant l’intensité de chacun des pixels (figure2.16). Ce vecteur rangé devient ainsi la couche d’entrée de notre réseau, ou chaque pixel de l’image (i.e. chaque élément du vecteur) représente un neurone d’entrée.

Figure 2.15 – Image à classifier

Figure 2.16 – Image dépliée formant la couche d’entrée [1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 ]

Les couches cachées agissent, quant à elles, comme extracteurs de caractéristiques. On peut intuitivement le comprendre en étudiant les réseaux de neurones à convolution. Mais, essen- tiellement, les couches cachées vont extraire les informations (caractéristiques) pertinentes qui sont efficaces pour effectuer une bonne segmentation.

Chacun des neurones d’entrée est ainsi connecté à tous les neurones de la première couche ca- chée. Les neurones de la couche cachée, quant à eux, vont effectuer des opérations non linéaires sur les entrées (en utilisant leur fonction d’activation définie précédemment) pour produire une sortie. Ces sorties seront ensuite réutilisées comme entrée d’une autre couche cachée et ainsi de suite jusqu’à ce qu’on atteigne la couche de sortie. C’est en ajustant, lors de l’entrainement, les paramètres (e.g. les poids et biais) de la couche cachée qu’elle converge, éventuellement, vers l’extraction de certaines caractéristiques qui pourront ensuite être classifiées par la couche de sortie.

La couche de sortie, une couche linéaire, est la couche qui effectue les prédictions selon les caractéristiques extraites par les couches cachées. Par exemple, si la tâche du réseau est d’iden- tifier quels pixels appartiennent à un neurone sur une image de 100 pixels, la couche de sortie serait un vecteur 1 × 100 où chaque élément représente la probabilité du pixel correspondant d’appartenir à un neurone.

2.6.2 Entraînement

Une fois que l’architecture du réseau choisie et que des poids ont été assignés aléatoirement à chacun des liens, on peut débuter l’entrainement. Le but de l’entrainement est de mettre à jour les poids wi de telle sorte que, lorsqu’on lui fournit une entrée (e.g. une image), la série

d’opérations définies par l’architecture du réseau mène à la bonne classification/prédiction par la couche de sortie. On utilise généralement la méthode de rétropropagation du gradient, in- troduite en 1970, dont l’importance fut reconnue en 1986 grâce à la publication de (Rumelhart

et al.,1986). Cette méthode peut se résumer en quelques étapes : 1. fournir une image comme couche d’entrée,

2. effectuer les opérations définies par les couches cachées (e.g. fonctions d’activation) 3. comparer la couche de sortie à la vérité absolue (e.g. une image segmentée manuellement

où les pixels correspondant à des neurones sont mis à 1 et les autres pixels à 0) et calculer l’erreur entre la prédiction et la vérité absolue

4. ajuster les poids (wi) de sorte à minimiser l’erreur avec la descente du gradient

5. répéter le processus sur plusieurs combinaisons d’images et de vérités absolues

Les étapes 1 et 2 constituent ce qu’on appelle la propagation avant. Elle sert à déterminer, dans l’état actuel, les performances de classification du réseau. Lors de l’entrainement, on cherche à minimiser la fonction d’erreur choisie. On pourrait par exemple utiliser, l’erreur quadratique moyenne comme fonction d’erreur :

MSE= 1 2

X

(sortie − cible)2.

Puisque la sortie dépend des poids et des biais, c’est en les modifiant qu’on parviendra à minimiser cette fonction. La descente du gradient fournit ainsi une méthode pour solutionner ce problème d’optimisation. Sa règle de mise à jour est

θn+1 = θn− γn∇F (θn), n ≥ 0. (2.33)

Elle assure la convergence vers un minimum local, à moins que F soit convexe, auquel cas la convergence se fera vers un minimum global. Ici, n représente l’itération actuelle, et F la fonction d’erreur qui dépend de tous les paramètres du réseau. Quant à γ, il s’agit du taux d’apprentissage. Ce taux d’apprentissage influence la grandeur du pas effectué lors de la recherche du minimum7.

Comme on peut le voir à la figure 2.17, l’ajustement du taux d’apprentissage est essentiel à la convergence de l’algorithme. Un petit taux d’apprentissage assure la convergence, mais à une vitesse très lente. On pense aussi qu’un trop petit taux d’apprentissage mènerait souvent à un surapprentissage. Au contraire, un trop gros taux d’apprentissage pourrait faire diverger l’algorithme tel que présenté à la figure 2.17. On veut donc choisir un taux d’apprentissage entre les deux. Bien entendu, déterminer le bon taux d’apprentissage est une tâche parfois laborieuse puisque sa valeur optimale dépendra de la forme de la fonction à minimiser, qui est à très haute dimension et différente pour chaque problème. On peut ainsi procéder soit par essai erreur, un processus long mais qui assure presque assurément la convergence, ou par la technique du test du taux d’apprentissage présenté dans Smith (2017).

Figure 2.17 – Effet du taux d’apprentissage sur la convergence de la descente du gradient (https ://www.jeremyjordan.me/nn-learning-rate/)

D’autres concepts importants doivent également être définis lorsqu’on parle de l’entrainement d’un réseau de neurones. Entre autres, on appelle une epoch lorsqu’on a effectué la propagation avant et arrière sur la totalité de l’ensemble de données d’entrainement. Une batch est quant à elle définit comme le nombre d’échantillons (e.g. images) d’entrainement dans une seule propagation avant/arrière. On doit généralement utiliser des batchs pour des raisons liées à la mémoire vive, tel que l’ordinateur ne possède souvent pas la capacité de procéder au calcul sur l’entièreté du jeu d’entraînement en une itération.

2.6.3 Réseau de neurones à convolution

Le réseau de neurones à convolution est un type particulier de réseaux de neurones profonds où certaines couches contiennent des filtres de convolution. On les utilise généralement pour des tâches de reconnaissance d’images, pour lesquels ils sont habituellement très performants. Les réseaux de neurones à convolution sont généralement construits avec les mêmes couches de bases, dont l’arrangement change d’un réseau à l’autre. Ces couches sont les couches de convolution (CONV), couche de pooling (POOL), couche de correction (ReLU), la couche complètement connectée (FC) ainsi que la couche de perte (LOSS). Étudions brièvement chacune de ces couches.

Couche de convolution

Afin de définir intuitivement une couche de convolution, prenons exemple sur un réseau de neurones n’ayant qu’un filtre convolutif dans sa couche cachée. En entrée, on fournit une image 10 pixels2 représentant les arrêtes d’un carré, alors que dans notre couche cachée, on retrouve un filtre convolutif ayant une ligne verticale de 3 pixels (figure2.18).

Pour effectuer la convolution, qui n’est en réalité qu’une somme pondérée, on parcourt l’image avec notre filtre, et pour chaque position, on calcule le produit scalaire. Le résultat de la convo- lution est la carte d’activation (figure2.19), et indiquera à quelle position le filtre détecte une arête verticale de 3 pixels. Un filtre convolutif peut ainsi être interprété comme un détecteur

Figure 2.18 – Image et filtre de convolution

Figure 2.19 – Carte d’activation

de caractéristiques. Dans le cadre des réseaux de neurones, une couche convolutive possède généralement plusieurs filtres empilés, où chacun de ces filtres est initialisé aléatoirement. Lors de l’entrainement, les valeurs dans la matrice de convolution seront itérativement mises à jour jusqu’à ce qu’il converge, par exemple, vers le filtre représenté à la figure 2.18. On empile généralement plusieurs filtres dans chaque couche afin de générer une carte d’activation pour chacun de ces filtres. On nomme la profondeur le nombre de filtres empilés.

Couche de « Pooling »

La couche de pooling sert à réduire la dimension de la carte d’activation tout en conservant l’information pertinente. Différents types de pooling existent : Max, Moyenne, Somme en sont quelques exemples.

Commençons d’abord par définir le Max pooling. Pour effectuer l’opération, on définit d’abord un voisinage, par exemple une fenêtre de 2x2 pixels. On sépare ainsi notre carte d’activation en fenêtres dont la taille est définie par notre voisinage (figure 2.20), et dans chaque fenêtre, on ne retient que l’élément le plus grand. Dans le cas du pooling moyen, on retiendrait la moyenne de chaque fenêtre, et similairement, dans le cas du pooling somme, on retiendrait la somme des éléments de chaque fenêtre. On utilise généralement le pooling Max.

Cette opération sert principalement à réduire la taille de notre représentation, diminuant de ce fait le nombre de paramètres du réseau et réduisant ainsi les chances de surapprentissage. Finalement, cette opération rend le réseau invariant aux petites transformations, translations et distorsions dans l’image d’entrée (donc rend le réseau plus robuste).

Figure 2.20 – Exemple de max Pooling (http ://cs231n.github.io/convolutional-networks/). Couche ReLU

La couche ReLU permet d’introduire des non-linéarités à notre réseau. Tel que défini précé- demment, on parcourt chacun des éléments de la matrice en éliminant toutes valeurs négatives et en les remplaçant par 0.

Couche complètement connectée

Les couches complètement connectées sont généralement utilisées à la sortie du réseau pour ef- fectuer la classification. Comme son nom l’indique, les neurones de cette couche sont connectés à tous les neurones de la couche précédente et à tous les neurones de la couche suivante. Ces couches sont introduites pour permettre au réseau d’apprendre des combinaisons non linéaires de caractéristiques, ce qui aide généralement à effectuer une bonne classification.

2.6.4 Notre réseau

Dans le cadre de ce travail, le réseau proposé par Klibisz (Klibisz et al., 2017) est réutilisé, avec les poids obtenus suite à l’entrainement sur la base de données neurofinder8. L’architec- ture utilisée pour le réseau est représentée à la figure 2.21 où les chiffres au-dessus des blocs représentent le nombre de filtres de convolutions 3 × 3 (bloc vert et rouge).

Entraînement du réseau de neurones à convolution

Une fois le réseau bâti, il a été entrainé sur les données de neurofinder, fournies par les labora- toires Svoboda, Hausser, Losonczy et Harvey. Dix-sept films d’activité calcique des neurones du poisson-zèbre sont disponibles pour l’entraînement, et huit pour le test. Pour chacun de ces ensembles de données, les neurones ont été segmentés manuellement par des experts. Pour ce qui est des métriques d’évaluation, on utilise le score F1, où la précision et le rappel ont été calculés en regroupant chaque neurone segmenté manuellement avec le neurone identifié par l’algorithme le plus près, sans remplacement. En contraste avec le score F1 pixel par

Figure 2.21 – Architecture du réseau U-Net2DS (Klibisz et al.,2017)

pixel, un neurone prédit ne peut correspondre qu’à un seul identifié manuellement, même si le neurone prédit chevauche plusieurs neurones identifiés manuellement.

Avant d’entamer le processus d’entrainement, tous les films ont été moyennés temporellement pour former une carte sommaire. 75% du haut de toutes les images a été utilisé pour l’entrai- nement, et le 25% restant pour la validation. Des batchs de 20 images 128x128 pixels ont été échantillonnés aléatoirement en s’assurant qu’au moins un neurone se retrouve dans chaque image, auxquelles des rotations et flips ont été appliqués aléatoirement. L’entrainement s’est fait sur 10 epochs avec 100 étapes d’entrainement par epoch en utilisant l’optimizer de Adam présenté dans (Kingma and Ba,2014) et un taux d’apprentissage de 0.002.

Après chaque epoch, une prédiction a été faite pour chacune des images de validation et la métrique de score F1 a été calculée et les poids ont été sauvegardés lorsque le score F1 (pixel par pixel) a plafonné autour de 0,7 et que le score F1 défini par neurofinder a plafonné autour de 0,85.

Les poids ainsi obtenus ont également été testés sur un de leurs ensembles de données (St. Jude) pour tester la robustesse des prédictions du réseau sur d’autres films d’imagerie cal- cique obtenus selon d’autres procédures expérimentales ainsi que dans des régions du cerveau distinctes. Les performances sur cet ensemble de données sont de 0,45 (F1 pixel par pixel) et 0,47 (F1 neurofinder). Les performances sont ainsi grandement diminuées lorsque le réseau est appliqué à un ensemble de données différent de celui utilisé pour l’entrainement.

Comme le réseau a été entrainé sur des ensembles de données provenant de plusieurs labora- toires, les performances sont inégales d’un ensemble de données à l’autre. Ainsi, si on ajuste l’entrainement du réseau sur un type d’image obtenu selon un processus expérimental bien défini, on s’attend à ce que les performances soient grandement améliorées pour ces données.

2.6.5 Résultats

Les performances d’un réseau de neurones à convolution dépendent grandement de la qualité de l’entrainement. Le réseau ayant déjà été entrainé sur des données hautement similaires aux nôtres, il devrait, en principe, être appliqué directement à nos données sans entraînement supplémentaire et générer de bons résultats s’il n’a pas sur-appris lors de son entrainement. On conseille généralement de raffiner les paramètres du réseau avec ses propres données lorsque possible pour tenir compte des variations qui pourraient exister entre les données sur lesquelles il a été entrainé et les données sur lesquels il doit performer la prédiction. Or, comme il n’y a pas suffisamment de données pour entrainer, puis tester adéquatement, il ne sera pas possible d’effectuer cette étape supplémentaire.

Comme pour tous les algorithmes testés jusqu’à présent, on utilise l’image sommaire moyenne pour effectuer la segmentation. Or, le fait de prendre tous les plans de l’acquisition et de les moyenner pour en faire la carte sommaire fait perdre de l’information lorsqu’un neurone, n’est actif qu’une très courte période de temps de l’acquisition et reste par la suite inactif. Selon notre hypothèse selon laquelle un neurone a de plus grandes probabilités d’être détecté s’il est plus brillant puisqu’il possède un meilleur contraste, la perte d’information sur les maximums pourrait diminuer les performances de l’algorithme. Pour confirmer notre hypothèse, les per- formances lorsqu’on moyenne un nombre différent de plans pour former les cartes sommaires seront comparés.

Table 2.14 – Effet du nombre de plan choisi sur les performances - Plan 17 Positives TP FP FN Sensibilité Précision score F1

10 images 235 26 9 209 0,11 0,74 0,19

100 images 235 76 4 159 0,32 0,95 0,48

1000 images 235 91 4 144 0,39 0,96 0,55

6000 images 235 44 9 191 0,19 0,83 0,31

Comme on peut le remarquer à la figure 2.14, notre hypothèse tient la route. En ne moyen- nant que sur très peu d’images (10-100 images), l’algorithme performe moins bien. En effet, en ne prenant que très peu d’images pour moyenner, les probabilités qu’un neurone ait été actif lors de cet intervalle sont très faibles. Au contraire, si on prend trop d’images pour ef- fectuer notre image sommaire moyenne, on perd l’information sur les maximums, de sorte que même les neurones les plus actifs se démarquent moins des neurones non actifs. On voit conséquemment que le nombre optimal d’images à utiliser lors de la segmentation avec unet2D est approximativement de 1000.

Or, ce nombre d’images optimal dépend probablement de plusieurs paramètres, dont la fré- quence d’acquisition, soit le nombre d’images prises chaque seconde, le choix d’indicateur calcique ainsi que du taux d’activité neuronale. En effet, si la majorité des neurones sont très actifs, le nombre de plans à moyenner pourrait être moindre. Si la dynamique de l’indicateur

de calcium est très rapide, on devrait probablement choisir de moyenner moins de plans. Sachant cela, plusieurs stratégies peuvent être utilisées pour améliorer les performances de l’al- gorithme. Dans notre cas, on choisit d’effectuer la segmentation sur plusieurs cartes sommaires réalisées pour chaque tranche de 1000 images (tableau 2.15).

Table 2.15 – Effet de l’intervalle choisi sur la segmentation - Plan 17 Positives TP FP FN Sensibilité Précision score F1

images 1 à 1000 235 91 4 144 0,39 0,96 0,55 images 1001 à 2000 235 91 6 144 0,39 0,94 0,55 images 2001 à 3000 235 78 2 157 0,33 0,98 0,50 images 3001 à 4000 235 76 5 159 0,32 0,94 0,48 images 4001 à 5000 235 72 11 163 0,31 0,87 0,45 images 5001 à 6000 235 68 9 167 0,29 0,88 0,44 superposition 235 121 18 114 0,51 0,87 0,65

On remarque qu’en combinant les résultats de segmentation pour chacune de ces tranches (en additionnant simplement les masques), les résultats sont considérablement améliorés comparé aux résultats obtenus lorsque la segmentation est effectuée sur l’image sommaire de tous les plans. On remarque que la sensibilité est effectivement considérablement plus élevée que celle pour les tranches individuelles. On remarque également que, bien qu’il soit augmenté lorsqu’on combine les tranches, le réseau de neurones à convolution produit très peu de faux positifs.

Documents relatifs