4

テキスト データの 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 回の反復では、数時間経過してもプログラムの実行が完了しませんでした。私の質問は次のとおりです。

  1. 私は数学的に何か間違ったことをしていますか?

  2. fminunc() の代わりに他のオプティマイザを使用する必要がありますか? LargeScale=on の場合、fminunc() は信頼領域アルゴリズムを使用します。

  3. この問題はクラスター規模であり、単一のマシンで実行するべきではありませんか?

その他の一般的なヒントをいただければ幸いです。ありがとう!


これは問題の解決に役立ちました。fminunc() で LargeScale フラグを「オフ」に設定することで、これを機能させることができました。私が収集したものから、LargeScale = 'on' は信頼領域アルゴリズムを使用し、'off' のままにしておくと準ニュートン メソッドが使用されます。準ニュートン法を使用して勾配を渡すと、この特定の問題に対してはるかに高速に機能し、非常に優れた結果が得られました。


4

3 に答える 3

1

I was able to get this working by setting the LargeScale flag to 'off' in fminunc(). From what I gather, LargeScale = 'on' uses trust region algorithms, while keeping it 'off' uses quasi-newton methods. Using quasi-newton methods and passing the gradient worked a lot faster for this particular problem and gave very nice results.

于 2013-08-07T05:20:40.043 に答える
0

この種の問題に関する私の経験に基づいて、これが問題であると思われるものです。Xな表現ではなく、密な表現を使用しています。また、サンプル数に応じて用語の数がほぼ直線的に増加するテキスト分類の典型的な効果も見られます。事実上、行列乗算のコストは、サンプル数の 2 次関数で増加します。X*theta

対照的に、適切なスパース行列表現は、ゼロ以外の要素を反復して行列乗算を行うだけであり、適切に一定の長さである場合、ドキュメントごとにほぼ一定になる傾向があり、サンプル数の二次ではなく線形の減速を引き起こします。 .

私は Matlab の第一人者ではありませんが、疎行列パッケージがあることは知っているので、それを使用してみてください。

于 2013-08-06T09:42:27.780 に答える