AdaGrad+RDAをGoで書いた
論文はこちら。
Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
ソースコードはこちら。 多値分類問題にも対応できるようにした。二値分類問題と比べてヒンジ損失が少し変わる(ので重みの更新も二値分類の場合とと少し違う)。
データを次のように作成。
$perl -MList::Util=shuffle -e 'print shuffle(<>)' < ../data/news20.binary > news
$head -15000 news > news.train
$tail -4996 news > news.test
例えばこのデータは素性の値が0.04くらいなので、その平均を取ると0.01よりも小さくなるため、式(24)中の右辺の第三項が0になり、ほとんどすべての重みが0になってしまう。 正則化項の重み(c)をもう少し小さくしてやると、次の結果になった(本当は論文のように交差検定をして決めてやったほうが良いけど、人手でチューニング)。
$./adagrad -f news.train -m learn -w model -l 1 -c 0.01
$./adagrad -f news.test -m test -w model -l 1 -c 0.01
Recall[-1]: 0.011142 (28/2513)
Prec[-1]: 0.848485 (28/33)
--
Recall[+1]: 0.997986 (2478/2483)
Prec[+1]: 0.499295 (2478/4963)
--
Acc: 0.5016012810248198
$./adagrad -f news.train -m learn -w model -l 1 -c 0.0001
$./adagrad -f news.test -m test -w model
Recall[+1]: 0.836891 (2078/2483)
Prec[+1]: 0.833200 (2078/2494)
--
Recall[-1]: 0.834461 (2097/2513)
Prec[-1]: 0.838129 (2097/2502)
--
Acc: 0.8356685348278623
$./adagrad -f news.train -m learn -w model -l 1 -c 0.00001
$./adagrad -f news.test -m test -w model
Recall[+1]: 0.950463 (2360/2483)
Prec[+1]: 0.946651 (2360/2493)
--
Recall[-1]: 0.947075 (2380/2513)
Prec[-1]: 0.950859 (2380/2503)
--
Acc: 0.9487590072057646
参考
- 実装が簡単で高性能な線形識別器、AdaGrad+RDAの解説
- AdaGrad + RDAを実装してみた
- OllMainJa - oll - oll: Online-Learning Library - Google Project Hosting
- 行をランダムシャッフルするワンライナー
- Multiclass perceptron