Home > 3月, 2009

2009.03.29

讃岐うどん すみた

東京で一番おいしい讃岐うどん屋.以前は家から徒歩圏内(十条)にあって,王子に住む価値を100倍くらい高めてくれる,貴重なお店でした.残念ながら赤羽に移転してしまいましたが,24日にオープンしたので,早速訪問してきました.

讃岐うどん すみた

讃岐うどん すみた

赤羽駅の東側にあるアーケードの終点を左に曲がって50mくらいの場所にあります.南北線の赤羽岩淵や志茂が最寄り駅になりますが,どの駅からもそこそこ歩く必要があります.お世辞にも立地が良いとは言えないのですが,うどんが美味しいので問題無いのでしょう.

うどんはかなりボリュームがあるので,一玉でもお腹いっぱいになります(私はもう少し細くて軽いうどんの方が好みですが).うどんだしで煮込んだおでんが,あり得ない美味さなので,おでん盛りも欠かさず注文しましょう.出す直前に揚げてくれる天麩羅も外せません.鶏肉を塩で味付けしたものを天麩羅にした「かしわ」が人気です.

私は開店前に並びましたが,食べ終わって出てきた頃には,15~20人くらいの行列になっていました.

2009.03.17

CRFsuite 0.8 released

CRFsuiteのバージョン0.8をリリースしました.モデルファイルのフォーマットを改良し,異なるアーキテクチャにおけるモデルファイルの互換性を確保しました.つまり,x86のアプリケーション・サーバーでCRFのモデルを学習し,SPARCやPowerPCのマシンでモデルを読み込んで,タグ付けをする,といったことが可能になりました.

バージョン0.7をリリースした直後に,Ultra SPARC IIIi上のサーバーで,モデルの読み込み時にクラッシュする問題が報告されました.この問題をデバッグしてみると,4バイトでアライメントされていないメモリアドレスからDWORDの値を読み出すところで,プロセッサ例外が発生することを突き止めました.x86のプロセッサはどんなアドレスからでもDWORDの値を読み出せるという,至れり尽くせりの環境なので,この問題を見逃していました.

そもそも,CRFsuiteのモデルファイルでは,DWORDの値のバイトオーダーすら実行環境依存で,big endianもしくはlittle endianのいずれかに統一する取り決めをしていませんでした.そこで,今回の問題を修正するにあたって,モデルファイル内の数値のバイトオーダーをlittle endianに統一する改訂を行いました.このため,モデルファイルの互換性は失われ,バージョン0.8で0.7以前で作られたモデルファイルを読み込むことは出来ません.

ちなみに,バイトオーダーに依存せずにDWORDの値を読み書きするコードは,以下のようになります.

static void write_uint32(FILE *fp, uint32_t value)
{
    uint8_t buffer[4];
    buffer[0] = (uint8_t)(value & 0xFF);
    buffer[1] = (uint8_t)(value >> 8);
    buffer[2] = (uint8_t)(value >> 16);
    buffer[3] = (uint8_t)(value >> 24);
    fwrite(buffer, sizeof(uint8_t), 4, fp);
}

static void read_uint32(uint8_t* buffer, uint32_t* value)
{
    *value  = ((uint32_t)buffer[0]);
    *value |= ((uint32_t)buffer[1] << 8);
    *value |= ((uint32_t)buffer[2] << 16);
    *value |= ((uint32_t)buffer[3] << 24);
}

ビットシフトを多用してまどろっこしいですが,このように実装するとコンパイルする環境のバイトオーダーをconfigureスクリプトで検出しなくて済みます.バイナリ形式でI/Oをやるときの常套手段ですね.

64ビットのdouble値にもバイトオーダーがあるのですが,もはやビットシフトは使えないので,いったん64ビットの整数値(uint64_t)に変換し,無理矢理doubleにキャストしています.ARMの一部のプロセッサでは,doubleを2つのDWORDに分解し,各DWORDはlittle endian,2つのDWORD値はbig endianで並べられるという特殊なバイトオーダーが採用されているらしいですが,そういうプロセッサで現在のコードが正しく動作するかは調べていせん.ARMでCRFsuiteを動かすことは,ほとんどあり得ないと思うので,実用上は問題がないと思いますが,こういうCPUのダーティーな部分を知ってしまうと,嫌な感じですね.

2009.03.11

CRFsuite 0.7 released

CRFsuiteのバージョン0.7をリリースしました.あるマシン環境で,素性生成中にクラッシュする問題を修正しました.もしバージョン0.6でクラッシュの問題が発生していなければ,急いでアップグレードする必要はありません.

この問題は,自分がテストに使っている環境では発生しませんが,海外の方から「学習が始まる前にクラッシュする」と報告がありました.クラッシュした場所から怪しい箇所を推定できる場合は別ですが,自分の環境で問題が再現出来ないと,デバッグが困難になります.こういうときは,「分からないので問題の環境に直接ログインさせて下さい」と,決まってお願いすることにしています.今までいくつかのオープンソースプロジェクトで,こういうお願いを(おそらく10回くらい)したことがあるのですが,不思議と断られたことは一度もありません.マシンに見ず知らずの人をログインさせるなんて,ハイリスクで気持ち悪いはずです.ましてや,私がプログラミング出来ることは明らかな(ソフトウェアを公開している)ので,ややもすれば危ないハッカーのリスクがあります.実際は,そっち方面の知識には,とんと疎いのですが・・・.

今回は先方の大学で学科の管理者と掛け合って頂いたようで,柔軟な対応に感謝しております.原因はCRFsuiteの内部で使っているRumAVLというライブラリが,UltraSPARC IIIi上で正常に動作しないことでした.このライブラリを最新版にアップデートすることで,問題が解決出来ました.

2009.03.10

CRFsuite 0.6 released

CRFsuiteのバージョン0.6をリリースしました.変更点は以下の通りです.

  • 確率的勾配降下法 (Stochastic Gradient Descent: SGD) に基づく学習アルゴリズムを実装した.ベースとなっているアルゴリズムは Pegasos で,L2正則化が利用可能.学習率 (η) の調節戦略は,sgd と同じです.SGDで学習を行うには,コマンドラインに,”-p algorithm=sgd” を追加.
  • ベンチマークテストのページに,SGDアルゴリズムの性能,実装としての sgdMALLET との比較を追加した.
  • L-BFGSの実装をliblbfgs 1.7にアップデートした.
  • 学習時のメモリ使用の無駄を減らし,節約した.
  • アイテムの属性名にコロン(:)を含めることが出来るように,エスケープシーケンス “\:”  と “\\” を導入した.これに伴い,CoNLL-2000のチャンキングデータを学習データに変換する to_crfsuite.py を更新した.以前CRFsuiteをお使いの場合で,CoNLL-2000のデータを使っている場合は,新しいto_crfsuite.pyを使って,学習データを再生成してください.
  • ソースコードを整理して,将来的に新しい学習アルゴリズムを実装しやすいようにした.
  • 線形探索の試行回数を設定するパラメータを追加した.

今回の目玉は,何と言ってもSGDでしょう.先月,とある海外の人からsgdMALLET と比較してみてはどうかとアドバイスをもらいました.前々からSGDを実装してみたいと思っていたので,「それならCRFsuiteに実装して比較してみる」と返事をしたのが,今回実装したきっかけです.CoNLL-2000のデータでベンチマークテストをしてみると,L-BFGSよりもSGDの方が,少ない反復回数でモデルを学習できるようです.CRFsuiteに実装したSGDのアルゴリズムなど,詳細については,また後で書くことにします.

CRFsuiteはコードの一般性を犠牲にして,速度を追求するポリシーだったのですが,L-BFGSとSGDで共通のコードを利用するために,一般性にちょっとだけ目がくらんでしまいました.具体的には,素性のモデル期待値,観測期待値を計算するところで,コールバック関数をガンガンに呼ぶように変更したのですが,これでL-BFGSを用いた学習は5%から10%くらい遅くなってしまいました.それだけシビアに高速化してあったということで・・・.ただ,いろいろな学習アルゴリズムを実装しやすくなったので,将来的に見れば良い変更だったと思います.

他に重要な変更点は,学習データの属性名(素性名)において,コロン(:)を”\:”というエスケープシーケンスで表現出来るようになったことです.以前からCRFsuiteは「attr:value」というフォーマットを認識可能だったのですが,属性名にたまたまコロンが使われていて,その後に数値表現が来たときに,その属性のスケーリングが意図せずに適用されてしまうことがありました.今回のバージョンからは,「属性名にコロンをどうしても使いたければ,”\:”と表現する」という扱いになったので,学習/テストデータの生成方法に注意してください.

ベンチマークの結果を見ているだけでも楽しいと思いますので,興味のある方はぜひお越し下さいませ.

2009.03.02

今年もよろしく

って遅すぎ!! 先日つひに30歳になりました.若く無くなってきたと思うことがありますが,多分31や35の方が堪えるんだろうなぁ.

実家が飼いはじめた猫の写真を貼っておきます.

もろみの肉球

もろみの肉球

もろみののび

もろみののび