Программирование базовой нейронной сети с нуля в MATLAB

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

То, что я сделал до сих пор, может быть совершенно неверным. Я слежу за онлайн-курсом по машинному обучению в Стэнфорде, организованным профессором Эндрю Й. Нгом, и стараюсь в полной мере реализовать то, чему он научил.

Подскажите, пожалуйста, верны ли части моего кода для функции прямой связи и функции стоимости, и где я ошибаюсь в части минимизации (оптимизации)?

У меня есть нейронная сеть прямой связи с двумя слоями.

Код MATLAB для прямой связи:

function [ Y ] = feedforward2( X,W1,W2)
%This takes a row vector of inputs into the neural net with weight matrices W1 and W2 and returns a row vector of the outputs from the neural net

%Remember X, Y, and A can be vectors, and W1 and W2 Matrices 

X=transpose(X);            %X needs to be a column vector
A = sigmf(W1*X,[1 0]);     %Values of the first hidden layer  
Y = sigmf(W2*A,[1 0]);     %Output Values of the network
Y = transpose(Y);          %Y needs to be a column vector

Так, например, двухслойная нейронная сеть с двумя входами и двумя выходами будет выглядеть примерно так:

      a1
x1 o--o--o y1      (all weights equal 1)
    \/ \/
    /\ /\
x2 o--o--o y2
      a2

если мы вставим:

X=[2,3];
W1=ones(2,2);
W2=ones(2,2);

Y = feedforward2(X,W1,W2)

мы получаем вывод:

Y = [0.5,0.5]

Это представляет значения y1 и y2, показанные на рисунке нейронной сети

Код MATLAB для функции квадрата стоимости ошибки:

function [ C ] = cost( W1,W2,Xtrain,Ytrain )
%This gives a value seeing how close W1 and W2 are to giving a network that represents the Xtrain and Ytrain data
%It uses the squared error cost function
%The closer the cost is to zero, the better these particular weights are at giving a network that represents the training data
%If the cost is zero, the weights give a network that when the Xtrain data is put in, The Ytrain data comes out

M = size(Xtrain,1);  %Number of training examples

oldsum = 0;

for i = 1:M,
        H = feedforward2(Xtrain,W1,W2); 
        temp = ( H(i) - Ytrain(i) )^2;
        Sum = temp + oldsum;
        oldsum = Sum;
end

C = (1/2*M) * Sum;

end

пример

Так, например, если данные обучения:

Xtrain =[0,0;        Ytrain=[0/57;
        1,2;           3/57;
        4,1;           5/57;
        5,2;           7/57;                                                           a1    
        3,4;           7/57;    %This will be for a two input one output network  x1 o--o y1
        5,3;           8/57;                                                          \/ \_o 
        1,5;           6/57;                                                          /\ /
        6,2;           8/57;                                                      x2 o--o      
        2,1;           3/57;                                                           a2    
        5,5;]          10/57;]

Начнем с начальных случайных весов

W1=[2,3;     W2=[3,2]
    4,1]

Если мы вставим:

Y= feedforward2([6,2],W1,W2)

Мы получаем

Y = 0.9933 

Это далеко от того, что должно быть в данных обучения (8/57 = 0,1404). Таким образом, начальные случайные веса W1 и W2, где неправильное предположение.

Чтобы точно измерить, насколько плоха / хороша угадывание весов случайных весов, мы используем функцию стоимости:

C= cost(W1,W2,Xtrain,Ytrain)

Это дает значение:

C = 6.6031e+003

Минимизация функции стоимости

Если мы минимизируем функцию стоимости путем поиска всех возможных переменных W1 и W2 и затем выбираем самую низкую, это даст сеть, которая наилучшим образом приближает обучающие данные

Но когда я использую код:

 [W1,W2]=fminsearch(cost(W1,W2,Xtrain,Ytrain),[W1,W2])

Это дает сообщение об ошибке. Там написано: «Ошибка при использовании horzcat. Размеры аргументов CAT не согласованы». Почему я получаю эту ошибку и что я могу сделать, чтобы ее исправить?

Подскажите, пожалуйста, верны ли части моего кода для функции прямой связи и функции стоимости, и где я ошибаюсь в части минимизации (оптимизации)?

Спасибо!!!

Ответы на вопрос(1)

Ваш ответ на вопрос