5

これは、stackoverflow への私の最初の投稿であるため、これが正しい領域でない場合はお詫び申し上げます。L1正規化システムの最小化に取り組んでいます。

今週末は最適化への私の最初のダイビングです。私は基本的な線形システム Y = X*B を持っています。X は n 行 p 列の行列、B はモデル係数の p 行 1 列のベクトル、Y は n 行列です。 -1 出力ベクトル。

モデル係数を見つけようとしています。勾配降下アルゴリズムと座標降下アルゴリズムの両方を実装して、L1 正則化システムを最小化しました。バックトラッキング アルゴリズムを使用しているステップ サイズを見つけるために、勾配のノルム 2 を見てアルゴリズムを終了し、ゼロに「十分近い」場合は終了します (今のところ 0.001 を使用しています)。

私が最小化しようとしている関数は、次の (0.5)*(norm((Y - X*B),2)^2) + lambda*norm(B,1) です。(注: norm(Y,2) とは、ベクトル Y のノルム 2 値を意味します) 私の X 行列は 150 行 5 列で、スパースではありません。

正則化パラメーター ラムダをゼロに設定すると、最小二乗解に収束するはずです。両方のアルゴリズムがこれをかなりうまく、かなり迅速に行うことを確認できます。

ラムダを増やし始めると、モデル係数はすべてゼロに向かう傾向があります。これは私が期待することですが、勾配のノルム 2 は常に正の数であるため、アルゴリズムは決して終了しません。たとえば、1000 のラムダは 10^(-19) 範囲の係数を与えますが、私の勾配の norm2 は ~1.5 です。範囲、私のステップ サイズは非常に小さくなります (10^(-37) 範囲)。アルゴリズムを長時間実行しても状況が改善されない場合は、何らかの理由でスタックしているように見えます。

私の勾配と座標降下アルゴリズムの両方が同じ点に収束し、終了条件に同じ norm2(gradient) 数を与えます。また、0 のラムダでも非常にうまく機能します。非常に小さなラムダ (0.001 など) を使用すると収束します。0.1 のラムダは、1 時間か 2 時間実行すると収束するように見えます。収束率が小さすぎて使い物になりません。

問題に関連していると思われるいくつかの質問がありましたか?

勾配の計算では、h が 10^(-5) の有限差分法 (f(x+h) - f(xh))/(2h)) を使用しています。この h の値について何か考えはありますか?

別の考えでは、これらの非常に小さなステップでは、最小値とほぼ直交する方向に前後に移動し、収束速度が非常に遅くなり、役に立たなくなるというものでした.

私の最後の考えは、収束速度が非常に遅い場合は、おそらく収束速度を見て、おそらく別の終了方法を使用する必要があるということでした。これは一般的な終了方法ですか?

4

1 に答える 1

7

1-ノルムは微分できません。これは、多くのこと、特に選択した終了テストで根本的な問題を引き起こします。勾配は最小値の周りで大幅に変化し、メジャーゼロのセットには存在しません.

本当に必要な終了テストは、「劣勾配には非常に短いベクトルがあります」という行に沿ったものになります。

||Ax-b||_2^2 + ラムダ ||x||_1 の劣勾配で最短ベクトルを見つけるのはかなり簡単です。許容範囲を賢明に選択epsし、次の手順を実行します。

  1. コンピューティングv = grad(||Ax-b||_2^2).

  2. の場合x[i] < -eps、 からラムダを引きv[i]ます。の場合x[i] > eps、ラムダを に追加しv[i]ます。の場合、最小化するに-eps <= x[i] <= epsその数を追加します。[-lambda, lambda]v[i]v[i]

v勾配として扱って、ここで終了テストを行うことができます。v次の反復をどこに置くべきかを選択するときは、グラデーションにも使用することをお勧めします。

于 2013-01-05T22:36:04.450 に答える