chainer.functions.tree_lstm(*inputs)[source]

活性化関数としてのTreeLSTM unit。

 

この関数は木構造でのLSTM units を N項のTreeLSTM と Child-Sum TreeLSTMの両方で実装しています。

子のセル状態を \(c_{\text{1}}, c_{\text{2}}, \dots, c_{\text{N}}\)、入力シグナルを\(x\) とします。

 

はじめに,入力シグナル\(x\) は第2軸に従う形(shape)の (3 + N) 配列\(a, i, o, f_{\text{1}}, f_{\text{2}}, ..., f_{\text{N}}\) に分割されます。つまり、 \(x\)の第2軸は、各 \(c_{n}\)の (3 + N) 倍の長さでなければなりません。

 

分割された入力シグナルは、下記に相当します。

  • \(a\) : sources of cell input
  • \(i\) : sources of input gate
  • \(o\) : sources of output gate
  • \(f_{n}\) : N番目の項のforget gateのソース

次に、出力を下記のように計算します。:

\[\begin{split}c &= \tanh(a) \text{sigmoid}(i) \\ & + c_{\text{1}} \text{sigmoid}(f_{\text{1}}), \\ & + c_{\text{2}} \text{sigmoid}(f_{\text{2}}), \\ & + ..., \\ & + c_{\text{N}} \text{sigmoid}(f_{\text{N}}), \\ h &= \tanh(c) \text{sigmoid}(o).\end{split}\]

これらは、 (N + 1) variableのタプルとして返します。

 

Parameters: inputs (list of Variable) – 全てのセルの子ノードからのベクトルと入力ベクトルを含むVariable 引数。それぞれのセルベクトルと入力ベクトルは Variable. 入力ベクトルは各セルのサイズが(N + 3) 倍の第2軸を持たなければならない。この N はセルの総数を示す。
Returns: 2つの Variable オブジェクト c と hc は更新されたセル状態。h は出力シグナルを示している。
Return type: tuple

 

詳細はこちらの論文をお読みください。

 

Tai らによる N項のTreeLSTM は、Bowman らのものを少し拡張してます。このLinkは Bowmanらによるvariantに基いています。具体的には、Taiらの論文中の方程式(10)では、一貫して全ての子のためにひとつのW行列だけが xに適用されます。一方で、, Bowmanらのモデルは、複数の行列を持ち、それぞれが子のセルのforget gateに個別に影響を与えます。

 

Example

 

y がカレントの入力シグナル、 c が以前のセル状態、そして  h が tree_lstm() 関数からの以前の出力シグナルとします。. それぞれの y、 c 、 h が n_units 個のチャンネルを持ちます。 2項 (バイナリ) TreeLSTMを用いる、最も一般的な x は


>>> model = chainer.Chain()
>>> with model.init_scope():
... model.w = L.Linear(10, 5 * 10)
... model.v1 = L.Linear(10, 5 * 10)
... model.v2 = L.Linear(10, 5 * 10)
>>> y = np.random.uniform(-1, 1, (4, 10)).astype('f')
>>> h1 = np.random.uniform(-1, 1, (4, 10)).astype('f')
>>> h2 = np.random.uniform(-1, 1, (4, 10)).astype('f')
>>> c1 = np.random.uniform(-1, 1, (4, 10)).astype('f')
>>> c2 = np.random.uniform(-1, 1, (4, 10)).astype('f')
>>> x = model.w(y) + model.v1(h1) + model.v2(h2)
>>> c, h = F.tree_lstm(c1, c2, x)

 

これは,入力ソースを計算することに相応します。カレントの入力y 子の出力 h1h2からの以前の出力シグナルから、入力ソース \(a, i, o, f_{\text{1}}, f_{\text{2}}\)を演算することに相当します。異なる入力ソースには異なるパラメータが用いられます。