MATLAB中神经网络成本函数

如何在MATLAB中实现这个神经网络成本函数:

Neural Network Cost Function

以下是符号的含义:

% 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中创建这个方程?

非常感谢!

一个有2个输入、2个输出、2个隐藏节点和2个偏置单元的2层神经网络

注意: 代码的颜色奇怪,因为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的向量化实现。

希望这对您有帮助!

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注