如何在MATLAB中实现这个神经网络成本函数:
以下是符号的含义:
% m 是训练样本的数量。 [标量数值]% K 是输出节点的数量。 [标量数值]% Y 是训练输出的矩阵。 [m 行 k 列的矩阵]% y^{(i)}_{k} 是第 i 个训练输出(目标)对应第 k 个输出节点。 [标量数值]% x^{(i)} 是第 i 个训练输入。 [所有输入节点的列向量]% h_{\theta}(x^{(i)})_{k} 是假设函数在输出 k 处的值,使用权重 theta 和第 i 个训练输入。 [标量数值]%注意: h_{\theta}(x^{(i)}) 将是一个有 K 行的列向量。
我对嵌套求和、偏置节点以及这个方程的总体复杂性感到困惑。我还因为有两个权重矩阵而挣扎,一个连接输入到隐藏层,另一个连接隐藏层到输出。这是我目前的尝试。
定义变量
m = 100 %训练样本的数量K = 2 %输出节点的数量E = 2 %输入节点的数量A = 2 %每个隐藏层的节点数量L = 1 %隐藏层的数量Y = [2.2, 3.5 %y1 和 y2 的目标值(见页面底部的图片) 1.7, 2.1 1.9, 3.6 . . %实际代码中会填满,但为了节省空间我使用了省略号。将会有 m 行。 . . . . 2.8, 1.6]X = [1.1, 1.8 %训练输入。将会有 m 行 8.5, 1.0 9.5, 1.8 . . . . . . 1.4, 0.8]W1 = [1.3, . . 0.4 %这是一个 E 行 A 列的随机数矩阵。这是初始权重矩阵。 . . . - 2 . . . 3.1 . . . - 1 2.1, -8, 1.2, 2.1]W2 = [1.3, . . 0.4 %这是一个 A 行 K 列的随机数矩阵。这是初始权重矩阵。 . . . - 2 . . . 3.1 . . . - 1 2.1, -8, 1.2, 2.1]
使用这些权重的假设函数等于…
Htheta = sigmf( dot(W2 , sigmf(dot(W1 , X))) ) %这将是一个有 K 行的列向量。
使用这些权重的成本函数等于…(这是我挣扎的地方)
sum1 = 0 for i = 1:K sum1 = sum1 + Y(k,i) *log(Htheta(k)) + (1 - Y(k,i))*log(1-Htheta(k))
我只是不断地写这样的东西,然后意识到全错了。我无论如何都无法弄清楚如何进行嵌套求和,或者如何包含输入矩阵,或者如何做任何事情。这都非常复杂。
我该如何在MATLAB中创建这个方程?
非常感谢!
注意: 代码的颜色奇怪,因为stackoverflow不知道我在用MATLAB编程。我也直接写进了stackoverflow,所以可能有语法错误。我更感兴趣的是如何去做这件事的一般思路,而不是仅仅复制粘贴代码。这就是为什么我没有费心去处理分号等细节的原因。
回答:
我使用了与您提到的相同的误差函数来实现神经网络。不幸的是,我已经有一段时间没有使用MATLAB了,但我对Octave相当熟练,希望这对您仍然有用,因为Octave中的许多函数与MATLAB类似。
@[隐藏人名]提供了一个计算成本函数的好代码片段。然而,这个代码是用循环结构编写的,我想提供一个向量化的实现。
为了评估当前的theta值,我们需要在整个网络中进行前馈/ 前向传播
。我假设您知道如何编写前馈代码,因为您只关心 J(theta)
误差。让表示您前向传播结果的向量为 F
一旦您完成了前馈,您需要执行方程。注意,我以向量化的方式实现这一点。
J = (-1/m) * sum(sum(Y .* log(F) + (1-Y) .* log(1-F),2));
这将计算关于以下部分的求和:
现在我们必须加上正则化项,即:
通常,我们会有任意数量的theta矩阵,但在这种情况下我们有2个,所以我们可以只进行几个求和来得到:
J =J + (lambda/(2*m)) * (sum(sum(theta_1(:,2:end).^2,2)) + sum(sum(theta_2(:,2:end).^2,2)));
注意在每个求和中我只从第二列开始到最后。这是因为第一列将对应于我们为偏置单元训练的 theta
值。
所以这是一个计算J的向量化实现。
希望这对您有帮助!