2013-12-18 11 views
5

オーケー連続出力変数のシグモイド活性化関数ので、私はAndrew Ng's machine learning course on courseraの途中で午前割り当て特に4ニューラルネットワーク:

、ニューラルネットワークの一部として完成させたニューラルネットワークを適応したいと思いますこれは私は、割り当ての一部として正しく完了した以下の通りであった:

  • シグモイド活性化関数:0または1
  • 1 HIを取ることができるg(z) = 1/(1+e^(-z))
  • 10出力部、各L=number of layerss_l = number of units in layer lm = number of training examplesK = number of output units

    は今、私は運動を調整したい

-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}

:コスト関数

  • コスト関数を最小化するために使用DDEN層
  • 逆伝搬法そのため、[0,1]と私は何を変更する必要があるかを考えている間に任意の値を取る1つの連続出力単位が存在するので、f AR私は出力がバックでのコスト関数を更新し、出力ユニット数
  • から0と1
  • 更新基準間連続変数であること、すなわち、そのような、自分でデータを置き換え

    • を持っています-propagation algorithm to: 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)はシグモイド関数1/(1+e^(-z)))です。また、微分方程式の数値近似を更新しませんでした。単純に(J(theta+e) - J(theta-e))/(2e)です。

    他にどのような手順が必要なのかアドバイスできますか?次のようにMATLABでコード化

    :私がので、この問題は、@Mikhail Erofeev on StackOverflowにより求めたものと同様であることを認識した

    % 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))); 
    

    が、しかし、この場合、I 0と1の間であり、したがって、使用する連続変数を希望シグモイド関数

  • +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あなたの費用関数はsigmoid(a3)-yではなくa3-yでなければなりません。 – lennon310

    +0

    ありがとう!私は実際に気付いただけですが、グラデーションはまだ間違っていますが、問題のコードを修正して修正します。 – user1420372

    0

    (ではないがDr.Andrewンによって1e-11要件を満たしている)であります目標値を計算するときにシグモイド活性化。

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

    nnCostFunctionで使用する前に入力を正規化します。それ以外は同じです。

    関連する問題