自然言語処理などでは,構文木に対応する特徴ベクトルを計算するために, recursive neural network (RNN) というモデルを使う. この一種である recursive autoencoder (RAE) というモデルが, いろいろな研究 [So11-1, So11-2] で利用されているようなので, 紹介する.

Recursive autoencoder (RAE)

まずは,RAE の話の前に, 1月7日の記事で説明した RNN について簡単に復習しておく. RNN は木構造(主に構文木)に対する特徴ベクトルを求める際に使用するニューラルネットである. RNN では,子のノードに対応する特徴ベクトル $\bm{x}_1, \bm{x}_2, \dots, \bm{x}_M \in \Real^D$ から, 親のノードに対応する特徴ベクトル $\bm{y} \in \Real^D$ を求める.

![RNN のユニット](/img/RNN-unit.png)

ただし,$\bm{b} \in \Real^D$ はバイアス,$f : \Real^D \to \Real^D$ は活性化関数 (activation function) で,$\bm{W}_m \in \Real^{D \times D}$ は次のように定義される重み行列である.

上の式から解るように,RNN の出力 $\bm{y}$ は子のベクトル $\bm{x}_1, \dots, \bm{x}_M$ の情報を,ある程度含んでいるはずである.ただし, 入力は $M$ 個の $D$ 次元ベクトルであるのに対して,出力は $D$ 次元ベクトルが1つだけなので, データ量は減少している.これは,入力の情報を「圧縮」していると見ることができる. 圧縮ということは,その逆の「解凍」を考えることもできる.模式図で表すと,次の図のような感じ.

![RAE のモデル](/img/RAE-model.png)

上の2層 RNN が RAE である.エンコーダ(第一層)は先程紹介した RNN であり,情報の圧縮を担当する. デコーダ(第二層)はその逆で,エンコーダの出力を解凍して,元の入力(らしきもの)を復元する (残念ながら非可逆圧縮なので,完全に入力を復元することはできない). 機械学習の文脈では,ここで言う「圧縮」のことを次元削減 (dimensionality reduction), 「解凍」のことを再構築 (reconstruction) と呼ぶ. 再構築では,以下の式により,$\bm{y}$ から $\bm{x}_1’, \dots, \bm{x}_M’$ を復元する.

ただし,$\bm{b}’$ はバイアス,$g$ は活性化関数で, $\bm{W}_m’$ は次のように定義される重み行列である.

モデルによっては,$f = g$ にしたりする. また,tied weight といって,$\bm{W}_m’ = \bm{W}_m^\top$ とすることもある. これは,パラメータ数を減らし,正則化のような効果を生むらしい(ただし,精度向上に繋がるかは場合による).

Unfolding recursive autoencoder

RAE では,直近の子の特徴ベクトルを圧縮することで,親の特徴ベクトルを計算する. しかし,一般的に,構文木の高さが1とは限らず,実用上は,より深い構造を持つ構文木のほうが多い. 直近の子だけでなく,孫やひ孫のようなより深い位置にあるノードまで考慮したい. 最終的には,根から葉に至るまで,構文木に属する全てのノードを考慮して,次元削減を行いたい.

そんな欲望に応えてくれるのが,unfolding RAE である. Unfolding RAE は,下の図のように,RAE で用いていたエンコーダとデコーダをそれぞれ多層に積み上げたような形になっている.

![Unfolding recursive autoencoder](/img/UnfoldingRAE.png)

エンコーダーでは,葉に対応する特徴ベクトルを圧縮して,親の特徴ベクトルを求め,さらにそれを圧縮して・・・, という作業を再帰的に繰り返すことで,最終的に根の特徴ベクトルを得る.数式で書くと,

\begin{align} \bm{y}_1 & = f\left( \bm{W}_1 \bm{x}_1 + \bm{W}_2 \bm{x}_2 + \bm{b} \right), \
\bm{y}_2 & = f\left( \bm{W}_1 \bm{y}_1 + \bm{W}_2 \bm{x}_3 + \bm{b} \right). \end{align
}

デコーダでは,その作業を逆向きに行うことで,葉の特徴ベクトル(らしきもの)を再構築する.

\begin{align} \bm{y}_1’ & = g\left( \bm{W}_1’ \bm{y}_2 + \bm{b}’ \right), & \bm{x}_3’ & = g\left( \bm{W}_2’ \bm{y}_2 + \bm{b}’ \right), \
\bm{x}_1’ & = g\left( \bm{W}_1’ \bm{y}_1’ + \bm{b}’ \right), & \bm{x}_2’ & = g\left( \bm{W}_2’ \bm{y}_1’ + \bm{b}’ \right). \end{align
}

RAE による事前学習

[So11-2] では unfolding RAE の事前学習として RAE を利用している. つまり,予めパラメータの良い初期値を RAE により求めておくことで, unfolding RAE の訓練 (fine-tuning) が良い局所最適解に到達しやすくなる. RAE による事前学習は,貪欲法 (greedy algorithm) と似たようなアイディアに基づいており, 次の図のように,層ごとに,入力を上手く復元できるような最適なパラメータを求める.

![RAE を木に適用](/img/RAE-for-tree.png)
  1. まず,入力 $\bm{x}_1, \bm{x}_2$ に対して,RAE を適用し,出力 $\bm{y}_1$ と再構築したベクトル $\bm{x}_1’, \bm{x}_2’$ を得る.
  2. 次に,$\bm{y}_1, \bm{x}_3$ を入力として RAE に与え,出力 $\bm{y}_2$ と再構築したベクトル $\bm{y}_1’, \bm{x}_3’$ を得る.

RAE の訓練では,入力ベクトルの情報を復元できるように,つまり, $\bm{x}_m \approx \bm{x}_m’$ ($m=1,2,\dots,M$) となるように, 適切なパラメータを求める必要がある. そこで,次の再構築誤差 (reconstruction error) を確率的勾配降下法で最小化する.

直感的に,$\beta_m$ は,$m$ 番目の特徴ベクトルが持つ情報量のようなものを表している. ここで言う情報量とは,ある特徴ベクトルが(元々)いくつの特徴ベクトルを圧縮して作られたのか,ということを表している. 一般的に,ある子の特徴ベクトルは孫・ひ孫,ひいてはその子に下に存在する全ての葉の特徴ベクトルを圧縮して作られたものなので, より多くの葉を持つ子の特徴ベクトルは,より多くの情報を含んでいると考えられる. 例えば,上の図において,$\bm{y}_1$ は $\bm{x}_1$ と $\bm{x}_2$ を圧縮して作られたので, 特徴ベクトル2個分の情報を含んでいる.それに対して,$\bm{x}_3$ は自分自身の情報しか含んでいないので, $\bm{y}_1$ は $\bm{x}_3$ の2倍の情報を含んでいる. ここで,再構築誤差 $\|\bm{y}_1’ - \bm{y}_1\|^2$ が大きくなると, $\bm{x}_1$ と $\bm{x}_2$ の両方に影響が出るが, $\|\bm{x}_3’ - \bm{x}_3\|^2$ が大きくなっても $\bm{x}_3$ 自身にしか影響が出ない. つまり,情報量が多いと,再構築誤差の影響がより多くのノードに及ぶ. そこで,再構築誤差を情報量 $\beta_m$ で重み付けすることで,情報量が多いノードを重視している.

Unfolding RAE の訓練 (fine-tuning)

RAE でパラメータの良い初期値を求めた後は,unfolding RAE 全体を通して,fine-tuning を行う. RAE と同様に,Unfolding RAE も非可逆圧縮なので,葉の特徴ベクトルを完全に復元できる保証はない. しかし,葉の特徴ベクトル $\bm{x}_i$ ($i=1,\dots,N$) について, $\bm{x}_i \approx \bm{x}_i’$ であるような $\bm{x}_i’$ が復元できて欲しい. そこで,次の再構築誤差 (reconstruction error) を確率的勾配降下法で最小化する.

ここでは,$\bm{x}_i$ は全て葉の特徴ベクトルであるので,$\beta_m$ による重み付けは不要である. Unfolding RAE の訓練は backpropagation through structure (BPTS) で行う.

参考文献

次回予告

RAE と unfolding RAE の訓練を行うための backpropagation の式を紹介する予定