FOBOSを使ってSVMやロジステック回帰を実装しよう!!!

原稿も出したし、次のネタのために論文読んでたけど全然分からないし(ダレカタスケテ!!!)、3連休だし、現実逃避したい!!!ということでFOBOSの論文を読んだりしていました。なんでFOBOSかっていうと、就活の面接のときに「SVMとか(使った、じゃなくって)実装したことがありますか?」と聞かれてNoとは答えられないので...とかいうのは嘘ですが、PFIのBlogでid:tkngさんがFOBOSを紹介する記事を書かれていたからでした*1

FOBOSは卒論終わったくらいに岡野原の発表で知ったようですが(このときは名前がFOLOSだったようだ)、このときはNLPかじってもいなかったので「sparse何それおいしいの?」な状態でそのときはあんまり深追いしていませんでした。

何がうれしいのか?

FOBOSの心は徳永さんの記事を見てもらえば分かると思いますが

  • 損失項の劣勾配法による処理
  • 正則化項の閉じた形での最適解の計算

の2つが肝です。劣勾配法を使うことにより損失関数がhinge lossのように微分不可能な場合でも使うことができますし、2つ目のところは論文ほうで(L1|L2|L∞)正則化のupdate式がすでに(閉じた形で)書いてあります。2つ目の操作はクリッピングと呼ばれ、これによってsparsenessを実現することができます。

データ全部を使ってヘッセ行列を計算して、逆行列が...とかをやらなくて済むSGD(確率的勾配降下法)的なうれしさがありますし、2つあるステップのうち最初の一つだけ自分の作りたいアルゴリズムに合わせてちょこっと計算してあげればすぐにコードに落とし込めます(PFIのBlogにはSVMとロジステック回帰のバージョンが説明してある)。

実装

めっちゃ簡単です。コア部分は30行くらいで書けるし、コード全体でも200行くらいです(RubyじゃなくってC++で、ですよ)。特別な行列のパッケージとか使わなくってもいける気軽さがよい。この春に開発合宿で機械学習使って何かしたい!!という人にも勧められる感じです。実際のコードとかはid:tkngさんのMicterなどを参考にすればよいかと思います(日本語処理周りとかそっちも参考になる)。

*1:他の理由は半年くらい生成モデルにひたっていたので、識別モデルで何かして遊びたかったから...など