1

最急降下法を実行しようとしていますが、まったく同じデータを使用すると、オクターブ組み込みのfminuncと同じ結果を得ることができません。

私のコードは

%for 5000 iterations
for iter = 1:5000

%%Calculate the cost and the new gradient
[cost, grad] = costFunction(initial_theta, X, y);


%%Gradient = Old Gradient - (Learning Rate * New Gradient)
initial_theta = initial_theta - (alpha * grad);

end 

ここで、costFunctionは、例(X、y)とparameters(theta)が与えられたときに、コストと勾配を計算します。

組み込みのオクターブ関数fminuncもcostFunctionを呼び出し、同じデータを使用すると、はるかに少ない反復ではるかに優れた答えが見つかります。

オクターブが同じコスト関数を使用しているとすると、costFunctionが正しいと思います。

極小値に達して反復回数を増やす場合に備えて、学習率を下げてみましたが、コストが下がらなくなったので、最小値を見つけたようですが、最終的なシータのコストはまだはるかに高く、正確に近いところはありません

fminuncがより優れたアルゴリズムを使用している場合でも、最急降下法は、十分な反復とより小さな学習率で最終的に同じ答えを見つけることができますか?

または誰かが私が何か間違っているかどうかを見ることができますか?

助けてくれてありがとう。

4

1 に答える 1

2

あなたのコメントは間違っていますが、アルゴリズムは優れています。

勾配降下では、数値の問題に陥りやすいため、機能の正規化を実行することをお勧めします。

また、学習率が不明な場合は、動的に調整してみてください。何かのようなもの:

best_cost = Inf;
best_theta = initial_theta;
alpha = 1;

for iter = 1:500
  [cost, grad] = costFunction(best_theta, X_reg, y);

  if (cost < best_cost)
    best_theta = best_theta - alpha * grad;
    best_cost = cost;
  else
    alpha = alpha * 0.99
  end
end

さらに、異なる答えが同じ決定境界を与える可能性があることを覚えておいてください。たとえば、仮説 h(x) = x(0) + theta(1) * x(1) + theta(2) * x(2) の場合、これらの答えは同じ境界を与えます。

theta = [5, 10, 10];
theta = [10, 20, 20];
于 2012-09-23T20:46:58.383 に答える