ソフトウェアをいろいろ更新した

公開している幾つかのソフトウェアについて,ユーザからの要望がたまったので更新した.誰得かと思いながらも公開したソフトウェア

も,見つけて使う人はいるようで,公開して良かったなと思ったり.
細かい更新だけど,線形分類器の学習器では,文字列素性をサポートして,素性の重みを(線形・非線形学習共に)ダンプできるようにした.その過程で動的ダブル配列を更新可能なデータ構造として保存・復元できるように変更(最終的には必要なかったが).あとは k-means ではランダムに初期化できるようにしてみたり.
整数キーをバイナリとしてダブル配列に保存したいという要望もあったが,現在の実装では '\0' を途中に含む文字列は保存できない*1ので,variable byte code 等で符号化してから保存することを薦めておいた.
学習器にはC++11 で線形分類器の分散オンライン学習器を実装してみた - ny23の日記で検討した分散オンライン学習も実装されているけど,(オーバーヘッドが大きかったり,収束が遅くなったりで)実用上はほとんど役に立たないと思う.実装には C++11 std::thread を実装したものを可搬性を考慮して POSIX thread で再実装したが,コードが汚く(長く)なったので OpenMP で再再実装した.その後で OpenMP は clang だとサポートされていないことに気がついたが,多分誰も実際には分散学習することはないと思ったのでそのまま公開*2
ちなみに,カーネルを使う非線形学習については(実装してみた限りでは)

  • Minibatch and Parallelization for Online Large Margin Structured Learning. NAACL 2013.

が効果がありそうなので,そのうち追加するかもしれない.

*1:'\0' を終端文字列として使っているため predictive search などが動かなくなる.対策としては,終端か否かを示す bit を入れたり '\0' と重ならないようラベルをずらしたりする必要がある.

*2:大規模学習のためのライブラリなのになんで分散学習サポートしないの,という問に対して,線形学習では現状実装しても役に立ちません,ということを示すための不毛なコード.