これは、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 の値について何か考えはありますか?
別の考えでは、これらの非常に小さなステップでは、最小値とほぼ直交する方向に前後に移動し、収束速度が非常に遅くなり、役に立たなくなるというものでした.
私の最後の考えは、収束速度が非常に遅い場合は、おそらく収束速度を見て、おそらく別の終了方法を使用する必要があるということでした。これは一般的な終了方法ですか?