洋食の日記

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

Rumaleのリッジ・線形回帰のソルバーでL-BFGS法が自動的に選択されるようにした

はじめに

Ruby機械学習ライブラリであるRumaleで、RidgeとLinearRegressionで、solver: 'auto' とした場合に、Numo::Linalgがロードされていない場合は、L-BFGS法をソルバーとするようにした。Numo::Linalgがロードされている場合は、従来どおり特異値分解を用いる方法を使う。これを、ver. 0.23.0としてリリースした。

rumale | RubyGems.org | your community gem host

使い方

Rumaleはgemコマンドでインストールできる。

$ gem install rumale

使い方は変わらない。RidgeとLinearRegressionのオブジェクトを生成する際に、ソルバーを指定するsolverパラメータを'auto'とすると、L-BFGS法が選択される。Numo::Linalgがロードされている場合は、特異値分解を用いる。

require 'rumale'

reg = Rumale::LinearModel::Ridge.new(solver: 'auto')
pp reg.params[:solver]
# > "lbfgs"

require 'numo/openblas'

reg = Rumale::LinearModel::Ridge.new(solver: 'auto')
pp reg.params[:solver]
# > "svd"

おわりに

これまで確率的勾配降下法(Stochastic Gradient Descent, SGD)が選択されていたが、SGDはパラメーターの設定方法が難しいようなので、L-BFGS法を選択するようにした。安定的に解を得たい場合は、Numo::Linalgをロードして、特異値分解を用いるのが良い。 Rumaleの開発は、これでしばらくはメンテナンスモードに入ろうと思っている。学習アルゴリズムは無数にあるので、足そうと思えばいくらでも足せるのだが、そうすると巨大ライブラリになってしまう。それよりも、自然言語処理ライブラリとか、OpenCVRubyバインディングだとか、機械学習と組み合わせて使うものを充実させた方が良いと考える。あと、APIリファレンスだけじゃなくて、User GuideとかTutorialとか、そういうドキュメントも書かないとな〜。