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

descente de gradient - algorithme

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 ?

Avatar de l’utilisateur
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!

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite