スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

多値 noisy-OR モデル

TR2(草稿)のアルゴリズムの問題点とその修正についてです。
結論から言うと微修正ですみました。

普通ベイジアンネットの noisy-OR モデルは2値の変数だけを考えます。
true を活性値、 false を非活性値とします。

T={ k : Uk=true } (すなわち T は活性値を持つ親ノードのインデックスの集合)とすると、
noisy-OR モデルは

p(X=true|u1,...,um) = 1 - Π_{k∈T} (1-P(X=true|Uk=true))
p(X=false|u1,...,um) = Π_{k∈T} P(X=false|Uk=true)

というものです。(参考: Pearl 本 p.184-)
非活性値を持つ親ノードが子ノードの値に影響を与えないという性質は、
最初から信号 X の生成メカニズムの基本的性質としてモデルに作りこまれています。

BESOM は多値を扱うので、 noisy-OR モデルを拡張する必要があります。
ところがその方法は一意には決まりません。
2つの親ノード U1, U2 が子ノード X の違う値を生成するとき、たとえば
P(x1|u1)=1, P(x2|u2)=1 のとき P(x1|u1,u2), P(x2|u1,u2) の値は何になるべきでしょうか?
それは個別の信号生成メカニズムごとに違います。
それを正確に学習しようとすると親ノードの数 n に対して O(2^n) のメモリ量が必要になり、事実上実現不可能です。

そこで、多くの信号生成メカニズムを、そこそこよく近似できるモデルを恣意的に決める必要があります。
今回、「メモリ量・計算量が O(n) である」 、
「特殊な状況では noisy-OR モデルと一致する」、
「神経回路で比較的容易に実現できる」、
という3つの要請を満たすであろうモデルとして下記のようなものを考えました。

p(xi|u1,...,um) = 1/Z (1 - Πk (1-P(xi|uk)))
p(xφ|u1,...,um) = 1/Z Πk P(xφ|uk)

活性値のインデックスの集合 T が式に表れていませんが、 BESOM では
P(xi|uφ)<<1
P(xφ|uφ)≒1
という性質が成り立っているので不要です。
また、条件付き確率の総和を1にするための正規化係数 Z は実は計算する必要はありません。
MPE計算では尤度の比のみが必要だからです。

この「多値 noisy-OR モデル」に合わせて BESOM のシミュレータのソースを修正し、動作することを確認しました。

TR2(草稿)に載せた今までのシミュレータではφ値と非φ値の扱いを分けずに、
p(xi|u1,...,um) = 1/Z (1 - Πk (1-P(xi|uk)))
p(xφ|u1,...,um) = 1/Z (1 - Πk (1-P(xφ|uk)))
としていました。おかげで、親ノードが「子ノードのφ値を生成する値」を取りやすくなっていたようです。

実はこの修正のおかげで非線形ICAのシミュレーションがかえって動作不安定になってしまいました。
新しい特徴間競合の機構を実装することで、動作が安定するのではないかと考えています。
これを8月中くらいに試したいと思っています。
うまくいけばそれを BESOM Ver.1.0 とする予定です。

2009-09-04 追記:
BESOM Ver.1.0 を公開しました。結局、アルゴリズムの修正は見送りました。

コメント

コメントの投稿

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。