chainer.functions.slstm(c_prev1, c_prev2, x1, x2)[source]

活性化関数としてのS-LSTM units。

 

この関数はS-LSTM unitを実装しています。これは、木構造が用いられる LSTM unit の拡張です。

この関数は二分木に用いられます。(*訳注:入力が二分木ということ)。各ノードは。2つの子ノードを持ちます。これは、4つの引数を取得します。前回のセル状態 c_prev1 と c_prev2、そして入力配列 x1 と x2です。

はじめの2つの x1 と x2 は両方、8つの配列へ分割されます。a1,i1,f1,o1a1,i1,f1,o1, と a2,i2,f2,o2a2,i2,f2,o2です。これらは 第2軸に添って、同じ形(shape)になります。つまり x1 と x2 の第2軸は、c_prev1 と c_prev2.の4倍の長さでなければなりません。

 

分割された配列はそれぞれ、下記に相当します。:

  • aiai : sources of cell input
  • iiii : sources of input gate
  • fifi : sources of forget gate
  • oioi : sources of output gate

更新されたセル状態 c と出力シグナル  h を下記のように演算します。:

ch=tanh(a1+a2)σ(i1+i2)+cprev1σ(f1)+cprev2σ(f2),=tanh(c)σ(o1+o2),c=tanh⁡(a1+a2)σ(i1+i2)+cprev1σ(f1)+cprev2σ(f2),h=tanh⁡(c)σ(o1+o2),

ただし、 σσは要素ごとのシグモイド関数。この関数は c と h をタプルとして返します。

Parameters:
  • c_prev1 (Variable or numpy.ndarray or cupy.ndarray) – 1つ目の子ノードの以前のセルの状態を保持するVariable . セル状態は、ゼロ配列か、もしくは以前に呼び出されたLSTMの出力でなければならない。
  • c_prev2 (Variable or numpy.ndarray or cupy.ndarray) – 2つ目の子ノードの胃炎のセル状態を保持するVariable。
  • x1 (Variable or numpy.ndarray or cupy.ndarray) – 1つ目の子ノードからのcell input、input gate、 forget gate、 output gateのソースを保持するVariable。2番めの次元は、セル状態の4倍のサイズでなければならない。
  • x2 (Variable or numpy.ndarray or cupy.ndarray) –2つ目の子ノードからの入力ソースを持つ Variable。
Returns:

2つの Variable オブジェクト、 c と hc はセル状態、 h は出力シグナルを示す。

Return type:

tuple

詳細はこちらの論文でお読みください: Long Short-Term Memory Over Tree Structures.

 

Example

 

c1c2 は子ノードの以前のセル状態であり、 h1、 h2 は子ノードからの以前の出力シグナルであるとします。それぞれ c1、 c2、 h1 、 h2 は n_units チャンネルを持ちます。大多数の場合、 x1, x2 は、下記のように記述されます。:

 

>>> n_units = 100

>>> h1 = chainer.Variable(np.zeros((1, n_units), 'f'))
>>> h2 = chainer.Variable(np.zeros((1, n_units), 'f'))
>>> c1 = chainer.Variable(np.zeros((1, n_units), 'f'))
>>> c2 = chainer.Variable(np.zeros((1, n_units), 'f'))
>>> model1 = chainer.Chain()
>>> with model1.init_scope():
... model1.w = L.Linear(n_units, 4 * n_units)
... model1.v = L.Linear(n_units, 4 * n_units)
>>> model2 = chainer.Chain()
>>> with model2.init_scope():
... model2.w = L.Linear(n_units, 4 * n_units)
... model2.v = L.Linear(n_units, 4 * n_units)
>>> x1 = model1.w(c1) + model1.v(h1)
>>> x2 = model2.w(c2) + model2.v(h2)
>>> c, h = F.slstm(c1, c2, x1, x2)

 

これは入力配列 x1の演算、もしくは、1つ目の子ノード c1の以前のセル状態と1つ目の子ノード h1からの以前の出力シグナルから、入力ソースa1,i1,f1,o1a1,i1,f1,o1を演算することに相当します。異なる入力ソースには異なるパラメータが用いられます。