2013-12-18 73 views
5

好了,所以我在Andrew Ng's machine learning course on coursera中间,想适应其完成任务为4神经网络:乙状结肠激活功能的连续输出变量

尤其是神经网络的一部分神经网络其中我已经正确完成的任务的一部分如下:

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

-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=number of layerss_l = number of units in layer lm = number of training examplesK = number of output units

现在我想调整运动所以有一个连续的输出单元,它取[0,1]之间的任何值,我试图找出需要改变的地方,所以f AR我已经

  • 代替我自己的,即,使得输出是连续变量的输出的单位数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是从正向传播确定的输出单位的值。

我确定当梯度检查方法显示由反向传播确定的梯度并且数值近似不再匹配时,其他东西必须改变。我没有改变乙状结肠的梯度;它留在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函数。

+0

你是否使它工作,持续的结果?我让它运行,但它停止了大约40次迭代,并没有产生好的结果。如果你能分享你最终的结果,那会很棒吗? –

回答

1

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

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

我觉得你Theta2_grad = (delta3'*a2)/m;有望改变为delta3 = 1/2 * (a3 - y);后以匹配数值逼近)。

检查此slide了解更多详情。

编辑: 如果我们的代码之间存在一些小的差异,我粘贴了我的代码以供参考。该代码已经用数值逼近功能checkNNGradients(lambda);相比,相对差小于1e-4

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 
+0

感谢您的建议;按照您的建议,我尝试更新delta3和delta2,但仍然不匹配渐变。 – user1420372

+0

@ user1420372您的成本函数应该是a3-y而不是sigmoid(a3)-y,请参阅我在答案中的更新。 – lennon310

+0

谢谢!实际上我刚刚注意到 - 但是渐变仍然不正确 - 将编辑有问题的代码进行修复。 – user1420372

0

(不Dr.Andrew伍虽然符合1e-11要求)如果你想有连续输出尽量不要使用计算目标值时的S形激活。

a1 = [ones(m, 1) X]; 
a2 = sigmoid(X * Theta1'); 
a2 = [ones(m, 1) z1]; 
a3 = z1 * Theta2'; 
ht = a3; 

在使用nnCostFunction之前对输入进行标准化。其他一切都保持不变。