神经网络:用于连续输出变量的Sigmoid激活函数

好的,我目前正在Coursera上学习Andrew Ng的机器学习课程,我想调整第四次作业中完成的神经网络。

特别是,我在作业中正确完成的神经网络如下:

  • Sigmoid激活函数:g(z) = 1/(1+e^(-z))
  • 10个输出单元,每个可以取0或1
  • 一个隐藏层
  • 使用反向传播方法最小化成本函数
  • 成本函数:

-1/m sum^m_{i=1} sum^K_{k=1} (y_k_{(i)}) log((h_theta(x^{(i)}_k) + (1-y_k^{(i)}) log(1-h_theta(x^{(i)}_k) + lambda/(2*m)(sum_{l=1}^{L-1}sum_{i=1}^{s_l} sum_{j=1}^{s_{l=1}} (Theta_{ji}^{(l)})^{2}

其中 L=层数s_l = 第l层单元数m = 训练样本数K = 输出单元数

现在我想调整练习,使其有一个连续的输出单元,可以取[0,1]之间的任何值,我正在尝试找出需要更改的内容,目前我已经做了以下调整:

  • 用自己的数据替换了原数据,即输出为0到1之间的连续变量
  • 更新了对输出单元数量的引用
  • 在反向传播算法中更新了成本函数为: J=1/(2m) * sum^m_{i=1} (g(a_3)-y)^2 + lambda/(2*m)(sum_{l=1}^{L-1}sum_{i=1}^{s_l} sum_{j=1}^{s_{l=1}} (Theta_{ji}^{(l)})^{2}其中 a_3 是通过前向传播确定的输出单元的值。

我确信还需要做其他更改,因为梯度检查方法显示通过反向传播确定的梯度与通过数值近似确定的梯度不再匹配。我没有更改Sigmoid梯度;它保持为 f(z)*(1-f(z)),其中 f(z) 是Sigmoid函数 1/(1+e^(-z))),也没有更新导数的数值近似公式;只是 (J(theta+e) - J(theta-e))/(2e)

有谁能建议还需要进行哪些步骤吗?

在Matlab中编写的代码如下:

% FORWARD PROPAGATION% 输入层a1 = [ones(m,1),X];% 隐藏层z2 = a1*Theta1';a2 = sigmoid(z2);a2 = [ones(m,1),a2];% 输出层z3 = a2*Theta2';a3 = sigmoid(z3);% BACKWARD PROPAGATIONdelta3 = a3 - y;delta2 = delta3*Theta2(:,2:end).*sigmoidGradient(z2);Theta1_grad = (delta2'*a1)/m;Theta2_grad = (delta3'*a2)/m;% COST FUNCTIONJ = 1/(2 * m) * sum( (a3-y).^2 );% 在成本函数和梯度中实现正则化。Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + Theta1(:,2:end)*lambda/m;Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + Theta2(:,2:end)*lambda/m;J = J + lambda/(2*m)*( sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2)));

后来我意识到这个问题与@Mikhail Erofeev在StackOverflow上提出的问题类似,但在这种情况下,我希望连续变量在0到1之间,因此使用Sigmoid函数。


回答:

首先,你的成本函数应该是:

J = 1/m * sum( (a3-y).^2 );

我认为你的 Theta2_grad = (delta3'*a2)/m; 在更改为 delta3 = 1/2 * (a3 - y); 后应该与数值近似匹配。

有关更多详细信息,请查看此幻灯片

编辑:如果我们的代码之间存在一些细微差异,我在下面粘贴了我的代码供你参考。该代码已经与数值近似函数 checkNNGradients(lambda); 进行了比较,相对差异小于 1e-4(虽然没有达到Dr. Andrew Ng要求的 1e-11)。

function [J grad] = nnCostFunctionRegression(nn_params, ...                                   input_layer_size, ...                                   hidden_layer_size, ...                                   num_labels, ...                                   X, y, lambda)Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...                 hidden_layer_size, (input_layer_size + 1));Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...                 num_labels, (hidden_layer_size + 1));m = size(X, 1);   J = 0;Theta1_grad = zeros(size(Theta1));Theta2_grad = zeros(size(Theta2));X = [ones(m, 1) X];   z1 = sigmoid(X * Theta1');zs = z1;z1 = [ones(m, 1) z1];z2 = z1 * Theta2';ht = sigmoid(z2);y_recode = zeros(length(y),num_labels);for i=1:length(y)    y_recode(i,y(i))=1;end    y = y_recode;regularization=lambda/2/m*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)));J=1/(m)*sum(sum((ht - y).^2))+regularization;delta_3 = 1/2*(ht - y);delta_2 = delta_3 * Theta2(:,2:end) .* sigmoidGradient(X * Theta1');delta_cap2 = delta_3' * z1; delta_cap1 = delta_2' * X;Theta1_grad = ((1/m) * delta_cap1)+ ((lambda/m) * (Theta1));Theta2_grad = ((1/m) * delta_cap2)+ ((lambda/m) * (Theta2));Theta1_grad(:,1) = Theta1_grad(:,1)-((lambda/m) * (Theta1(:,1)));Theta2_grad(:,1) = Theta2_grad(:,1)-((lambda/m) * (Theta2(:,1)));grad = [Theta1_grad(:) ; Theta2_grad(:)];end

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中创建了一个多类分类项目。该项目可以对…

发表回复

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