本ソフトウェアは,最大エントロピーモデル (Maximum entropy model) [1] のパラメータ推定を行なうプログラムです. 事象(event)を学習データとし,学習データの尤度を最大化するパラメータを出 力します.特徴として,以下のような機能をサポートしています.
最大エントロピーモデルとは,目的(target)事象 x および履歴(history)事象 y からなる事象 e=<x,y> の条件つき確率 p(x|y) を与える確率モデルです.この時,各事象の特徴を 素性関数(または素性) f_i の組で表します. 各 i に対して一つの特徴が対応し,f_i(x|y) は <x,y> が特 徴 i を持つ時に 1 以上の値をとります.
事象 e=<x,y>, 素性関数 f_i が与えられた時,最大エントロピーモデルは以下の式 で確率値を与えます.
p(x|y) = 1/(Z_y) prod( a_i^f_i(x,y) )a_i はモデルのパラメータで,直観的には素性 f_i の重みを表します.Z_yは正規化のための数で,y が 与えられた時の全ての可能な x について p(x|y) の和が 1 になるようにするための数です.
Amis は,素性関数の組と,学習データとして観測された事象データを入力とし, 最適なパラメータ a_i を計算して出力します.この とき,アルゴリズムとして IIS, GIS, limited-memory BFGS をサポートして います.
上記を満たすIAマシン,もしくは同等スペックのSparcマシンで動作します.入 力データのサイズによっては,さらにメモリ・ハードディスクが必要となります.
Amis は configure に対応しているので,以下のステップでコンパイルし,イ ンストールします.(以下の例で,% はコマンドプロンプトを表しています.)
% ./configureデフォルトでは /usr/local/ 以下に実行ファイルがインストールされま すが,他のディレクトリ($DIR とする)にインストールしたい時は,以下 のようにオプションを指定してください.
% ./configure --prefix=$DIRまた,--prefix 以外にも以下のようなオプションに対応しています.
| オプション | デフォルト | 有効な値 | 効果 |
|---|---|---|---|
| --enable-debug | no | 0 〜 5 または no | デバッグメッセージを表示する/しないを設定します.数が大き いほどたくさんのメッセージを表示します. |
| --enable-profile | no | 0 〜 5 または no | プロファイル(各関数の実行時間の測定)をする/しないを設定し ます.数が大きいほどたくさんの関数のプロファイルをとります. |
| --enable-ambiguity | no | no または yes | 曖昧事象(ambiguous event)をサポートする/しないを設定します. 曖昧事象をサポートするとプログラムのスピードがかなり落ちるので, 必要ないときは no にしてください. |
% makeコンパイルが終了すると amis という実行ファイルが生成されます.
% make check
% make install
以上により,/usr/local/bin/amis がインストールされます.
Amis を起動するには,設定ファイル(後述)を引 数として,amis を実行します.
% amis [設定ファイル]引数を省略すると,デフォルトでは amis.conf を設定ファイルとして読み込み ます.amis.conf が見つからない(または読み込めない)ときは,エラーとなり 終了します.
プログラム起動時に,以下のようなオプションを指定することができます.
| オプション | デフォルト | 有効な値 | 効果 |
|---|---|---|---|
| -h | なし | なし | ヘルプメッセージを表示します. |
| -f | binary | [binary|integer|real] | 素性のタイプを指定します. |
| -m | amis.model | ファイル名 | モデルファイル(後述)を指定します. |
| -e | amis.event | ファイル名 | イベントファイル(後述)を指定します. |
| -o | amis.output | ファイル名 | 出力ファイル(後述)を指定します. |
| -l | amis.log | ファイル名 | ログファイル(後述)を指定します. |
| -d | Amis | [Amis|CMEE] | データファイル形式を指定します. |
| -a | IIS | [IIS|GIS|BFGS] | パラメータ推定アルゴリズムを指定します. |
| -i | 200 | 1以上の整数 | 繰り返し計算の回数を指定します. |
| -n | 200 | 1以上の整数 | ニュートン法における繰り返し計算の回数を指定します. |
| -s | 5 | 1以上の整数 | limited-memory BFGS 法におけるメモリサイズを指定します. |
| -r | 1 | 1以上の整数 | 途中経過を表示するインターバルを指定します. |
| -p | 6 | 1以上の整数 | 有効数字の桁数を指定します. |
各設定は,以下の順番で有効になります.
本プログラムは以下のモジュールから構成されています.
モデルファイル
イベントファイル 設定ファイル
↓ ↓
---------------------- ----------------
| | | |
| データファイル管理 |←−| プロパティ |
| | | |
---------------------- ----------------
| ↓ ↓
| ---------- ----------------
| | | | |
| | モデル |−→| |
| | | | |
| ---------- | アルゴリズム |−→ 出力モデル
| ---------------- | |
| | | | |
→| イベント空間 |−→| |
| | | |
---------------- ----------------
|
----------------------------------------
| 素性関数の実測平均のベクトル |
| 素性関数のモデルによる期待値のベクトル |
----------------------------------------
ここでは,Amis形式およびAmisTree形式のデータファイル形式について説明し ます.本ソフトウェアはCMEE形式のデータも受 け付けますが,Amis形式の方が記述の自由度が高くなっています.また, AmisTree形式は feature forest に対するパラメータ推定アルゴリズムを利用 する時に使います.
各ファイルにおいて,# から行末まではコメントとして無視されます.コメント はスペースと同等の扱いとなります.各トークンはスペースまたはタブで区切 られ,改行文字が行の終りを表します.また,コロン(:)は特別な文字として 認識されます.これらの特別な文字をトークンの一部として使いたい時は,バッ クスラッシュ(\)でエスケープしてください.バックスラッシュ自身は \\ で 表します.
amis を利用するには,設定ファイル,モデルファイル, イベントファイルの3つのファイルを用意する 必要があります.それぞれについて以下で説明します.
設定ファイルでは,オプションの名前とその値の組を記述します.具体的には, 以下のようになります.
DATA_FORMAT Amis FEATURE_TYPE integer MODEL_FILE me.model EVENT_FILE me.event OUTPUT_FILE me.output LOG_FILE me.log ESTIMATION_ALGORITHM IIS NUM_ITERATIONS 200 NUM_NEWTON_ITERATIONS 20 REPORT_INTERVAL 1 PRECISION 6
指定できるオプションは以下の通りです.
| オプション | デフォルト値 | 有効な値 | 効果 |
|---|---|---|---|
| DATA_FORMAT | Amis | Amis CMEE AmisTree | データファイルの形式を指定します. |
| FEATURE_TYPE | binary | binary integer real | 素性のタイプを指定します. |
| MODEL_FILE | amis.model | ファイル名(複数指定可) | モデルファイルの名前を指定します. |
| EVENT_FILE | amis.event | ファイル名(複数指定可) | イベントファイルの名前を指定します. |
| OUTPUT_FILE | amis.output | ファイル名 | 出力ファイルの名前を指定します. |
| LOG_FILE | amis.log | ファイル名 | ログファイルの名前を指定します. |
| ESTIMATION_ALGORITHM | IIS | IIS GIS BFGS | パラメータ推定に使われるアルゴリズムを指定します. |
| FEATURE_COUNT_HASH | FALSE | TRUE FALSE | IIS アルゴリズムにおいて,ファクタリングによる最適化を "map" クラスで行なうか "vector" クラスで行なうかを選択します.デフォルト では "vector" を用います. |
| NUM_ITERATIONS | 200 | 1以上の整数 | 繰り返しの回数を指定します. |
| MEMORY_SIZE | 5 | 1以上の整数 | limited-memory BFGS のメモりサイズを指定します. |
| REPORT_INTERVAL | 1 | 1以上の整数 | 途中経過を報告する間隔を指定します. |
| PRECISION | 6 | 1以上の整数 | 有効数字の桁数を指定します. |
| EVENT_ON_FILE | FALSE | TRUE FALSE | イベントデータをメモリ上におくか(デフォルト),ファイル上におく かを指定します.イベントデータが非常に大きくてメモリ不足の時に用い ます. |
| EVENT_ON_FILE_NAME | amis.event.tmp | ファイル名 | イベントデータを入れておくファイルの名前を指定します. EVENT_ON_FILE オプションを有効にしたときのみ有効です. |
モデルファイルは,素性関数と,それに対応するパラメータの初期値を与えるファ イルです.以下のような形式になっています.
feature1 1.0 feature2 2.0 feature3 0.3 ...
一行が一つの素性に対応します.まず素性の名前を記述します.素性の名前には, スペース,タブ,コロン(:),シャープ(#)以外の文字ならなんでも使えます.次 に,スペースまたはタブで区切って,パラメータの初期値を与えます.初期値は C スタイルの実数で記述します.初期値はいくつでも構いません(ふつうは 1.0 にする).各行は,素性とパラメータの二つの要素のみ記述できます.要素 が1つしかなかったり3つ以上ある場合はエラーとなります.
イベントファイルでは,観測された事象のデータを与えます.具体的には,観 測事象(observed event)と補完事象(complement event)で発火した素性のデー タを与えます.ここで観測事象とは,実際に観測された事象です.補間事象と は,観測事象とは目的事象だけがことなる事象です.概要で述べた通り,確率値を与える時に,同じ履 歴事象の元で観測されうる全ての目的事象について正規化をする必要があるた め,このように補間事象でそれらの事象を表現します.つまり,各事象は,実 際に観測された事象と,おなじ履歴事象の元で観測されうる事象で記述します.
イベントファイルは以下のような形式になっています.
event_1 1 feature1:2 feature3 0 feature1 0 feature2:3 event_2 0 feature2 feature3:5 1 feature1 0 feature3 ...
空行で分けられたブロックが一つの事象に対応します.一行目には,事象の名 前を記述します.事象名には,上述した特殊文字以外の任意の文字が使えます. 次の行からは,各行に観測事象または補間事象を記述します.行の先頭には, その事象の観測回数を記述します.観測事象の場合は正の数,補間事象の場合 は0になります.曖昧事象を有効にしている場合は,観測回数として正の実数 を指定することができます.曖昧事象が無効の時は,観測事象については正の 整数を指定し,一つの事象につき観測事象は一つしか記述できません.その後 ろに,発火した素性を列挙します.素性は,モデルファイルで記述したものを 指定します.モデルファイルにない素性を指定するとエラーになります.各素 性の後ろには,素性関数の値を指定することができます.上の例の通り,コロ ン(:)に続けて素性関数の値を指定します.省略した場合は1とみなされます.
各事象は,空行で区切ります.空行は何行でも構いません.コメントのみの行 も空行とみなされますので注意して下さい.
Feature forest を用いるときは,イベントファイルは AmisTree 形式で記述 します.設定ファイル,モデルファイルはAmis形式 と同じです.ここでは,イベントファイルの形式について説明します.
AmisTree形式のイベントファイルは以下のような形式になっています.
event_1 2
feature1:2 feature2:3 feature3
{ dnode_1 ( node_1 feature1:2 { dnode_2 ( node_2
feature2:3 ) ( node_3 ) } { dnode_3 $node_2 (
node_4 feature3 ) } ) }
event_2 1
feature2:3
{ dnode_1 ( node_1 feature1 ) ( node_2 { dnode_2
( node_3 feature2:3 ) ( node_4 feature3 ) } ) }
...
注)各イベント記述の3行目以降は,実際には一行で記述します.
Amis 形式と同様に,空行が事象の区切りを表します.AmisTree 形式では,一つ の事象を3行で記述します.1行目は,事象の名前と,その事象の観測回数を記 述します.上の例では,事象 event_1 は2回,event_2 は1回観測されたこと を表します.2行目には,観測事象の素性を記述します.Amis 形式と同様,素 性の名前と素性関数の値を組で記述します.3行目には,観測事象および補完事 象の feature forest を記述します.まず,disjunctive node は中かっこで表 します.中かっこの中に,はじめにノード名を記述し,次に conjunctive node をスペースで区切って並べます.conjunctive node は,小かっこまたはノー ド名で表します.小かっこで表すときは,最初にその conjunctive node の名前 を記述します.conjunctive node の名前は,ノードの共有を表すために使いま す.素性と同様に,特殊文字以外の任意の文字が使えます.その後にそのノード で発火する素性を記述します.素性の記述方法は Amis 形式などと同じです.そ の後に,disjunctive node を記述することもできます.conjunctive node や disjunctive node の共有を表すときは,ノード名を用います.既出のノードに ついて,そのノード名の先頭に $ をつけたものでノードの共有を表します.上 の例では,event_1 において,$node2 は前に出てきた node2 と共有しているこ とを表します.このようにノードを共有して feature forest のサイズを小さく すると,計算量が小さくなり,スピードアップします.
中かっこ及び小かっこの前後には必ずスペースを空けてください.スペースがな い場合はノード名や素性名の一部とみなされます.
出力形式は,Amis, AmisTreeとも共通です.
amis は,素性とパラメータの組を出力します.出力形式は,モデルファイルと同じです.出力形式がモデルファイ ルと同じなので,出力データを新たな入力として amis を使うこともできます. すなわち,ある程度学習したデータを元に,さらに学習を進めることができます.
各素性に対応するパラメータa_iが出力されるので, 未知のデータに対して発火する素性のa_iの積を求め ることで,その確率値を計算することができます.
簡単な例を通して,Amis の使い方を説明します.ここでは,品詞タグ付けの 最大エントロピーモデルを考えます.例えば,"I like handball"という文に は,"I/Noun like/Verb handball/Noun"というふうに品詞タグを付けることが できます.タグ付けのタスクは,直前の単語/タグと現在の単語を与えられた 時に,最適なタグを割り当てるという事象の列と考えることができます.例え ば,今 "like" を見ているとすると,直前は "I/Noun" で今は "like" にタグ を付けようとしているという履歴事象のもとで,最適なタグを割り当てるとい う目的事象を考えることになります.Amis 形式では,タグ付けの事象は以下 のように表現されます("BOS" は "Beginning Of Sentence" のことです).
event_BOB/BOS-I/Noun 1 BOS/BOS-I/Noun */*-I/Noun */*-*/Noun 0 */*-*/Verb 0 */*-*/Prep 0 */*-*/Modif event_I/Noun-like/Verb 0 I/Noun-like/Noun */Noun-like/Noun */*-like/Noun */*-*/Noun 1 I/Noun-like/Verb */Noun-like/Verb */*-like/Verb */*-*/Verb 0 */Noun-like/Prep */*-like/Prep */*-*/Prep 0 */*-*/Modif event_like/Verb-handball/Noun ...
空行で区切られたそれぞれのブロックが一つの事象に対応します.各ブロック の一行目は事象の名前を表します(これは実は人間の見やすさのためのもので, 推定器には何の影響も及ぼしません).他の行では,その事象で発火する素性 を書きます.各行がそれぞれ目的事象(この例では Noun, Verb, Prep, Modif) に対応します.各事象の記述では,その履歴事象に対して観測され得る全ての 目的事象について発火する素性をかかなければなりません.その中で,実際に 学習データで観測された目的,履歴の組については,行の先頭に1以上の数(観 測回数)を書きます.それ以外の行では,先頭は0になります.
モデルファイルは以下のようになります.
BOS/BOS-I/Noun 1.0 */*-I/Noun 1.0 */*-*/Noun 1.0 */*-*/Verb 1.0 */*-*/Prep 1.0 */*-*/Modif 1.0 ...
推定器を走らせると,以下のような出力ファイルが得られます.
BOS/BOS-I/Noun 8.03 */*-I/Noun 1.45 */*-*/Noun 0.84 */*-*/Verb 0.72 */*-*/Prep 0.54 */*-*/Modif 0.48 ...これらのパラメータ値を使って,事象の確率を計算することができます.例え ば,直前の語が BOS/BOS の時に I に Noun を割り当てるイベントの(正規化 されていない)スコアは,
となります.同様に,q(Verb|...)=0.72, q(Prep|...)=0.54, q(Modif|...)=0.48となります.従って,上の事象 の確率は,q(Noun|BOS/BOS-I/*)= prod( a_i^f_i(Noun|BOS/BOS-I/*) )= prod( 8.03 * 1.45 * 0.84 )= 9.78
となります.p(Noun|BOS/BOS-I/*)= q(Noun|BOS/BOS-I/*) / Z_y= 9.78 / (9.78+0.72+0.54+0.48)= 0.849