Ошибка обратного распространения: концептуальная или программная?

Я написал следующий алгоритм обратного распространения для моделирования функции идентификации двух входов.

clc
% clear

nh = 3;              % neurons in hidden layer
ni = 2;              % neurons in input layer

eta = .001;          % the learning rate
traningSize =100;

for x=1:traningSize 
    input   = rand(traningSize,ni);
    test    = input;
end





nk = size(test,2);    % neurons in output layer

b1 = rand(1,nh);%+ .5;
b2 = rand(1,nk);%- .5;
w1 = rand(nh,ni) + .5;
w2 = rand(nk,nh) - .5;

figure
hold on;

for iter = 1 :5000
    errSq = 0;
    for x = 1: traningSize

        a0      = input(x,:);
        ex      = test(x,:);

        [a1, a2]= feedForward(a0,w1,w2,b1,b2);

        del2    = (a2-ex) .* (1-a2) .* (a2);
        del1    = (del2 * w2) .* (1-a1) .* (a1);

        delB2   = del2;
        delB1   = del1;

        delW2   = zeros(nk,nh);
        for i = 1:nh
            for j = 1:nk
                delW2   = a1(i) * del2(j);
            end
        end
        for i = 1:ni
            for j = 1:nh
                delW1   = a0(i) * del1(j);
            end
        end

        b2 = b2 - eta * delB2;
        b1 = b1 - eta * delB1;

        w2 = w2 - eta * delW2;
        w1 = w1 - eta * delW1;

        errSq = errSq + sum(a2-ex) .* sum(a2-ex);

    end

cost = errSq /(2 * traningSize);
plot(iter,cost,'o');

if cost < 0.005
    cost
    break
end

end    
cost

Функция FeedForward:

function [a1, a2]  = feedForward(a0,w1,w2,b1,b2)

    z1      = a0 * w1' + b1;
    a1      = sig(z1);
    z2      = a1 * w2' + b2;
    a2      = sig(z2);


end

График функции стоимости График функции стоимости

Теперь что я путаю?

Это какая-то программная ошибка, которая ускользнула от моего внимания? или я неправильно реализую алгоритм?

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

Синий> ожидаемый результат; красный > вывод нейронной сети

Синий › ожидаемый результат; красный › результат нейронной сети

также почему стоимость иногда повышается, а затем снижается (как на рисунке 1)


person Soumy    schedule 13.07.2015    source источник


Ответы (1)


Как оказалось, мне нужно было исправить программную ошибку;

    delW2   = zeros(nk,nh);
    for i = 1:nh
        for j = 1:nk
            delW2(j,i)   = a1(i) * del2(j);   % forgot the index for delW2
        end
    end
    delW1   = zeros(nh,ni);                   % initilize delWI1 (although this is optional)
    for i = 1:ni
        for j = 1:nh
            delW1(j,i)   = a0(i) * del1(j);   % forgot the index for delW1
        end
    end

И удалите сигмовидную функцию из выходного слоя. т.е. сделать линейный выходной слой, чтобы получить приемлемые результаты.

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

person Soumy    schedule 14.07.2015
comment
если вы моделируете проблему классификации, то наиболее часто используемой функцией активации для выходного слоя является softmax. - person Ahmed Abobakr; 14.07.2015