テキスト データの L2 正則化を使用して、MATLAB でロジスティック回帰を実行しています。私のプログラムは、小さなデータセットに対してうまく機能します。より大きなセットの場合、無限に実行され続けます。
重複する可能性のある質問を見てきました( matlab fminunc not quitting (running inlimited) )。その質問では、初期シータのコストは NaN であり、コンソールにエラーが出力されました。私の実装では、実際の値のコストを取得しており、詳細なパラメーターが fminunc() に渡されてもエラーは発生しません。したがって、この質問は重複していない可能性があると思います。
それをより大きなセットにスケーリングするのに助けが必要です。私が現在取り組んでいるトレーニング データのサイズは、およそ 10k*12k (合計 12k ワードを含む 10k テキスト ファイル) です。したがって、m=10k のトレーニング例と n=12k の機能があります。
私のコスト関数は次のように定義されています。
function [J gradient] = costFunction(X, y, lambda, theta)
[m n] = size(X);
g = inline('1.0 ./ (1.0 + exp(-z))');
h = g(X*theta);
J =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ (lambda/(2*m))*norm(theta(2:end))^2;
gradient(1) = (1/m)*sum((h-y) .* X(:,1));
for i = 2:n
gradient(i) = (1/m)*sum((h-y) .* X(:,i)) - (lambda/m)*theta(i);
end
end
MATLAB の fminunc() 関数を使用して最適化を実行しています。fminunc() に渡すパラメーターは次のとおりです。
options = optimset('LargeScale', 'on', 'GradObj', 'on', 'MaxIter', MAX_ITR);
theta0 = zeros(n, 1);
[optTheta, functionVal, exitFlag] = fminunc(@(t) costFunction(X, y, lambda, t), theta0, options);
次の仕様のマシンでこのコードを実行しています。
Macbook Pro i7 2.8GHz / 8GB RAM / MATLAB R2011b
コスト関数は正しく動作しているようです。初期シータについては、J と勾配の許容値を取得します。
K>> theta0 = zeros(n, 1);
K>> [j g] = costFunction(X, y, lambda, theta0);
K>> j
j =
0.6931
K>> max(g)
ans =
0.4082
K>> min(g)
ans =
-2.7021e-05
プログラムの実行には信じられないほど時間がかかります。fminunc() の MAX_ITR = 1 を維持してプロファイリングを開始しました。1 回の反復では、数時間経過してもプログラムの実行が完了しませんでした。私の質問は次のとおりです。
私は数学的に何か間違ったことをしていますか?
fminunc() の代わりに他のオプティマイザを使用する必要がありますか? LargeScale=on の場合、fminunc() は信頼領域アルゴリズムを使用します。
この問題はクラスター規模であり、単一のマシンで実行するべきではありませんか?
その他の一般的なヒントをいただければ幸いです。ありがとう!
これは問題の解決に役立ちました。fminunc() で LargeScale フラグを「オフ」に設定することで、これを機能させることができました。私が収集したものから、LargeScale = 'on' は信頼領域アルゴリズムを使用し、'off' のままにしておくと準ニュートン メソッドが使用されます。準ニュートン法を使用して勾配を渡すと、この特定の問題に対してはるかに高速に機能し、非常に優れた結果が得られました。