2009年7月8日水曜日

会社について

最近私の会社では人件費削減に注力しているらしく、社員のやる気を上司たちが物凄い勢いで削いでくれている。

似た感想を持った人がいないかなーと探していたら、なぜか自分が学生時代に出した論文がリファーされているのを見つけてびっくりした。
似た手法はたくさんあるし、私がオリジナルというわけではないなかでリファーしてもらえたのは素直に嬉しいです。

きっと今ならもっとうまくやれるんだろうなー。

最近は文章のトピックセグメンテーションに構造学習を使用している研究もあるそうです。
NAISTでは、SVMs を使って論文の章立てを予測するなどもしている?らしく、学生時代の自分がその場にいたらきっと圧倒されるんだろうなと思っていたり。

今作っている学習器の作成が終わったら、また挑戦してみようかなぁ。

会社で研究的なことを仕事にするのはかなり難しくなってきているので、やるとしたら自宅作業になりそうですが・・・。

2009年7月5日日曜日

プログラミングのための確率統計(仮)

最近は参加をするのを止めているのだけど、ちょっと前までWebで公開されている(http://www10.plala.or.jp/xyzt/pscs/)資料を使った勉強会に出席していました。

この資料、章ごとの冒頭部分が凄く楽しいんですね。
2章の冒頭を例に挙げてみます。

A:私の調査によると、ゲーム機所持者の犯罪率は50%以上です。何らかの規制をすべきでしょう。
B:何そのやたら高い数字?
A:最近の少年犯罪では、犯人の半数以上がゲーム機を所持していました。
B:ええと、つっこみ所がありすぎて困るんだけど。とりあえず犯罪関係なしで最近の少年のゲーム機所持率から調べ直してくれない?

これ、条件付確率と同時確率、周辺確率の話をする前のコラムなんですけど、面白いです。
Aさんは条件付確率 P(犯罪者|ゲーム機所持者) のつもりで話をしているわけですけど、実際にはそうはなっていないんですね。

で、Aさんが最初に言っている数字が実は何を表しているのかというと、それはP(ゲーム機所持者|犯罪者)。
とりあえず世界には少年が100人しかいないとして適当に次みたいな表を作ってみます。

| ゲーム機持ってる | ゲーム機持ってない
---------+------------------------+---------------------------
犯罪者 | 10 | 10
善良 | 40 | 40

P(犯罪者,ゲーム機所持者) = 1/10
P(善良,ゲーム機所持者) = 2/5
P(犯罪者, ゲーム機持ってない人) = 1/10
P(善良, ゲーム機持ってない人) = 2/5

さてこの例だと、ゲーム機を持っているという条件が与えられた時の条件付確率P(犯罪者|ゲーム機所持者)は、
P(犯罪者|ゲーム機所持者) = 1/5
です。

Aさんはどういうことをしたのかな、というと・・・この世界から善良な少年をなくしちゃったんですね。
つまり、条件付確率P(ゲーム機所持者|犯罪者)を求めてます。
さて、この世界で確率を計算するときに、善良な少年の存在を無視すると、少年は世界で20人しかいなくなります。
その上で、ゲーム機所持者の割合を調べてみると 1/2 、つまり50%になります。

あらら、P(犯罪者|ゲーム機所持者)が50%以上といってゲーム機を規制しようと言っていたのに、P(ゲーム機所持者|犯罪者)を求めちゃってたよ。
ということでした。

まぁ、こんな話は著者がジョークで書いただけだろうと思っていたら、現実でもあるみたい。

・ 公明新聞 http://www.komei.or.jp/news/2008/0219/10816.html
昨今流行の児ポ法問題の奴ですね。
[一部抜粋]
性犯罪者の4割は、子どもの写真やアニメを収集していたという調査もある。
(中略)
アニメなどを児童ポルノの対象とすることには、「実在する被害者がいない」「表現の自由を保障すべき」との理由から反対論が多いが、犯罪誘発防止の観点から、アニメ大国の責任において積極的に議論する必要がある。

上記の例でいうと、Aさんが公明党になりますね。

公明党: 子供の写真やアニメを収集している人の性犯罪率は4割です。子供の写真やアニメを規制しましょう。
B: 何そのやたら高い数字?
公明党: 性犯罪者の4割は、子どもの写真やアニメを収集していました。
B: ええと、つっこみ所がありすぎて困るんだけど。とりあえず性犯罪関係なしで子どもの写真やアニメの所持率から調べ直してくれない?

確率は分かりにくい概念ですけど、一応今の国会で議席過半数を占める連立与党の一党なんだし、さらに実施されるとやり直しとか難しそうなんだから、もう少しまともに調査とか出来る人も議論に参加してもらったらどうなんだろう。

まだ残ってた。

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

機械学習の勉強中とか言いつつ、何も書いてないですね。
ブログ開設から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秒を切る程度の時間で終わるようになりました。