洋食の日記

「た・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

SVMKitでの回帰の実装をだいたい終えました

svmkit | RubyGems.org | your community gem host

  • SVMKitの0.3系では、回帰手法の実装を目標としていたが、代表的な手法を実装して、だいたい終えた(※カーネルSVMによる回帰の実装を見送った。SVMKitではStochastic Gradient Descent, SGDでの実装を基本としているが、その場合、回帰に限らず分類器でもカーネルSVMで旨味がでない。別の最適化手法かカーネル近似を充実させることを検討したほうが良さそうで、ひとまず保留とした)。
  • RidgeとLassoを実装できたのが良かった。Ridgeについては、最もベーシックな実装をすれば逆行列計算が必要となるが、SVMKitではSGDを用いて実装してある。
  • Lassoについては、正則化パラメータを調整することで、スパースな重みベクトルが得られるのが、改めて(現象として)おもしろいなと思った。
  • Factorization Machineによる回帰で、学習率とかのハイパーパラメータの設定によってNaNが出まくることに苦心した。試しに、AdaGradやNesterovモーメンタムなど、最近?の深層学習で使われているものを試してみたら、見事に安定して収束するようになった(のでRidge回帰にも導入した。ロス関数が同じ二乗誤差なため)。
  • これまでSVMKitでは、最適化にPegasosアルゴリズムによるmini-batch SGDを用いてきたが、もう少しモダンなSGDに切り替えようと思っている。最適化アルゴリズムが変わるのは(仮に分類精度に影響が出ないとしても)、breaking changeなので、0.4系でやっていこうと思う。