6

3 つのレイヤー (1 つの入力レイヤー、1 つの非表示レイヤー、1 つの出力レイヤーと連続した結果) を持つ回帰 NN を実装しようとしています。基礎として、 coursera.orgクラスから分類 NN を使用しましたが、(分類ではなく) 回帰問題に適合するようにコスト関数と勾配計算を変更しました。

私の nnCostFunction は次のとおりです。

function [J grad] = nnCostFunctionLinear(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);

a1 = X;
a1 = [ones(m, 1) a1];
a2 = a1 * Theta1';
a2 = [ones(m, 1) a2];
a3 = a2 * Theta2';
Y = y;

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

th1 = Theta1;
th1(:,1) = 0; %set bias = 0 in reg. formula
th2 = Theta2;
th2(:,1) = 0;

t1 = th1.^2;
t2 = th2.^2;
th = sum(sum(t1)) + sum(sum(t2));
th = lambda * th / (2*m);
J = J + th; %regularization


del_3 = a3 - Y;
t1 = del_3'*a2;
Theta2_grad = 2*(t1)/m + lambda*th2/m;

t1 = del_3 * Theta2;
del_2 = t1 .*  a2;
del_2 = del_2(:,2:end);
t1 = del_2'*a1;
Theta1_grad = 2*(t1)/m + lambda*th1/m;

grad = [Theta1_grad(:) ; Theta2_grad(:)];
end

次に、この関数をfmincgアルゴリズムで使用しますが、最初の反復では fmincg end が機能します。グラデーションが間違っていると思いますが、エラーが見つかりません。

誰でも助けることができますか?

4

4 に答える 4

1

Mikhail、私は連続回帰のために NN で遊んでいて、ある時点で同様の問題を抱えていました。ここで行う最善の方法は、モデルを実行する前に、数値計算に対して勾配計算をテストすることです。それが正しくない場合、fmincg はモデルをトレーニングできません。(ちなみに、時間がかかるため、数値勾配の使用はお勧めしません)。

あなたが Ng の Coursera クラスからこのアイデアを取り入れたことを考慮して、Octave に同じ表記法を使用するための可能な解決策を実装します。

    % Cost function without regularization.
    J = 1/2/m^2*sum((a3-Y).^2); 

    % In case it´s needed, regularization term is added (i.e. for Training).
    if (reg==true);
 J=J+lambda/2/m*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)));
    endif;

    % Derivatives are computed for layer 2 and 3.
    d3=(a3.-Y);
    d2=d3*Theta2(:,2:end);

    % Theta grad is computed without regularization.
    Theta1_grad=(d2'*a1)./m;
    Theta2_grad=(d3'*a2)./m;

    % Regularization is added to grad computation.
    Theta1_grad(:,2:end)=Theta1_grad(:,2:end)+(lambda/m).*Theta1(:,2:end);
    Theta2_grad(:,2:end)=Theta2_grad(:,2:end)+(lambda/m).*Theta2(:,2:end);

    % Unroll gradients.
    grad = [Theta1_grad(:) ; Theta2_grad(:)];

すべてのシグモイド活性化を取り除いたので、導関数の計算は非常に単純であり、元のコードが単純化されることに注意してください。

次のステップ: 1. このコードをチェックして、問題に意味があるかどうかを理解してください。2. 勾配チェックを使用して、勾配計算をテストします。3. 最後に、fmincg を使用して、異なる結果が得られることを確認します。

于 2012-12-28T22:13:59.657 に答える
1

私の理解が正しければ、最初のコード ブロック (以下に表示) -

m = size(X, 1);

a1 = X;
a1 = [ones(m, 1) a1];
a2 = a1 * Theta1';
a2 = [ones(m, 1) a2];
a3 = a2 * Theta2';
Y = y;

出力層で出力 a (3)を取得することです。

NN に関する Ng のスライドには、 a (3)を計算するための以下の構成があります。コードが示すものとは異なります。

  • g中間/出力層では、関数などの活性化関数を実行していませんsigmoid

ここに画像の説明を入力

正則化項のないコスト関数Jに関して、Ng のスライドには次の式があります。

ここに画像の説明を入力

以下を使用して計算できる理由がわかりません。

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

log関数をまったく含めていないためです。

于 2012-11-06T22:49:27.453 に答える