いものやま。

雑多な知識の寄せ集め

HMEについて学んでみた。(その2)

昨日はHMEの構造と出力の計算について説明した。

今日はHMEでの学習について説明する。

HMEでの学習

HMEでの学習は、HMEを一種の混合分布モデルとみなして、尤度が最大になるように学習を行う。

・・・ということみたいなんだけど、これをまだ自分がちゃんと理解できてない(^^;
大雑把には理解できてるんだけど、ちゃんと数式に書き落とそうとすると、どうにも腑に落ちない部分が出てきて。

気になる人は、以下のページなどが参考になると思うので、参照。

ここでは、アルゴリズムだけ書くことにする。

なお、このアルゴリズム自体は、尤度関数(のlogをとって符号を逆転したもの)を誤差関数として、各パラメータに関する勾配を求めているので、HMEを強化学習関数近似として使う場合には、使わない・・・(※バッチ学習をする場合を除く)

以下では、2階層のHMEを想定する。
そして、以下のようにする:

  •  (\boldsymbol{x}, d):訓練サンプル
  •  \boldsymbol{\theta}_{i, j}:1層目のエキスパートネットワーク (i, j)のパラメータ
  •  y_{i, j}:1層目のエキスパートネットワーク (i, j)の出力(の関数)
  •  \boldsymbol{w}_{i, j}:1層目のゲートネットワーク iの、エキスパートネットワーク(i, j)に対する重み
  •  g_{i, j}:1層目のゲートネットワーク iの、エキスパートネットワーク (i, j)に対する出力
  •  y_{i}:1層目のプロパゲートノード iの出力=2層目のエキスパートネットワークiの出力
  •  \boldsymbol{w}_{i}:2層目のゲートネットワークの、エキスパートネットワークiに対する重み
  •  g_{i}:2層目のゲートネットワークの、エキスパートネットワーク iに対する出力
  •  y:2層目のプロパゲートノードの出力=HMEの最終的な出力

これらを使ってHMEの出力の計算を書くと、以下のようになる:

  1. 1層目のエキスパートネットワークの出力  y_{i, j} を、次のように求める:
     y_{i, j} = y_{i, j}(\boldsymbol{x}; \boldsymbol{\theta}_{i, j})
  2. 1層目のゲートネットワークの出力  g_{i, j} を、次のように求める:
    1.  s_{i, j} = \boldsymbol{w}_{i, j} {}^{\mathrm{T}} \boldsymbol{x}
    2.  g_{i, j} = \frac{ \mathrm{exp}( s_{i, j} ) }{ \sum_{k} \mathrm{exp}( s_{i, k} ) }
  3. 1層目のプロパゲートノードの出力  y_{i} を、次のように求める:
     y_{i} = \sum_{j} g_{i, j} y_{i, j}
  4. 2層目のゲートネットワークの出力  g_{i} を、次のように求める:
    1.  s_{i} = \boldsymbol{w}_{i} {}^{\mathrm{T}} \boldsymbol{x}
    2.  g_{i} = \frac{ \mathrm{exp}( s_{i} ) }{ \sum_{j} \mathrm{exp}( s_{j} ) }
  5. 2層目のプロパゲートノードの出力  y を、次のように求める:
     y = \sum_{i} g_{i} y_{i}

そして、学習を行うときは、次のように計算していく:

  1. 2層目のエキスパートネットワーク i について、値  h_{i} を、次のように求める:
     h_i = \frac{ g_i \sum_j g_{i, j} \mathrm{exp}( - \frac12 (d - y_{i, j})^{2} ) }{ \sum_k g_k \sum_j g_{k, j} \mathrm{exp}( - \frac12 (d - y_{k, j})^{2} ) }
  2. 1層目のエキスパートネットワーク (i, j) について、値  h_{i, j} を、次のように求める:
     h_{i, j} = \frac{ g_{i, j} \mathrm{exp}( - \frac12 (d - y_{i, j})^{2} ) }{ \sum_k g_{i, k} \mathrm{exp}( - \frac12 (d - y_{i, k})^{2} ) }
  3. 1層目のエキスパートネットワーク (i, j)について、誤差関数の出力に関する偏微分  \frac{ \partial E }{ \partial y_{i, j} } を次のようにして、エキスパートネットワークの学習を行う:
     \frac{ \partial E }{ \partial y_{i, j} } = h_i h_{i, j} (y_{i, j} - d)
  4. 2層目のゲートネットワークについて、誤差関数の中間層の出力に関する偏微分  \frac{ \partial E }{ \partial s_i } を次のようにして、ゲートネットワークの学習を行う:
     \frac{ \partial E }{ \partial s_i } = g_i - h_i
  5. 1層目のゲートネットワークについて、誤差関数の中間層の出力に関する偏微分  \frac{ \partial E }{ \partial s_{i, j} } を次のようにして、ゲートネットワークの学習を行う:
     \frac{ \partial E }{ \partial s_i } = h_i ( g_{i, j} - h_{i, j} )

添え字とかが酷いことになってるけど、頑張って・・・
偏微分に関して、参照している論文とは符号が逆になっているけど、これで正しいはず・・・というのも、尤度は最大化させたいので、誤差関数として使う場合、符号を反転させる必要があるはずだから)

自分が数式に落とせていないところ

以下はおまけ。

自分が数式に落とせていないところを書いておくと、

  1. 仮定している確率密度関数のパラメータがどのようになっているのか
  2.  g_i h_iを確率  p(A|B) の形で表現したとき、 A B がそれぞれどうなっているのか

まず、1つ目。

この統計的な考え方の背景にあるのは、パラメータを持つ確率密度関数を何か想定して、訓練サンプルというのはその確率分布に従うように得られていると考えたときに、実際に得られた訓練データから、尤もらしさ(尤度)を最大にするようなパラメータが得られれば、それはつまり、確率密度関数の妥当なパラメータを得られたことになる、という考え方。
ここで、1層目の各エキスパートネットワークの確率密度関数については正規分布を仮定していて、その確率密度関数のパラメータとなる平均と標準偏差を推定しようという話になっている。
そして、それらのパラメータはエキスパートネットワークのパラメータ \boldsymbol{\theta}_{i, j}の関数として暗に示されることになる。
なので、平均と標準偏差に関する推定を行うことが、エキスパートネットワークのパラメータの推定を行うことにもつながっていく、と。

けど、そのことを数式に落とそうとすると、どう書いたらいいのかが非常に混乱する。
特に、ここでは最初からHMEについて考えることを行っているけど、同様の統計的な見方を普通のニューラルネットワークに用いることも可能なはずで、その場合、普通のニューラルネットワークに対する、想定しているパラメータを伴った確率密度関数の記法と、HMEのエキスパートネットワークに対する、想定しているパラメータを伴った確率密度関数の記法とで、どうにもつじつまが合わなくなってくるように思う。

次に、2つ目。

論文を読むと、 g_i を「事前確率」、 h_i を「事後確率」として扱っている。
これ自体はなんとなく伝わってくるんだけど、これをいざ  p(A|B) の書き方で書こうとすると、 A B に当てはまるものが何なのかが、よく分からない。
この部分に関しては、参照している2つの論文のいずれもこの形では書かれていなくて、「事後確率」としか言っていない。
けど、事後確率であるのなら、 \boldsymbol{x}, d, y, y_i, g_i, \boldsymbol{\theta}_{i, j}, \boldsymbol{w}_i などのどれを使うのかよく分からないけど、とにかくこれらを使って  p(A|B) の形で書けるはず。

確かに煩雑ではあるんだけど、このあたりの細かい議論がすっ飛ばされていて、議論を追いきれない・・・
誰か分かりやすい解説を書いてくれればいいんだけど。

今日はここまで!