Passive Aggressive

去年実装したものがあったので、多項式カーネルの学習を高速化してみた。__gnu_cxx::hash_map の char* のハッシュ関数はかなりダメな感じだったので、最初 ELF hash にして、さらに FNV hash に置き換えて最終的に約5倍、発火する素性番号がバラけていたのを密にするようにして約2-3倍と約10倍学習が速くなった。手持ちのタスクで実験したら、普通に多項式カーネル (PKI) で学習するより20倍ほど高速だったので取りあえず満足。速さが売りのオンライン学習もカーネル化すると学習がサポートベクタ倍(重複を合併するようにしても最大学習データサイズ倍)遅くなってしまう(下手すると数万倍)がこれで少しは使い易くなったか。しかも、SVM/ME より高い精度が出るようになってしまった(線形カーネルではもともと SVM/ME よりかなり良かったが多項式カーネルでも精度が出るようになった)。適当に試すには十分過ぎる性能だ。
以前試したところだと、Confidence-Weighted は全然精度が出なくてダメダメだったけど、もう一度試してみようかな。
→試してみた。手持ちのタスクだと、Confidence-Weighted は確かに評判通り少ない繰り返し回数でも高い精度が得られるものの、その最大値は Passive-Aggressiveに比べて 3% ぐらい低く(Perceptron に対しても 2% 程度低く)ダメ。二値素性というのが良くないのかなあ。