Descente de gradient - algorithme
Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
-
jean²
- Messages: 2
- Enregistré le: 28 Nov 2013, 17:09
-
par jean² » 28 Nov 2013, 17:24
Bonjour,
Je m'intéresse aux réseaux de neurones et j'essaye d'écrire un algorithme simple avec 1 neurone et 2 entrées pour que mon réseau crée une fonction linéaire : a=2*p1+p2.
Mon code est basé sur la descente de gradient afin d'actualiser mes 2 poids à chaque instant.
Il s'agit d'un code matlab :
- Code: Tout sélectionner
% Entrainement d'un réseau de neuronne pour créer une fonction linéaire du
% type a=2*p1+p2 avec 1 neurone à 2 entrées
clc, clear all
% technique d'apprentissage incrémental, i.e les poids associés aux
% différentes entrées sont actualisés à chaque instant par un système de
% correction d'erreur.
% L'objectif est ici d'entrainer le réseau à créer la fonction linéaire
% suivante : a=2*p1+p2
P = {[1;2] [2;1] [2;3] [3;1] [4;5] [6;7] [10;11] [16;2] [5;18] [14;5] [12;1] [17;5]}; % entrée neurone p1=1,p2=2 à t=t1..p1=2 et p2=1 à t=t2..ect..
D= {4 5 7 7 13 19 31 34 28 33 25 39}; % sortie neurone désirée A1=4 à t=t1, A2=5 à t=t2 ect...
W{1}=[0 0]; % initialisation des poids à zero
b=0; % biais
mu=0.1;% vitesse d'apprentissage
for i=1:length(P)
N=W{i}*P{i}; % niveau d'activation du neurone
A{i}=purelin(N);% Fonction de transfert linéaire
e{i}=D{i}-A{i};
F(i)=e{i}'*e{i}; % calcul de l'indice de performance : somme des erreurs quadratiques
grad=gradient(F);
W{i+1}=W{i}-mu*grad(i); % Régle de la "descente du gradient"
end
J'obtient des sorties qui divergent complétement au lieu de tendre vers mes sorties désirées!!!
Je n'arrive pas à voir ou se situe mon erreur. Pourriez-vous m'aider?
Merci!
-
mr_pyer
- Membre Relatif
- Messages: 137
- Enregistré le: 07 Avr 2013, 20:42
-
par mr_pyer » 28 Nov 2013, 18:15
Je n'y connais rien mais j'essaye quand même :zen:
Ici,
- Code: Tout sélectionner
F(i)=e{i}'*e{i}; % calcul de l'indice de performance : somme des erreurs quadratiques
e est une liste de nombre, la liste des erreurs commises non ? Dans ce cas e{i} est la i-ème erreur et F(i) le carré de la i-ème erreur, et non la somme. Je me trompe ?
-
Ben314
- Le Ben
- Messages: 21709
- Enregistré le: 11 Nov 2009, 21:53
-
par Ben314 » 28 Nov 2013, 20:07
Salut,
Y'a un truc louche dans ta boucle : elle commence à i=1 et, à la première ligne ton
N=W{i}*P{i};
fait donc référence à w{1} qui n'a pas été initialisé...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius
-
jean²
- Messages: 2
- Enregistré le: 28 Nov 2013, 17:09
-
par jean² » 29 Nov 2013, 14:57
Bonjour et merci pour ta réponse,
Oui c'est vrai je me suis trompé et c'est pas la seule erreur. Je me suis trompé pour le calcul du gradient de mon erreur quadratique F. Ce gradient doit se calculer selon les 2 poids de mon réseau. Le code suivant fonctionne mieux mais il a tendance à osciller pour des valeurs d'apprentissage (mu) trop importante, pour une valeur de mu=0.005, il semble bien fonctionner:
- Code: Tout sélectionner
% Entrainement d'un réseau de neuronne pour créer une fonction linéaire du
% type a=2*p1+p2 avec 1 neurone à 2 entrées
clc, clear all
% technique d'apprentissage incrémental, i.e les poids associés aux
% différentes entrées sont actualisés à chaque instant par un système de
% correction d'erreur.
% L'objectif est ici d'entrainer le réseau à créer la fonction linéaire
% suivante : a=2*p1+p2
P = {[1;2] [2;1] [2;3] [3;1] [4;5] [6;7] [10;11] [16;2] [5;18] [14;5] [12;1] [17;5] [2;20] [11;5] [25;12] [15;3]}; % entrée neurone p1=1,p2=2 à t=t1..p1=2 et p2=1 à t=t2..ect..
D= {4 5 7 7 13 19 31 34 28 33 25 39 24 27 62 33}; % sortie neurone désirée A1=4 à t=t1, A2=5 à t=t2 ect...
W{1}=[0 0]; % initialisation des poids à zero
b=0; % biais
mu=0.005;% vitesse d'apprentissage
for i=1:length(P)
N{i}=W{i}*P{i}; % niveau d'activation du neurone
A{i}=purelin(N{i});% Fonction de transfert linéaire (cf. aide matlab)
e(i)=D{i}-A{i};
gradF=-e(i)*P{i}
W{i+1}=W{i}-mu*gradF'; % Régle de la "descente du gradient"
end
plot(cell2mat(A))
hold on
plot(cell2mat(D),'-r')
Je pense que pour obtenir quelque chose de plus performant, il faudra ensuite s'orienter vers un algorithme d'optimisation plus performant (règle de hebb, rétropropagation, taux d'apprentissage variable...) à voir!
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités