Почему это правильный способ сделать функцию стоимости для нейронной сети? - PullRequest
0 голосов
/ 25 марта 2019

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

enter image description here

enter image description here

вот еще несколько деталей.Входные данные представляют собой изображение размером 20x20 пикселей из набора данных MNIST, и имеется 5000 выборок, поэтому X или A1 - 5000x400.В одном скрытом слое 25 узлов.Выход представляет собой один горячий вектор из 0-9 цифр.y (не Y, это горячее кодирование y) - это вектор 5000x1 со значением 1-10.

enter image description here

Здесьбыл мой оригинальный код для функции стоимости:

Y = zeros(m, num_labels);
   for i = 1:m
   Y(i, y(i)) = 1; 
endfor
H = sigmoid(Theta2*[ones(1,m);sigmoid(Theta1*[ones(m, 1) X]'))
J = (1/m) * sum(sum((-Y*log(H]))' - (1-Y)*log(1-H]))')))

Но потом я нашел это:

A1 = [ones(m, 1) X];
Z2 = A1 * Theta1';
A2 = [ones(size(Z2, 1), 1) sigmoid(Z2)];
Z3 = A2*Theta2';
H = A3 = sigmoid(Z3);

J = (1/m)*sum(sum((-Y).*log(H) - (1-Y).*log(1-H), 2));

Я вижу, что это может быть немного чище, но что функционально заставляет мой оригинальный кодполучить 304.88, а другой получить ~ 0.25?Это умножение по элементам?

К вашему сведению, это та же проблема, что и этот вопрос , если вам нужно выписать формальное уравнение.

Спасибо за любую помощь, я могуполучить!Я очень хочу понять, где я иду не так

1 Ответ

1 голос
/ 25 марта 2019

Перевод из комментариев:
Вкратце, в J = (1/m) * sum(sum((-Y*log(H]))' - (1-Y)*log(1-H]))'))) определенно что-то происходит с круглыми скобками, но, вероятно, с тем, как вы вставили это здесь, а не с исходным кодом, так как это вызовет ошибку при запуске. Если я правильно понимаю, и Y, H - матрицы, то в вашей 1-й версии Y*log(H) - это умножение матриц, в то время как во 2-й версии Y.*log(H) - умножение на вход (не умножение матриц, просто c(i,j)=a(i,j)*b(i,j)).

Обновление 1:
По поводу вашего вопроса в комментарии. На первом скриншоте вы представляете каждое значение yk (i) в записи Y(i,k) матрицы Y и каждое значение h (x ^ (i)) k как H(i,k). В общем, для каждого i, k вы хотите вычислить Y(i,k) log(H(i,k)) + (1-Y(i,k)) log(1-H(i,k)). Вы можете сделать это для всех значений вместе и сохранить результат в матрице C. Тогда C = Y.*log(H) + (1-Y).*log(1-H) и каждый C (i, k) имеет вышеупомянутое значение. Это операция .*, потому что вы хотите выполнить операцию для каждого элемента (i, k) каждой матрицы (в отличие от умножения матриц , что совершенно отличается). Затем, чтобы получить сумму всех значений внутри двумерной матрицы C, вы используете функцию октавы sum дважды: sum(sum(C)) для суммирования как по столбцам, так и по строкам (или, как предложено @ Irreducible, просто sum(C(:))) .

Обратите внимание, что могут быть и другие ошибки.

...