2013.06.03

EmacsとgdbでVisual Studioライクなデバッグ環境

C言語を勉強するとき,文法や標準関数をマスターすることに並ぶくらい重要なのが,デバッガを使いこなせるようになることです.C言語を習いたての頃は,書いたコードが予期せぬ動作をしたり,ポインタの使い方を間違えてプロセスを落とすこと(セグメンテーション違反)なんてザラです.そういう失敗をたくさん経験して,自分の書いたコードの間違いに気づき,修正していくことでコーディング力が養われていきます.しかし,自分の書いたプログラムの何処が悪いのか,皆目見当もつかないような状況に陥ってしまうと,プログラミングが嫌いになってしまいます.

デバッガを文字通りに解釈すると「バグを取る」ためのツールで,プログラマにとってはコードの間違いを発見するための検証手段として欠かせません.これに加えて,正しいコードをデバッガ上で動かしてみることも,C言語の理解促進のために重要であると私は考えています.ループや条件分岐でプログラムの流れがどのように変わるのか,ポインタは具体的にどんな値を取っているのか,main関数のargcやargvにはどんな値がセットされているのか,関数呼び出しでどのようにスタックフレームができるのか,auto変数・static変数でメモリ空間がどのように使われているのか等,デバッガを使ってプログラムの動きを追ってみることで,C言語やコンピュータ・アーキテクチャの勉強になります.

かくいう私も20数年前,Microsoft Quick C 2.0という開発環境でC言語を勉強しました.20年以上前の製品ですが,Quick CはC言語の初心者に優しい逸品でした.MS-DOS上で動作するコンソール・アプリケーションながら開発統合環境として動作し,エディタ,コンパイラ,デバッガの機能が一通り揃っていました.特にデバッガが秀逸で,ブレークポイント,ステップ実行,ウォッチ変数などがエディタ上から操作できました.Quick Cのデバッガが使いやすかったお蔭で,挫折せずにC言語の勉強が出来たと言っても過言ではありません.この頃に習得したデバッグの技(操作体系)から離れられず,C/C++のコーディングにはMicrosoft Visual Studioを用いてきました.研究用のC言語のプログラムは,Windows上で開発してからlinux上に移植しています.

今回,東北大学のプログラミング演習Aという講義でデバッガの使い方を教えようと思い立ち,色々調べていくと,emacsとgdbでMicrosoft Visual Studioに近いデバッグ環境が実現できることを知りました.元々emacs+gcc使いの人には常識なのかもしれませんが,”emacs gdb”で検索して上位に出てくるようなページを見るだけでは,いまいちピンと来ていませんでした.あまりにも感動したので(本当は講義のためですが),emacsでC言語のプログラムをデバッグする例を紹介するムービーを作っちゃいました.サクサクとデバッグできる感じを伝えたかったので,ゆっくりと説明するような作りになっておらず,字幕を読むのはキツイかもしれません.そんなときは,ムービーを止めながら観て頂ければと思います.文字が滲んで見づらい場合は画質を上げて下さい(オリジナルは1080pのHD画質).

このムービーで使っているバグ入りコード(sum.c)とemacsの設定ファイル(gdb.el)です.この設定ファイルでは,gdb-many-window, gdb-use-separate-io-buffer, gud-tooltip-modeと,以下のようなショートカットキーを採用し,快適なデバッグ環境を実現しています.

  • [F1]: カーソル位置(もしくはリージョン)の変数の内容を表示(gud-print
  • [Shift]+[F1]: カーソル位置の変数をウォッチに追加(gud-watch
  • [F5]: プログラムの実行を再開(gud-cont
  • [Shift]+[F5]: デバッガを終了
  • [F6]: カーソル行まで実行(gud-until
  • [F9]: カーソル行のブレークポイントを設定/解除(gud-breakもしくはgud-remove
  • [Shift]+[F9]: main関数の先頭行にブレークポイントを設定(gdbに”break main”と入力するのと等価)
  • [F10]: ステップオーバー(現在行を実行,関数の中には入らない)(gud-next
  • [F11]: ステップイン(現在行を実行,関数の中にも入る)(gud-step
  • [Shift]+[F11]: ステップアウト(現在の関数を抜けるまで実行)(gud-finish

(GUDのデフォルトでは,ステップオーバーやステップインのために3ストロークが必要のようですが,それって疲れないのかなぁ)

2011.10.10

松島マラソンに参加しました

昨日,松島マラソンの10kmの部に出てきました.朝7時に車で家を出て,県道8号線(利府バイパス)で松島に向かいました.8時には会場付近に着き,近くの小学校に車を停めました.この時点で,どの駐車場も満車に近く,もう少し遅かったら車を停められなかったかもしれません.

会場で受け付けを済ませ,ゼッケンを受け取ります.ゼッケンの裏にはRFIDタグが付いていて,タイム計測が完全自動化されています.10kmの部のスタートまで時間があるので,KHB東日本放送のマスコット「ぐりり」と写真を撮ったりして過ごします.「ぐりり」はネコ目イタチ科のオコジョだったのか~.

スタートは目標タイム順に並ぶようにできていて,私は目標タイム65分以上の最も遅いレーンに並びました.3,000人弱が一緒にスタートするので,自分の所からスタートラインを通過するまで2分くらいかかりました.コースはアップダウンがあり,特にコース中で6回くらいある登りがしんどかったです.不本意ながら,登りで歩くことになってしまい,そのままペースが作れない展開となってしまいました.公式記録は1:02:52.スタートゲート通過からフィニッシュライン通過までの参考記録は,1:00:46でした.10kmを長いとは感じませんでしたが,体がついていけず,不完全燃焼に終わりました.

娘はマラソンの概念を理解できないようで,スタート後に私がいなくなったと思って,機嫌が悪かったようです.ゴール直後に抱っこしろとせがむので,ヘロヘロになりながら抱っこ.完走者に配られるTシャツを着て,記念撮影.

松島は今年の2月に行ったことがあったのですが,その時と殆ど変わらない町並みに驚きました.連休ということで人出も多く,どこも大賑わいでした.本当は観光をしたかったのですが,駐車場がどこも満車で,昼食後に娘が車の中で寝てしまったので,あきらめて帰ってきました.

今日は足全体が筋肉痛.このコースよりもさらにアップダウンが激しい青葉山の駅伝は,一から鍛えなおさないと本当にやばいなぁと痛感しました.

2011.08.25

JST戦略的創造研究推進事業「さきがけ」に研究課題が採択されました

昨日プレスリリースの通り,JST戦略的創造研究推進事業「さきがけ」の研究領域「情報環境と人」に,自分が申請していた研究課題が採択されました.研究課題名は「知識の自動獲得・構造化に基づく情報の論理構造とリスクの分析」です.研究の概要は次の通りです.

ウェブやソーシャルメディアなどの新しい情報環境により、情報の流通が加速する一方、偏った情報やデマなどの拡散による社会の混乱や不安が増大しています。本研究では、ネット上で言及されている物・事態に関する知識を計算機がロバストに獲得・活用する言語処理技術を基盤として、流通している情報の背後にある論理構造を解析し、その整合性を分析することで、安全・危険に関する多角的な判断材料を人や社会に提供します。

研究総括の石田亨先生の総評にもありますが,この研究は東日本大震災を強く意識したものになっています.世の中の状況に左右されず,研究者は自身の研究に邁進すべきという考え方もありますが,自分の研究を社会にどう役立てるか,高い意識を常に保ちたいと考えています.私も震災復興に関するシンポジウムやミーティング等に参加し,言語処理(さらには情報科学)をどのように役立てるか考えてきました.これらの場で,人命の救助や医療,建物や水道などの生活インフラの復旧,災害に強い情報通信インフラの整備,ソーラーやバイオマス発電などのエネルギー施策,ロボットによる原発対応などの報告を伺う度に,言語処理を役立てることの難しさを感じます(その点,GoogleのPerson Finder自動車通行実績情報マップANPI NLPは,スピード感があってすごく良いプロジェクトだと思います).

ただ,震災後の日本の混乱を見ていると,言語処理の重要性はむしろ増しているように思います.震災ではウェブやソーシャルメディアなどの情報環境が大活躍しましたが,一方で偏った情報の拡散による社会の混乱・不安を招いています.情報技術がどんなに進歩しても,人間の情報処理能力は向上しませんので,大量の情報を有効に活用できません.社会は高度に専門化されているため,そもそも情報の内容を理解できない場合もあります.このような状況では,各人が情報の内容を理解を伴なわず,情報の発信者や怖さといった周辺的情報に基づいて意思決定をしてしまうことになります.さらに悪いことに,Twitterなどで誰もが気軽に情報を発信できるようになると,周辺的情報のみに依存した反射的な情報伝搬が増え,デマや偏見・差別が助長される要因となります.

どの情報が正しいのか人間ですら分からない状況のなか,計算機に情報の正しさを検証してもらうのは不可能です.しかも,最終的に情報を活用して意思決定を行うのは人間です.私も震災後に身の回りの人の説得に失敗した経験があり,人間の意思決定のやり方を変えてもらうことの難しさを痛感しました.このような動機により,意思決定に参考になりそうな情報を自動的,もしくはインタラクティブに提示することで,ユーザの情報処理能力を高めるための支援をしてみよう,というのが本研究のテーマです.

具体的には,ネット上のコンテンツを自動的に分析し,人間が意思決定を行う際に参考となるリスク情報(目的の達成度合い,安全度,危険度)を多角的に集約することを目標としています.このとき,ネット上から自動的に獲得したエンティティに関する知識,イベント及びイベント間(含意関係や因果関係など)の知識を総動員することで,流通している情報の論理構造(例えば二つの文がだいたい同じ事を言っているとか,参考情報としての筋の良さ)を明らかに出来るかどうかが,言語処理研究としての課題となります.

震災後の社会の混乱を目の当たりにしつつ,乾さんの言論マップの現状などを聞きながら,研究の構想を練りました.今まで私が進めてきた研究をキーワードで表現すると,文書自動要約(~D2あたりまで),生命・医学文献からの知識獲得(NaCTeM以降)なので,獲得した知識をきちんと活用し,言語理解に一歩近づいた文書自動要約に挑戦することになるのだと思います.今の自分にはちょっと背伸びした研究テーマであるため,上手くいくのかどうか,不安とワクワク感でいっぱいです.

2011.08.12

CRFツールのベンチマーク

CRFsuite 0.12のリリースに合わせて,チャンキングタスクによるベンチマークを更新しました.見所は,0.11→0.12でどのくらい速くなったのか,高速だと謳っているWapitiがどのくらい速いかです.その他,各学習アルゴリズムによる性能(学習速度,精度)差も,興味深い点かと思います.比較したツールは,

実験では,L2正則化(C=1),L-BFGSの終了条件は直近10回の反復で目的関数の改善率が1e-5を下回ったとき,平均化パーセプトロンの反復回数は50に固定,という条件にしました.

まず,CRFsuite 0.12で実装された平均化パーセプトロン(AP)は,非常に高速でありながら,L-BFGSやSGDに迫るタグ付け性能を示しています.精度はL-BFGSやSGDと比較して0.1~0.3ポイントくらい低下するようですが,学習データを1回(iteration)処理するのに要する時間は,1.7-1.9倍高速です.1回の反復に要する時間が短くなるのは,各事例に対してViterbiアルゴリズムを適用するだけで学習を進めることができ,手間のかかる対数尤度や勾配の計算を省くことができるからです.さらに,今回の実験では8回の反復でピークの性能を示したので,反復の回数を開発データセットなどでうまく調整できれば,非常に有用な学習アルゴリズムと言えます.

比較したソフトウェアの中で後発のWapitiはなかなか速いですが,一回の反復に要する時間を比較するとCRFsuiteより遅いようです.Wapitiのデフォルトのパラメータでは,L-BFGSの収束判定が非常に甘いため,30回強の反復で最適化が終了してしまいます(このため収束判定条件を統一しました).L-BFGSのiteration回数と精度のグラフを見ていると,30回付近では精度の改善が続いているため,この段階で最適化を止めてしまうのは早すぎます.WapitiはML compで長い間最速を維持していると謳っていますが,収束判定が甘いのが主要因だとすると,利用には注意が必要かもしれません.

CRFsuiteもML compにエントリーしたいのですが,系列ラベリングタスクの素性生成は各ソフトウェアに任されており,しかも,各ソフトウェアはどのタスクのデータが来たのか分からないため,有益な比較がしづらい状況にあります.つまり,与えられたデータの各列の意味がソフトウェア側からは(トリッキーな方法を使わない限り)分からないので,品詞タグ付けやチャンキングで同じ素性セットを使うことになってしまいます.さらに,素性数や学習アルゴリズム,パラメータなどで学習時間は大きく変わるので,純粋な実装の「良さ」をML compの実験環境で見積もるのは難しいと思います.

CRFsuite 0.11と0.12の比較(L-BFGS学習時)では,sparse素性で1.38倍,dense素性で1.46倍の速度向上が見られました.大した速度向上ではないかもしれませんが,0.12ではソースコードの可読性・再利用性を劇的に改善したので,この結果には満足しています.

2011.08.11

CRFsuite 0.12 released

CRFsuiteのバージョン0.12をリリースしました.このバージョンは変更点がてんこ盛りです.張り切りすぎたせいで,ドキュメントの更新に手間取り,コードが出来てからリリースまで1年くらい経過してしまいました.変更点はChangeLogの通りですが,このブログではいくつか補足しながら紹介します.

ソースコードの大がかりな再構成を行いました.特に,グラフィカルモデルの処理に関する部分(対数尤度や勾配の計算など)と,学習アルゴリズムに関する部分を分離しました.今回のソースコードの再構成により,新しい学習アルゴリズムの追加や,異なる形状のグラフィカルモデル(例えば属性とラベルバイグラムに対する素性や二次マルコフ素性)を追加しやすくしました.ソースコードの再構成をやるモチベーションは前々からあったのですが,@yuutatさんの「Fast Newton-CG Method for Batch Learning of Conditional Random Fields」の研究に混ぜて頂いたのをきっかけに,コードの大がかりな修正を行いました.新しいグラフィカルモデルを追加したり,ヘッシアン・ベクトル積のDPによる計算を追加することには,まだ未着手ですが,そのための基礎を固めました.

ソースコードを綺麗にしたついでに,平均化パーセプトロンPassive-AggressiveAdaptive Regularization of Weights (AROW) の学習アルゴリズムを追加しました.学習アルゴリズムは,-aオプションで指定することになりました.学習アルゴリズム毎のパラメータの一覧は,-Hオプションで見ることができます.

ソースコードの見直しを行っているときに,「あー昔は理解が足りず無駄な計算をしているなぁ」と思うところがいくつかあったので,その部分を修正しました.日記で書いていたSSEのexp計算ルーチンも取り込まれています.これらの修正により,だいたい1.4~1.5倍速くなりました.新しいベンチマーク結果を載せておきました.

系列の開始(BOS)と終了(EOS)の素性を自動的に生成するのを廃止しました.以前のCRFsuiteでは,BOS,EOSという特殊なステートを定義し,そのステートから各ラベルへの遷移素性(バイグラム素性)を作っていました.考えてみたら,系列の先頭と末尾にEOS/BOSを表す属性を追加すれば十分だったので,BOS/EOSに対する特殊なコードを削除しました.BOS/EOS素性を作りたいときは,各インスタンスの先頭と末尾のアイテムに,”__BOS__”や”__EOS__”みたいな属性を追加してください.

いくつかの学習パラメータの名前が変更になりました.重要なところでは,”regularization.sigma”が”c1″及び”c2″になりました(c1 = 1.0 / regularization.sigma; c2 = 0.5 / regularization.sigma^2).これにより,L1正則化,L2正則化が同時に使えるようになりました.L1正則化,L2正則化をOFFにするときは,それぞれ”c1″,”c2″を0にセットしてください(sigmaによる設定だと無限大にする必要があったので,cによる設定に変更しました).

交差検定(cross-validation)やテストセットによる評価(holdout-evaluation)を,データセットにグループ番号を割り振ることで実装しました.学習と同時にテストセットで評価を行うには,複数のデータセットをCRFsuiteに入力し,どのデータセットで評価を行うのか,グループ番号を指定します.交差検定を行うときは,N個のデータセットを明示的に与えるか,-gオプションを使い入力されたデータセットを自動的にN分割すればOKです.

データセットのフォーマットに関するドキュメントを書きました.データフォーマットはCRFsuiteの特徴の一つでもあるのですが,ユーザからの質問が多いので,きちんと書くことにしました.

これまでは,#でコメントを書くことを許していたのですが,自然言語のテキストから属性を作るときにうっかりと”#”を使ってしまうトラブルが起きそうなので,廃止しました.

予測されたラベル系列の条件付き確率(-pオプション)や,各ラベルの周辺確率(-iオプション)を出力できるようにしました.これらの機能には多くの要望が寄せられました.

CRFsuiteのC言語APIを大幅に改訂しました.ライブラリの名前はlibcrfからlibcrfsuiteに変更になりました.ライブラリが公開している関数名は,”crfsuite_”という文字列から始まるようになりました.C言語のAPIドキュメントを書きました.

CRFsuiteのライブラリを簡単に使うために,C++のラッパー(crfsuite_api.hppcrfsuite.hpp)を書きました(C++/SWIGのAPIドキュメント).さらに,C++のAPIをSWIGを経由して他の言語から呼び出せるようにしました.手始めにPythonのモジュールを構築し,学習とタグ付けがPythonから行えるようになりました.モジュールのビルド方法はREADMEを参照してください.

CRFsuiteに与えるデータセットを生成するためのサンプルスクリプトを改良しました.チャンキングのサンプル(chunking.py)は,わかりやすい属性名を出力するようになりました.また,CRFsuiteのPythonモジュールを利用して直接タグ付けを行う機能も実装されました.CRF++互換のテンプレートを処理するためのスクリプト(template.py)を追加しました.その他,固有表現抽出(ner.py),品詞タグ付け(pos.py)のサンプルも追加しました.これらのサンプルを改変するだけで,CRFsuiteを新しいタスクに適用できると思います.

メモリリークを何点か修正し,メモリ使用量を若干削減しました.

モデルファイルが存在しないときに落ちる問題を修正しました.

2011.04.18

仙台市中心部の生活・環境について

まず,最初に断っておきますが,これから書く内容は仙台市青葉区の中心部(仙台駅や県庁周辺)の話です.仙台市は,東は海,西は山形県に面していて,地震の被害状況が場所によってかなり異なります.海岸に近い地域の被害は悲惨で,瓦礫の撤去作業が完了するまでに半年~1年はかかると言われています.一方,仙台市青葉区の中心部は,震災の被害がないわけではありませんが,被害甚大な地域の方に申し訳ないと思うくらい,日常を取り戻しています.インターネット上を探しても,仙台市中心部の生活・環境に関する情報が乏しく,心配されている方が多いと思いますので,このエントリで仙台市中心部の現状報告をいたします.

■ ライフラインについて

  • 電気・水道は復旧しています.
  • 都市ガスは復旧が遅れていたものの,今では復旧しているところが殆どのようです.
  • 私の家はLPガスですが,震災の影響を受けなかったようです(と,アパートの人から聞きました).
  • 自分が使っているキャリアである,Willcomとイーモバイルは普通に使えます.他の人も,普通に携帯が使えているようです.
  • 光インターネットを申し込んだものの,開通工事がGW直前になってしまいました(新規工事なので仕方がないところ).他の人の状況を見る感じでは,インターネットは普通に使えているようです.
  • 郵便・宅急便とも,ほぼ通常通りの日数で配達されます.
  • 生ゴミの収集は平常通りに戻っています.プラスチック類は,4月末に再開予定のようです.

■ 物資について

  • スーパーの行列は3月末(私が来る前)の時点で解消しています.
  • スーパーではあらゆる物が買えます.ヨーグルトは品薄気味ですが,全く買えない訳でもありません.牛乳は潤沢にありますし,ミネラルウォーターも買えます.カップ麺やパンも普通に売っています.
  • ガソリンスタンドの行列は4月上旬あたりで解消しています.レギュラーガソリンは153~155円/lと高めですが,並ばずに給油できます.
  • 営業時間の短縮はあるものの,デパートは平常通り営業しています.
  • 色々なお店で復興応援セールが行われています.だいたい2割引のお店が多いような気がします.

■ 外食について

  • 都市ガスの復旧の遅れにより,営業が再開出来なかった店が少なくありませんでしたが,今ではかなりの店が営業を再開しています.
  • ガスや材料の調達の都合により,特別メニューになるところが多くありましたが,それも解消傾向にあります.
  • 店を開けたものの,お客さんがあんまり戻ってきていないと聞きます.まだ消費するというマインドには遠いようです.

■ 交通について

  • 仙台市の地下鉄は,台原より北の区間を除き,平常通り運行されています.
  • 仙台市のバスは休日ダイヤで運行されていましたが,4月18日より平日・土・日祝の平常ダイヤに戻りました.
  • ラッシュ時の車の渋滞はものすごいです(震災の影響だけではないと思いますが).
  • 東京への交通は,高速バスの他,仙台空港からの臨時便,仙台-福島間を在来線でリレーした新幹線が使えます.仙台からの新幹線は4月25日から復旧予定のようです.

■ 放射能の影響について

仙台市は,福島第一原子力発電所から北に100kmくらいの位置にあります.仙台市中心部の放射線量は,今日現在で0.08~0.10μSv/hくらいです.仙台市青葉区の放射線量は,以下のサイトから情報を得ることができます.

これらの測定値がほぼ一致しているので,測定データは正確だと思います.この,0.08~0.10μSv/hという値は,平時の2倍くらいの放射線量です.仙台は平時の値がもともと低かったようで,現在の放射線量の値だけを比較すれば,仙台も東京も大差がありません.私は,環境中の放射線量が1μSv/h以下で安心,3μSv/hで警戒,30μSv/hで脱出準備,300μSv/hで緊急脱出という基準を,自分なりに設定しています(妊婦や乳幼児に対応する基準なので若干厳しめです).この基準に照らし合わせると,仙台は過去も現在もずっと安心圏内にいることになります.

仙台市青葉区の水は,水源が北西側にあることが幸いしているのか,放射能水準が低く抑えられています.青葉区の中心部に水を供給している国見浄水場の測定値では,放射性ヨウ素I131が0.5Bq/kg,放射性セシウムが不検出となっています(4月13日現在).東京都の測定値では,4月16日現在で放射性ヨウ素I131が0.30Bq/kg,放射性セシウムが不検出となっていますので,水に関しても東京と仙台は大差がありません.乳幼児の飲料に対する暫定基準値である100Bq/kgを大きく下回り,WHOの安心基準値である1Bq/kgも下回っていますので,仙台の水も安心圏内にあります.

■ 余震について

地震はかなり多いです.慣れてきたので,「またか」と思うだけになりました.こうして書いている間にも,地震がありました.ただ,余震は東日本の広い範囲で発生しているようなので,東京とそんなに状況が変わらないかもしれません.地盤沈下などで陥没している場所があったり,建物の全部もしくは一部が危険な状態にあるため立ち入り禁止になっている所はありますが,仙台市中心部で地震で倒壊した建物を見たことがありません.

■ 大学について

GW空けに授業を開始する予定になっています.私の研究室のあった建物は,倒壊の危険があるため,原則立ち入り禁止となっています.4月末から5月上旬にかけて,研究室の引っ越しが行われる予定で,その準備を進めている段階です.研究室の学生さんたちとは,基本的にskypeでミーティングをしていますが,皆さん積極的に論文を読んだり,プログラミングの課題をこなしたりしているので,感心しています.まだ直接会ったことがない学生がたくさんいますが,研究室でワイワイ楽しくやれる日が来るのを,楽しみにしています.

■ 賑わいについて

昨日は,アーケード街などに出かけてきましたが,渋谷のセンター街と同じくらいの賑わいで,自転車は降りて通行する必要がありました(元々降りて通行するルールになっていますが).ちょうど桜が見頃を迎えていて,花見をしている人たちがいました.

2011.04.17

仙台に来てから早くも2週間

仙台での生活を始めてから2週間くらい経ちました.3月30日の昼間に高速バスで仙台入りし,4月1日に無事辞令を頂いたことは,前回の日記に書いたとおりです.最初の1週間は生活の効率が非常に悪く,家から大学に行くのにバスの乗り継ぎに失敗して1時間以上かかったり,仙台駅からバスで往復2時間くらいかけてカーテンを買いに行ったり,無駄の多い生活をしていました.家から最寄りの地下鉄の駅まで徒歩11分,仙台駅まで15分なので,電車やバスに乗らない方が早いと気づいてからは,生活が若干スムーズになりました(歩き疲れますが).

4月7日の夜中に震度6弱の大きな余震がありました.私は家に居たのですが,かなり揺れるなぁと思ったくらいで,怖いとは感じませんでした(3月11日の本震のときは,東大の研究室に居たのですが,この時の地震の方が長く,かなり揺れ,天井からホコリが落ちてきたので,怖くて机の下に避難しました).揺れている途中で電圧降下みたいな現象を経た後,停電になりました.家にはテレビがないので,すぐさま実家に電話し,状況を聞きました(嫁は寝ていて役に立たず・・・).他の携帯キャリアはどうだったか知りませんが,Willcomはたまに発呼できなかったり,ノイズが乗るものの,電話ができていました.仙台入りに併せて購入したHTC Aria(イーモバイル)も,インターネット・電話ともに使えており,情報収集を行うことができたのでパニックにならずに済みました.その日の午後に入手した自転車に乗り,周辺がすべて停電しているのを確認しました.信号機も停電しているため,大通りの交差点ではあうんの呼吸で車が行き交っていました.電気はすぐには戻らないような気がしたので,そのまま寝ることにしました.停電になると水道も止まる可能性があるので,お風呂に水を張らなければいけなかったのですが,そこまで頭が回っていませんでした.また,このときに色々な方からメール頂きました.ご心配をおかけしました.

4月8日は車の納車&引っ越し荷物搬出&退去のために,朝の高速バスを予約していました.前日の余震の影響で高速道路が通行止めになり,バスが運休になってしまうのではないかと心配したのですが,無事に東京に出ることができました.途中,福島のSAで桃のジュースを買って飲みました.こんな美味しいものが飲めなくなってしまうかもしれないと思うと,やるせない気持ちになります.

桃の恵み

4月8日は,埼玉のホンダの中古車のディーラーさんが,ナンバー登録のため,東京-仙台間を往復することになっていました.ディーラーさんは,陸運局が動いていることを確認してから仙台に向かったのですが,正午過ぎに陸運局が再停電したため,仙台で足止めを食らっていました.最終的には,停電が解消され無事ナンバーを取得できたのですが,ディーラーさんに無駄足をさせてしまったかと,ハラハラしました.9日に引っ越し荷物の最終準備&ゴミ捨てを行い,ディーラーで中古のFitを受け取りました.10日に引っ越し荷物搬出&退去を行い,受け取ったばかりのFitで自走して仙台に戻って来ました.東北道の宮城県内は50km/h制限が出ていたのですが,周りは100km/hくらいで飛ばしているので,ペーパーの私にはちょっと怖かったです.

4月11日からの週は,研究室の引っ越しの準備をしたり,大学の教授会などに出席しました.それぞれの会議の冒頭で,新任着任の挨拶をしました.4月15日は,引っ越しの荷物の搬入があり,冷蔵庫がキッチン手前のドアを通過できないというアクシデントがありましたが,日通さんに知恵と体力を振り絞って頂いて,ベランダの壁を乗り越えることができました.

4月15日の夜は,一人で鳥心をリサーチ.もつ煮と焼き鳥が美味しかったです.4月16日は,運転練習を兼ねて買い物に出かけ,夜は乾さん風のごとくに連れて行ってもらいました.食べ物では,筍の唐揚げと温野菜サラダが絶品.日本酒も美味しくて色々楽しんだら,少々飲み過ぎてしまいました.被害の大きかった地域や酒蔵の話を店長から聞いて,残念な気持ちに.

こんな感じで,ばたばたとした日々を送っていますが,安くて美味しい仙台は健在です.東北全体が元気になるために,自分に出来ることを考え,行動に移していきたいと思います.

2011.04.01

東北大学情報科学研究科に准教授として着任しました

本日、東北大学で辞令交付式があり、情報科学研究科の准教授に任命されました。今後は、乾健太郎さん、研究室の学生・スタッフさんと一緒に、自然言語処理や知識処理の研究を進めていきます。

辞令交付式の様子

この日を迎えられたのも、諸先生・先輩・同僚・学生・友人の皆様のお陰です。全員挙げるとキリがないくらい、いろいろな方にお世話になりました。これから約10年間が、自分にとって本当に大切な時期だと考えていて、これまで以上に研究と教育に打ち込んで行こうと思いますので、ご指導・ご支援をよろしくお願い致します。

2011.01.01

あけおめ・ことよろ

2010.09.02

exp(x)の高速計算 ~実験編~

最後に,e^xの計算がどのくらい高速化できたのか,実験してみました.アルゴリズムとして,以下のものを比較しました.

  • libcのexp関数
  • パデ近似を用いたもの(cephesの実装に近いです)
  • 5次~13次でテーラー展開を0を中心として行ったもの
  • 5次~13次の最良多項式近似を[-0.5, +0.5]の範囲で行ったもの
  • 5次~13次の最良多項式近似を[0, \log 2]の範囲で行ったもの
  • 5次~11次の最良多項式近似を[0, \log 2]の範囲で行ったものをSSE2で実装したもの

SSE2の実装で11次で打ち止めしているのは,11次と13次で演算精度の差が殆どないことが分かり,単に実装するのが面倒くさかったからだけです.0を中心としたテーラー展開や,最良多項式を[-0.5, +0.5]の範囲で構成する手法は,nの値を切り下げではなく,四捨五入(つまり0.5を足してから切り下げる)で求めます(Wapitisse_mathfun.hのexp計算ルーチンは四捨五入を使っています).

実験では,0を平均としたガウス分布で乱数を10,000,000個発生させ,その値のexpを全て計算するのに要する時間と,libcの演算結果を正しいものと仮定したときの誤差を測定しました.実験環境は,Intel(R) Xeon(R) CPU 5140 (2.33GHz) 上でDebian Linuxを動作させたアプリケーション・サーバーです.gccのバージョンは4.1.2で,コンパイルオプションは「-O3 -fomit-frame-pointer -msse2 -mfpmath=sse -ffast-math -lm」です.実験に用いたコードは,こちらからダウンロードもしくは閲覧できます.

横軸に計算時間,縦軸に誤差のRMS(二乗平均平方根)をプロットしたものを示します.Performance of fast exp computation

縦に一本線が入っているのが,libcの計算時間です.これを基準に誤差を測定しているので,エラーは0です.この線よりも左側に入っていないと,高速化の意味が無いことになります.各アルゴリズムは,左上が5次の多項式近似で,右下に向かって7次,9次,11次,13次と,精密かつ遅くなっていきます.だいたい,10^{-16}あたりで計算誤差の改善が止まっています.これは倍精度浮動小数点の有効桁数である16桁と大体一致しています.

計算精度に着目すると,テイラー展開 < 最良近似式 [-0.5, +0.5] < 最良近似式 [0, log 2] という順で,どの近似式も次数を上げていくと,10^{-16}付近まで誤差が改善します.ただ,アルゴリズムをCで実装してしまうと,libcと比較しても大した速度向上が得られません.5次まで近似精度を落としたとしても,2倍程度しか速くなりません.libcのexpの実装も相当に高速化されているので,一筋縄ではいかないようです.

これに対し,アルゴリズムをSSE2で実装したものは,4倍~8倍程度高速化されています.しかも,計算精度はSSE2化していないものとぴったり一致しているので,計算精度を犠牲にすることなく,高速化が達成できたことになります.e^xを大量に計算する状況では,11次の最良近似式を用いたSSE2ルーチンを使えば,演算精度を落とすことなく高速化できますし,近似式の精度が低くて良ければ,次数を下げてさらに高速化できます.次期バージョンのCRFsuiteでは,その他の改良も含めて,SSE2ルーチンを搭載する予定です.

Next »