【发布时间】:2014-01-06 01:22:40
【问题描述】:
好的,所以我在 Andrew Ng's machine learning course on coursera 的中间,并且想要调整作为作业 4 的一部分完成的神经网络。
特别是,我作为作业的一部分正确完成的神经网络如下:
- Sigmoid 激活函数:
g(z) = 1/(1+e^(-z)) - 10 个输出单元,每个单元可以取 0 或 1
- 1 个隐藏层
- 用于最小化成本函数的反向传播方法
- 成本函数:
在哪里L=number of layers、s_l = number of units in layer l、m = number of training examples、K = number of output units
现在我想调整练习,以便有一个连续输出单元可以取 [0,1] 之间的任何值,我正在尝试找出需要更改的内容,到目前为止我有
- 将数据替换为我自己的数据,即输出是 0 到 1 之间的连续变量
- 更新了对输出单元数量的引用
- 将反向传播算法中的成本函数更新为:
其中
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
% input layer
a1 = [ones(m,1),X];
% hidden layer
z2 = a1*Theta1';
a2 = sigmoid(z2);
a2 = [ones(m,1),a2];
% output layer
z3 = a2*Theta2';
a3 = sigmoid(z3);
% BACKWARD PROPAGATION
delta3 = a3 - y;
delta2 = delta3*Theta2(:,2:end).*sigmoidGradient(z2);
Theta1_grad = (delta2'*a1)/m;
Theta2_grad = (delta3'*a2)/m;
% COST FUNCTION
J = 1/(2 * m) * sum( (a3-y).^2 );
% Implement regularization with the cost function and gradients.
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 on StackOverflow 提出的问题相似,但是在这种情况下,我希望连续变量介于 0 和 1 之间,因此使用 sigmoid 函数。
【问题讨论】:
-
您是否成功地实现了持续的结果?我让它运行,但它在第 40 次迭代左右停止并且没有产生好的结果。如果你能分享你最终得到的东西会很棒吗?
标签: matlab machine-learning neural-network