Home > 8月, 2011

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を新しいタスクに適用できると思います.

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

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