Réseau de neurones : Perceptron modifié - Algo - Programmation
MarshPosté le 03-02-2018 à 13:15:28
Bonjour,
Depuis longtemps, ce que je préfère c'est réinventer la roue. Et pour ça, et bien, il faut partir de zéro. Je me lance donc, à mes heures perdues, dans la réalisation d'un réseau de neurones à partir de rien, je vais faire ça en JS mais on s'en fout. Le but étant de faire à ma sauce puis de comparer à ce qui se fait. Sur d'autres choses j'ai pu constater que j'arrivais au même résultat que ce qui se faisait et je me dis alors que j'ai tout compris. Parfois je tombe sur un résultat différent et en comparant on comprend alors des subtilités qui auraient pu nous échapper si nous avions simplement recopié ce qui se faisait.
Le contexte général étant posé, je tiens à préciser que pour l'instant je ne Jovalise pas, mais bon si je vais jusqu'à la structuration du réseau je risque de partir sur des concepts et Jovaliser un petit peu.
Il faut donc commencer par coder les neurones et là je pars sur un modèle de Perceptron que l'on peut résumer à la vérification de la somme des produits des valeurs (vi) par leurs poids (wi) supérieure à une constante (C) : v1 * w1 + v2 * w2 + ... + vi * wi > C
On cherche alors à ajuster les poids au fur et à mesure de notre apprentissage afin que la condition soit vérifiée ou non en fonction de résultat attendu, pour cela on applique une correction de nos poids selon la "Delta rule" : Rés[attendu] - Rés[calculé] = v1 * Δw1 + v2 * Δw2 + ... + vi * Δwi Δwi = k.(Rés[attendu] - Rés[calculé]).vi
Le problème de ce modèle est qu'une valeur nulle entraîne une correction nulle de son poids associé. Afin de palier cela je voudrais essayer d'ajouter une constante associée (ai) à chaque valeur : (v1 + a1) * w1 + (v2 + a2) * w2 + ... + (vi + ai) * wi > C
Néanmoins cela implique de corriger deux paramètres pour chaque valeur : le poids (wi) et la constante associée (ai). Et comment savoir qui doit être plus fortement corrigé ? Pour l'instant nous avons qu'une équation : Rés[attendu] - Rés[calculé] = (v1 + a1 + Δa1) * Δw1 + (v2 + a2 + Δa2) * Δw2 + ... + (vi + ai + Δai) * Δwi
Et donc les deux corrections possibles : Δwi = k.(Rés[attendu] - Rés[calculé]).(vi + ai + Δai) Δai = Δwi / k.(Rés[attendu] - Rés[calculé]) - (vi + ai)
ll n'est donc pas possible de déterminer la correction de chaque paramètre. Maintenant, mettons que je n'en corrige qu'un, disons le poids, et qu'après la vérification de plusieurs jeux de valeurs j'observe la variation de la différence entre le résultat attendu et le résultat calculé. Si cette différence diminue à vitesse constante alors je me dis qu'il vaut mieux corriger la constante associée, si elle a tendance à accélérer ou ralentir alors je devrais mieux me concentrer sur les poids. Pensez-vous que c'est jouable ou je passe à côté de quelque chose ?
--------------- C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Marsh Posté le 03-02-2018 à 13:15:28
Bonjour,
Depuis longtemps, ce que je préfère c'est réinventer la roue. Et pour ça, et bien, il faut partir de zéro. Je me lance donc, à mes heures perdues, dans la réalisation d'un réseau de neurones à partir de rien, je vais faire ça en JS mais on s'en fout. Le but étant de faire à ma sauce puis de comparer à ce qui se fait. Sur d'autres choses j'ai pu constater que j'arrivais au même résultat que ce qui se faisait et je me dis alors que j'ai tout compris. Parfois je tombe sur un résultat différent et en comparant on comprend alors des subtilités qui auraient pu nous échapper si nous avions simplement recopié ce qui se faisait.
Le contexte général étant posé, je tiens à préciser que pour l'instant je ne Jovalise pas, mais bon si je vais jusqu'à la structuration du réseau je risque de partir sur des concepts et Jovaliser un petit peu.
Il faut donc commencer par coder les neurones et là je pars sur un modèle de Perceptron que l'on peut résumer à la vérification de la somme des produits des valeurs (vi) par leurs poids (wi) supérieure à une constante (C) :
v1 * w1 + v2 * w2 + ... + vi * wi > C
On cherche alors à ajuster les poids au fur et à mesure de notre apprentissage afin que la condition soit vérifiée ou non en fonction de résultat attendu, pour cela on applique une correction de nos poids selon la "Delta rule" :
Rés[attendu] - Rés[calculé] = v1 * Δw1 + v2 * Δw2 + ... + vi * Δwi
Δwi = k.(Rés[attendu] - Rés[calculé]).vi
Le problème de ce modèle est qu'une valeur nulle entraîne une correction nulle de son poids associé. Afin de palier cela je voudrais essayer d'ajouter une constante associée (ai) à chaque valeur :
(v1 + a1) * w1 + (v2 + a2) * w2 + ... + (vi + ai) * wi > C
Néanmoins cela implique de corriger deux paramètres pour chaque valeur : le poids (wi) et la constante associée (ai). Et comment savoir qui doit être plus fortement corrigé ? Pour l'instant nous avons qu'une équation :
Rés[attendu] - Rés[calculé] = (v1 + a1 + Δa1) * Δw1 + (v2 + a2 + Δa2) * Δw2 + ... + (vi + ai + Δai) * Δwi
Et donc les deux corrections possibles :
Δwi = k.(Rés[attendu] - Rés[calculé]).(vi + ai + Δai)
Δai = Δwi / k.(Rés[attendu] - Rés[calculé]) - (vi + ai)
ll n'est donc pas possible de déterminer la correction de chaque paramètre. Maintenant, mettons que je n'en corrige qu'un, disons le poids, et qu'après la vérification de plusieurs jeux de valeurs j'observe la variation de la différence entre le résultat attendu et le résultat calculé. Si cette différence diminue à vitesse constante alors je me dis qu'il vaut mieux corriger la constante associée, si elle a tendance à accélérer ou ralentir alors je devrais mieux me concentrer sur les poids.
Pensez-vous que c'est jouable ou je passe à côté de quelque chose ?
---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.