01/19

(0:45) しんどい。

仕事がうまくいっていない。

(仕事をプライベートに持ち込むのはよくない)

(まあ、持ち帰りのような人倫にもとる行為をしているわけではない)

 

高次 CRF を Java で実装したやつでは更新に

QNMinimizer を使っているのだが、これによって更新した重みが大きくなってしまって困っている。

ぼくの高次 CRFでは、対数の重みの指数を取って普通の重みとして使っているんだけど、そうすると重みが大きくなりすぎるとオーバーフローしてしまう。

 

CRFSuite 同梱のやつではこの問題はないんだけど、L-BFGS の中身をまるで理解していないのでどうすればいいかわからない。

困った。

(ぼくはそういう数学が理解できるほど頭がよくないようであきらめている)

 

L1(OWL-QN)だとオーバーフローは起こらないけど。

それにしても、L2 で使えないというのは…。

 

それで、どうすればいいかわからなくなってしまった。

そもそも、今のタスクに実際に必要かどうかというところが怪しいこともあってプレッシャーがかかる。

 

以下のような選択肢がある。

 

1. QNMinimizer のオプションなどを調べる

CRFSuite 同梱の L-BFGS と同じような(よくわかっていないけど)大きくない重みを返してくれるようにできるのかもしれないので、それを調べる。

 

2. CRFSuite をベースにした古いプログラムを修正する

これは、Java のやつよりもずっと実行速度が速い。

しかし、よくわかっていない段階で作ったので、不要な BOS や EOS の処理を入れてしまっている。

さらに、各位置で全ラベルについて0次のノードを作ってしまっている。

これは、日本語の形態素解析を二段階でやるときのように、ラベル数が膨大になる(各単語につきひとつになる)場合では致命的なので、それを修正しないといけない。

そのためには C++ で map を使う必要があるが、CRFSuite は C なので、Makefile とかに修正を行う必要がある。

修士のとき C++ を混ぜようとして失敗した苦い記憶が)

Makefile のたぐいがすごく苦手)

 

3. C++ で最初から組み直す

CRFSuite ベースのやつは速いけどソースが汚すぎる。

C++ で組み直すと、それなりに速くて読めるソースにできるんじゃないだろうか。

しかし、これはかなり高コストだし、いろいろ時間がかかるだろう。

しかし、最終的には資産になるはず。

(読めて速く動くバージョンということで)

 

4. L2 最適化をあきらめて、L1 だけでやる

高次 CRF では素性はスパースのほうが速くなる。

(動的にラティス的なものを組んでいるので)

(だから遅いんだけど)

ということは、結局 L1 をメインで使っていくことになる。

L1 でうまくいかなかったら(精度が出ないなど)あきらめることにする。

 

5. 高次 CRF をあきらめてほかの手法でやる

この場合 MeCab か KyTea をそのまま使うことになる。

もちろんこれが無難なんだけど、チャレンジしたいのでこれは最後の手段。

 

うーん、無難に 4、バックアップに 5 かな…。

そうすると、基本的に今のソースのままで実験をしていくことになる。

まあ、そうしようか。

進捗がないと心によくない…。

(最初から無理なチャレンジをするべきでないという説も)

(まあいいや)

 

さて、日替わり日記。

月曜日は「感謝する」。

 

今週は一つ目はすぐ書ける。

 

1. E のお母さんが来てくれたこと。

E はかなりストレスがたまっていたので(子供が夜泣きをすることもあって)、来てくれたのは本当にありがたい。

(倫理的にはぼくにも責任があるのだが、能力的に難しい)

 

でも残りが本当にない…。

人間関係がないから。

些細なことでも書こう。

 

2. 今日の昼、食堂で本のしおりを落としたのを教えてもらえた。

3. プールに忘れ物をしたのを受付で保管してくれていた。

 

3 はしょっちゅうだけど。

(忘れ物が多い)

 

そろそろ潮時かもしれないな…。

(ぼくの生活では起こることが少なすぎる)

まあ、もう少しだけ続けよう。