2012-01-14 3 views
4

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

Что еще страннее в том, что некоторые функции, которые она может хорошо тренироваться, в то время как другие это просто не работает вообще .. Например: Хорошо обученные: 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 

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

+0

Существует, конечно, набор инструментов Neural Nets в Matalb и множество реализаций по всему Интернету. Почему бы не сравнить результаты с чем-то известным? – Jorge

+0

У меня нет инструментария. – patokun

+0

см. Http://homepages.cae.wisc.edu/~ece539/matlab/ – Jorge

ответ

3

Я не специалист в этой области, но у меня есть опыт работы с Matlab и Java Neural Network Systems.

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

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

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

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

Наконец:

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