Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Le perceptron est la brique élémentaire des réseaux de neurones. Il calcule une somme pondérée de ses entrées, ajoute un biais, et passe le résultat dans une fonction d’activation. Dans ce carnet, nous :

  1. Construisons un perceptron à partir de zéro avec NumPy.
  2. L’entraînons avec la règle d’apprentissage classique du perceptron pour séparer des événements sismiques du bruit.
  3. Réutilisons le même perceptron comme régresseur linéaire entraîné par descente de gradient, et le comparons aux moindres carrés ordinaires (ordinary least squares, OLS).
  4. Étudions comment le taux d’apprentissage (learning rate) modifie l’entraînement.

🖥️ Diapositives du cours — Séance 21 (mer. 18 nov.)

1. Un perceptron à partir de zéro

Un perceptron d’entrées x1,…,xnx_1, \dots, x_n, de poids w1,…,wnw_1, \dots, w_n et de poids de biais bb calcule

o=ϕ(∑jwjxj+b),o = \phi\left(\sum_j w_j x_j + b\right),

où ϕ est la fonction d’activation. Nous implémentons trois activations : aucune (identité), sigmoïde et échelon.

1.1 Tester le perceptron

Avec un poids fixé à 1, un biais de 0 et aucune activation, le perceptron doit retourner son entrée inchangée.

array([100. , -1. , 0.1])

2. Classifier des détections sismiques

Les détecteurs sismiques résument de courtes fenêtres d’un sismogramme par quelques caractéristiques (features). La table mlgeo_synth.detector_features contient quatre caractéristiques par fenêtre : le rapport STA/LTA (sta_lta), le kurtosis de la forme d’onde, le centroïde spectral en Hz et la fréquence dominante en Hz. L’étiquette vaut 1 pour une fenêtre de séisme et 0 pour une fenêtre de bruit, avec des classes équilibrées.

Nous utilisons deux caractéristiques, sta_lta et spectral_centroid_hz. Les événements ont des arrivées impulsives (STA/LTA élevé) et plus d’énergie haute fréquence (centroïde spectral élevé) que le bruit de fond.

     sta_lta   kurtosis  spectral_centroid_hz  dominant_freq_hz  label
0  10.419133  22.113184              9.556484          7.786286      1
1   3.314406   2.773164              1.716694          1.009758      0
2   2.336543   4.639630              1.271397          0.251278      0
3   3.976867  13.591792              6.692700          4.682170      1
4   1.151811   3.131239              4.474578          1.426544      0
<Figure size 600x450 with 1 Axes>

2.1 Pourquoi une tranche facile à deux caractéristiques ?

La règle d’apprentissage classique du perceptron ne converge que lorsque les données sont linéairement séparables : il doit exister une droite qui classe correctement chaque échantillon d’entraînement. Si les classes se recouvrent, la règle continue de mettre à jour les poids indéfiniment. Le nuage de points ci-dessus montre une petite bande de recouvrement entre les deux nuages : le jeu de données complet n’est donc pas linéairement séparable.

Nous sélectionnons donc un sous-ensemble quasi linéairement séparable : nous calculons un score combiné simple, sta_lta + spectral_centroid_hz, et écartons les échantillons de la bande de recouvrement. Nous nous en tenons aussi à exactement deux caractéristiques, pour pouvoir tracer la frontière de décision comme une droite dans le plan. Les données réelles de détecteurs sont plus désordonnées ; les carnets suivants traitent le recouvrement avec des réseaux multicouches et des pertes fondées sur le gradient.

<Figure size 600x450 with 1 Axes>

2.2 La règle d’apprentissage du perceptron

Nous partons de poids tous nuls et utilisons l’activation en échelon, de sorte que le perceptron sort 0 ou 1. Nous balayons ensuite le jeu de données. Pour chaque échantillon, nous :

  1. Faisons une prédiction avec les poids courants.

  2. Mettons à jour chaque poids selon la règle

    wj=wj+Δwjw_j = w_j + \Delta w_j, où Δwj=η (ti−oi) xji\Delta w_j = \eta\,(t^i - o^i)\,x^i_j

    Ici η est le taux d’apprentissage, tit^i et oio^i sont la cible et la sortie pour l’échantillon ii, et xjix^i_j est l’entrée jj de cet échantillon. Le poids de biais reçoit la même mise à jour, avec une entrée égale à 1. Notez que les échantillons correctement classés (ti=oit^i = o^i) laissent les poids inchangés.

  3. Répétons des balayages complets (des époques) sur les données jusqu’à ce qu’une époque ne produise aucune erreur.

Un détail : avec des poids initiaux nuls, le taux d’apprentissage ne fait que mettre à l’échelle le vecteur de poids final. L’activation en échelon ignore cette échelle : la suite des prédictions, et le nombre d’époques avant convergence, sont donc les mêmes pour tout η>0\eta > 0.

Converged after 2 epochs; mistakes per epoch: [42, 0]
Weights: [0.03415388 0.03796047], bias: -0.220, training accuracy: 1.000

La règle converge en quelques époques et classe correctement chaque échantillon d’entraînement. Comme nous utilisons deux caractéristiques, la frontière de décision est la droite w1x1+w2x2+b=0w_1 x_1 + w_2 x_2 + b = 0, que nous pouvons tracer directement.

<Figure size 600x450 with 1 Axes>

Nous venons d’implémenter un algorithme en ligne (online) : les poids sont mis à jour après chaque échantillon, et non après avoir vu tout le jeu de données.

Exercice. Remplacez spectral_centroid_hz par kurtosis dans la cellule de sélection du sous-ensemble (gardez le même filtre par score sur les caractéristiques d’origine). La règle d’apprentissage converge-t-elle encore en moins de 50 époques ? Pourquoi, ou pourquoi pas ?

3. Ajuster une droite par descente de gradient

Le même perceptron, sans activation, est un modèle linéaire o=wx+bo = w x + b. Au lieu de la règle du perceptron, nous pouvons l’entraîner par descente de gradient sur une fonction de perte quadratique. Aucun terme de régularisation n’étant ajouté ici, cette perte moyennée sur les exemples est aussi la fonction objectif que minimise la descente de gradient. Nous générons un jeu de données linéaire bruité à ajuster.

<Figure size 600x400 with 1 Axes>

3.1 Fonction de perte

Nous utilisons l’erreur quadratique moyenne (mean squared error, MSE) comme perte, moyennée sur les exemples (mseCost ci-dessous).

np.float64(0.0)

3.2 Descente de gradient

La descente de gradient répète trois étapes : prédire, mesurer la perte, puis déplacer les poids d’un petit pas dans le sens opposé au gradient de la perte. Pour la MSE et un modèle linéaire, la mise à jour des poids est Δw=η XT(t−o)\Delta w = \eta\, X^T (t - o) et celle du biais Δb=η∑i(ti−oi)\Delta b = \eta \sum_i (t^i - o^i). Nous nous arrêtons quand la variation de la perte passe sous une tolérance, quand la perte cesse d’être finie (divergence), ou quand la limite d’itérations est atteinte.

<Figure size 1200x400 with 3 Axes>
'The mean squared error of our perceptron on the test half is: 1.122684'

3.3 Comparaison avec les moindres carrés ordinaires

Les moindres carrés ordinaires (OLS) résolvent le même problème sous forme analytique. Un perceptron entraîné par descente de gradient, s’il fonctionne, doit aboutir à presque la même droite.

<Figure size 1200x400 with 1 Axes>

4. Comment le taux d’apprentissage modifie l’entraînement

Le taux d’apprentissage η contrôle la taille du pas de la descente de gradient. Trop petit, l’entraînement se traîne ; trop grand, la perte oscille ou diverge. La grille ci-dessous entraîne le même perceptron, depuis le même départ à zéro, avec quatre taux d’apprentissage, et trace la courbe de perte de chacun (échelle logarithmique sur l’axe de la perte).

<Figure size 1000x700 with 4 Axes>

Lisez les quatre panneaux : à η=10−5\eta = 10^{-5}, la perte baisse encore après 2 000 itérations (trop lent). À η=10−4\eta = 10^{-4}, elle converge mais demande plus d’un millier d’itérations. À η=10−3\eta = 10^{-3}, elle converge en quelques centaines d’itérations. À η=10−2\eta = 10^{-2}, la perte croît sans borne : les pas dépassent le minimum et l’entraînement diverge (la courbe s’arrête là où la perte devient infinie).

4.1 Explorateur interactif

Le widget ci-dessous vous permet de faire varier le taux d’apprentissage, le nombre d’itérations, le critère d’arrêt et les poids initiaux, puis de réentraîner et de retracer. Les widgets ne fonctionnent pas dans la version statique du livre : téléchargez ce notebook et exécutez-le dans Jupyter pour l’utiliser. La grille statique ci-dessus montre la même leçon.

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Résumé

  • Un perceptron est une somme pondérée plus un biais, passée dans une fonction d’activation.
  • La règle d’apprentissage classique du perceptron ne converge que sur des données linéairement séparables. Elle a séparé nos fenêtres d’événements et de bruit à partir de deux caractéristiques de détecteur, et ce choix de deux caractéristiques nous a permis de tracer la frontière de décision.
  • Sans activation, le même perceptron est un régresseur linéaire. La descente de gradient sur la perte MSE retrouve presque la même droite que les OLS.
  • Le taux d’apprentissage règle le compromis entre convergence lente et divergence.

La suite : 4.1 Réseaux de neurones empile des perceptrons en couches pour traiter des données qu’une seule droite ne peut pas séparer.