2009年7月5日日曜日

まだ残ってた。

筆不精なので全然書いてなかった。
というか、このブログの存在すら忘れてました。

機械学習の勉強中とか言いつつ、何も書いてないですね。
ブログ開設から2年が経過していますが、その間の作業としては

[ブログ開設当初]
・ Averaged Perceptron (Perl モジュール)作成
2値、多値分類、双対形式版では polynomial kernel が使える。
キャッシュを用いて高速な学習が可能。
主形式版はとりあえず早い。

[その後]
・ オンライン学習で Logistic regression 作成
系列ラベリングをやってみたくて、CRFの勉強として作ってみた。
単純なGDで実装。

これを読んでお勉強。

・ EG で Logistic regression を作ってみる
参考にしたのは以下
EG+ ならちゃんと収束もしたし、学習も出来たが、EG± だとうまく行かなかった。
正の値か負の値のどちらかしかパラメータが学習できない。

・ EG で CRF を作る。
一応動くものが出来たのだが、後に Forward-Backward の実装が間違っていることに気づく。
何でちゃんと動いたのか疑問。
これもEG+かEG-のみ。

・ CRF で N-gram テンプレートを使えるようにしてみる
CRF++ は便利な素性テンプレートが使えてるけど、実は意外と制限がある。
扱えるトークンはカレントの位置から ±4 までで、ラベル遷移は bigram までしか扱えない。
というわけでとりあえず作る。

・ 小町さんから紹介された Folos で Logistic regression を実装
論文をちゃんと読んでいないので証明とかは分からないのだけど、岡野原氏のPPTを参考に実装すると、1時間くらいで出来た。
かなり分かりやすい資料でした。

L1正則化が使えるようになったのは素直に嬉しい。

・ Folos で CRF を作成
N-gram テンプレートが使える CRF で、かつ L1 正則化も使えちゃうというもの。
勾配法は EG をやめて GD にした。理由はパラメータで正負両方の値を学習したかったから。
EG でもちゃんと作れればいけるんだろうけど、なんかうまくいかないんだよなぁ。

遷移素性や Forward-Backward の接続チェックとかの実装で、簡単のために STL を使いまくっていたらむちゃくちゃ遅くなった。
後、コンパクトなモデルを作るんだ!と思って抽出される素性を蜜な素性から、コーパス中に出てきた素性しか扱わない疎なものにしたら、思ったほど精度が出ず、CoNLL 2000 の Shared Task で9位程度の成績しか出なかった。
なので現在高速化&蜜な素性を扱うようにして作成中。
crfsgd が F-measure(F1)で 93.75 とか出てるみたいだし、同じくらい出したいなぁ。

[途中経過]
メモリの使用量がオンライン学習のくせしてめちゃくちゃ多いのは私の実装が悪いから・・・。

[追記20090707]
自前アロケータに与えているプールサイズの指定で 0 が多かっただけだった。。
メモリ節約できてたし、素性を登録しておく辞書(自作ハッシュ)のテーブルサイズを同期に指摘されて調整したら160万強の素性の生成と登録が30秒を切る程度の時間で終わるようになりました。

1 件のコメント:

K.Uchiumi さんのコメント...

hash テーブルの充填率が6%とか酷いことになっていたために30秒も掛かっていた様子。
hashsize を変更したら素性抽出から格納までで5秒切るようになりました。