学習器の実装を公開

8月末に発表する分類器の学習手法の実装をホームページで公開した.古くは Passive Aggressive - ny23の日記, Passive Aggressive と多項式カーネル - ny23の日記 ぐらいから書いていたもので,LIBLINEAR と oll - ny23の日記, Kernelized Passive Aggressive の微々たる高速化 - ny23の日記, AROW は CW より幾分マシか - ny23の日記, liblinear-poly2 - ny23の日記 ときて,突然来た - ny23の日記 で出てきたアイデアを実装したもの.最近では,文節区切り - ny23の日記粗末な(素性とモデルで)単語分割 - ny23の日記 でも使っている.
オンライン学習で適当に書くとボトルネックになりがちな IO 周りの実装に気をつけて,二値素性に特化した最適化をしたからか,(特別なことは何もしてないが)線形学習でも oll より繰り返し部で2倍,IOを入れたトータルの学習時間で約10倍程度(これはややズル)高速.線形学習器としては最速レベルの liblinear 比でも,(同程度の精度を出すモデルの学習で)約2-3倍ほど速いようだ.まあ線形学習だと学習速度はこれ以上速くする必要はないかも知れず,どちらかというと分類が速いことの方が売りかもしれない(oll の10倍,liblinear の3倍高速).
本来の売りの多項式カーネルを用いたカーネル学習(正確には線形学習とのハイブリッド方式)の方は,訓練例を全てメモリに載せた場合でも,SVM と同程度以下のメモリ消費で約100-1000倍高速(二値素性のための最適化が入っている TinySVM 比の場合.SVMlightlibSVM だともう少し差は開く),PKI を使ったオンライン(カーネル)学習比でも約30-250倍高速.liblinear-poly2 みたいにやたらとメモリを食うこともないのがポイント.コードは相変わらず惨めなものだけど.
別に公開している解析器の方からも使えるようになっている.これで,別の学習ライブラリを入れなくても一通り解析できる.

レコード付き動的ダブル配列の実装も公開

以前トライ(ダブル配列,簡潔データ構造)と STL コンテナ - ny23の日記で比較に使った自作のレコード付き動的ダブル配列 (dda) の実装も公開.以下の論文のアルゴリズムを実装したもの.

矢田晋, 田村雅浩, 森田和宏, 泓田正雄, 青江順一.ダブル配列による動的辞書の構成と評価, 情報処理学会第71回全国大会, 1-263-1-264頁, 2009年3月.

レコード付き動的ダブル配列 - ny23の日記から始まり,レコード付き動的ダブル配列 - ny23の日記, レコード付き動的ダブル配列 - ny23の日記, レコード付き動的ダブル配列 - ny23の日記 と二週間かかって書いた僅か360行の c++ ヘッダファイル.動的ダブル配列は上の分類器の学習手法で素性の重みの管理に使っているので,学習手法の実装に同梱した.std::tr1::unordered_map ベースのトライに比べると,分類器の学習速度・分類速度が2倍程度高速になる(レコード付き動的ダブル配列 - ny23の日記, やっと出たのか - ny23の日記).動的ダブル配列を使って Wikipedia のテキスト処理を高速化 - ny23の日記 でも使っているけど,上の比較にもあるように,TAIL を「うまく」実装しないとサイズ面では静的ダブル配列に比べて明らかに不利(それでも葉に近づくに従い分岐数が減るような普通のキー集合なら追加順序によらず darts よりはうまく詰めてくれる)なので,静的な辞書を構築するのには明らかに不向き.キーの動的な追加(+レコードの更新)の高速性を最優先した実装になっているので,トライをコンテナ的に使いたいときには有用.あと,int / uint / float など,4 bytes のデータなら(例外値を指定することで)何でもダブル配列内に保存できるようになっているのは便利かもしれない.
これでソフトウェアの名前 - ny23の日記で書いてたプログラムは全部公開終了.この中では動的ダブル配列のコードが一番ましだと思う.やっていることは,最もややこしいので読むのは一番骨が折れるだろうけど.