MLP Нейронная сеть не обучается правильно, вероятно, сходится к локальному минимуму - PullRequest
4 голосов
/ 14 января 2012

Я делаю нейронную сеть MLP с обратным распространением в matlab. Проблема в том, что кажется, что она не в состоянии хорошо обрабатывать кривые в функции, а также плохо масштабируется со значениями. Например, он может достигать 80% от cos (x), но если я поставлю 100 * cos (x), он просто не будет тренироваться вообще.

Что еще более странно, так это то, что некоторые функции могут хорошо обучаться, в то время как другие просто не работают вообще .. Например: Хорошо обучен: http://img515.imageshack.us/img515/2148/coscox3.jpg

Не очень хорошо: http://img252.imageshack.us/img252/5370/cos2d.jpg (плавность после долгого времени)

Неправильные результаты, воткнуты так: http://img717.imageshack.us/img717/2145/ex2ug.jpg

Это алгоритм, который я пытаюсь реализовать:

http://img594.imageshack.us/img594/9590/13012012001.jpg

http://img27.imageshack.us/img27/954/13012012002.jpg

И это моя реализация:

close all;clc;

j=[4,3,1]; %number neurons in hidden layers and output layer
i=[1,j(1),j(2)];

X=0:0.1:pi;
d=cos(X);

%-----------Weights------------%
%-----First layer weights------%
W1p=rand([i(1)+1,j(1)]);
W1p=W1p/sum(W1p(:));
W1=rand([i(1)+1,j(1)]);
W1=W1/sum(W1(:));

%-----Second layer weights------%
W2p=rand([i(2)+1,j(2)]);
W2p=W2p/sum(W2p(:));
W2=rand([i(2)+1,j(2)]);
W2=W2/sum(W2(:));

%-----Third layer weights------%
W3p=rand([i(3)+1,j(3)]);
W3p=W3p/sum(W3p(:));
W3=rand([i(3)+1,j(3)]);
W3=W3/sum(W3(:));
%-----------/Weights-----------%

V1=zeros(1,j(1));
V2=zeros(1,j(2));
V3=zeros(1,j(3));

Y1a=zeros(1,j(1));
Y1=[0 Y1a];
Y2a=zeros(1,j(2));
Y2=[0 Y2a];

O=zeros(1,j(3));
e=zeros(1,j(3));

%----Learning and forgetting factor-----%
alpha=0.1;
etha=0.1;
sortie=zeros(1,length(X));
while(1)

n=randi(length(X),1);
%---------------Feed forward---------------%

%-----First layer-----%
X0=[-1 X(:,n)];
V1=X0*W1;
Y1a=tanh(V1/2);

%----Second layer-----%
Y1=[-1 Y1a];
V2=Y1*W2;
Y2a=tanh(V2/2);

%----Output layer-----%
Y2=[-1 Y2a];
V3=Y2*W3;
O=tanh(V3/2);
e=d(n)-O;
sortie(n)=O;

%------------/Feed Forward-----------------%

%------------Backward propagation---------%

%----Output layer-----%
delta3=e*0.5*(1+O)*(1-O);
W3n=W3+ alpha*(W3-W3p) + etha * delta3 * W3;

%----Second Layer-----%
delta2=zeros(1,length(Y2a));
for b=1:length(Y2a)
delta2(b)=0.5*(1-Y2a(b))*(1+Y2a(b)) * sum(delta3*W3(b+1,1));
end

W2n=W2 + alpha*(W2-W2p)+ (etha * delta2'*Y1)';

%----First Layer-----%
delta1=zeros(1,length(Y1a));
for b=1:length(Y1a)
    for m=1:length(Y2a)
          delta1(b)=0.5*(1-Y1a(b))*(1+Y1a(b)) * sum(delta2(m)*W2(b+1,m));


    end
end


W1n=W1+ alpha*(W1-W1p)+ (etha * delta1'*X0)';                                    
W3p=W3;
W3=W3n;

W2p=W2;
W2=W2n;

W1p=W1;
W1=W1n;

figure(1);
plot(1:length(d),d,1:length(d),sortie);

drawnow;
end

Мой вопрос: что я могу сделать, чтобы исправить это? Мои догадки до сих пор состоят в том, что у меня либо есть что-то не так в обратном распространении, особенно в вычислении дельты и весов. Или у меня неверно инициализированы веса (слишком малы или не зависят от исходного ввода) ..

1 Ответ

3 голосов
/ 14 января 2012

Я не эксперт в этой области, но у меня был некоторый опыт работы с нейронными сетями на основе Matlab и Java.

Могу предположить, что использование набора инструментов могло бы помочь вам, оно помогло другимЯ знаю.

Я могу предложить несколько пунктов информации:

  • Не ожидайте, что NN будут работать со всеми данными обучения, иногда данные слишком сложны для классификации втаким образом

  • Формат вашего NN будет иметь решающее влияние на производительность конвергенции

Наконец:

  • Подобные алгоритмы обучения часто тренируются лучше, когда различные параметры нормализованы до +/- 1. cos (x) нормализовано, 100 * cos * (x) - нет.Это связано с тем, что требуемые обновления весов намного больше, и система обучения может предпринимать очень маленькие шаги.Если у вас есть данные с несколькими различными диапазонами, то нормализация жизненно важна.Могу ли я предложить вам начать, как минимум, с расследования, что
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...