为什么这是为神经网络执行成本函数的正确方法?

Why is this the correct way to do a cost function for a neural network?

所以在用头撞墙几个小时后,我在网上寻找解决问题的方法,效果很好。我只想知道是什么导致了我最初处理它的方式出现问题。

这里有更多详细信息。输入是来自 MNIST 数据集的 20x20px 图像,有 5000 个样本,所以 X 或 A1 是 5000x400。单个隐藏层中有 25 个节点。输出是 0-9 位数字的单热向量。 y(不是Y,是y的one hot编码)是一个5000x1的向量,值为1-10。

这是成本函数的原始代码:

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?是元素明智的乘法吗?

仅供参考,如果您需要写出形式方程,这与 this question 是同一个问题。

感谢您提供的任何帮助!我真的很想知道我错在哪里

转自评论:
快速浏览一下,在 J = (1/m) * sum(sum((-Y*log(H]))' - (1-Y)*log(1-H]))'))) 中,括号肯定有问题,但可能与您将其粘贴到此处的方式有关,而不是与原始代码有关,因为当您 运行 时这会引发错误。如果我理解正确并且 Y、H 是矩阵,那么在您的第一个版本中 Y*log(H) 是矩阵乘法,而在第二个版本中 Y.*log(H) 是逐项乘法(不是矩阵乘法,只是 c(i,j)=a(i,j)*b(i,j) ).

更新 1:
关于您在评论中提出的问题。 在第一个屏幕截图中,您将 Y 矩阵的条目 Y(i,k) 中的每个值 yk(i) 和每个值 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) 进行操作(与 multiplying the matrices 完全不同)。之后,为了得到 2D 维矩阵 C 内所有值的总和,你使用八度函数 sum 两次:sum(sum(C)) 对列和行求和(或者如@Irreducible 建议的那样,只是sum(C(:))).

注意可能还有其他错误。