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}}\)、入力シグナルをl \(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のソース
次に、出力を下記のように計算します。:
これらは、 (N + 1) variableのタプルとして返します。
Parameters: |
inputs (list of Variable ) – 全てのセルの子ノードからのベクトルと入力ベクトルを含むVariable
引数。それぞれのセルベクトルと入力ベクトルは Variable . 入力ベクトルは各セルのサイズが(N + 3) 倍の第2軸を持たなければならない。この N はセルの総数を示す。
|
---|---|
Returns: |
2つの Variable オブジェクト c と h 。c は更新されたセル状態。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
子の出力 h1
とh2からの以前の出力シグナルから、入力ソース
\(a, i, o, f_{\text{1}}, f_{\text{2}}\)を演算することに相当します。異なる入力ソースには異なるパラメータが用いられます。