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
を下記のように演算します。:
ただし、 σσは要素ごとのシグモイド関数。この関数は c
と h
をタプルとして返します。
Parameters: |
|
---|---|
Returns: |
2つの |
Return type: |
詳細はこちらの論文でお読みください: Long Short-Term Memory Over Tree Structures.
Example
c1
、c2
は子ノードの以前のセル状態であり、 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を演算することに相当します。異なる入力ソースには異なるパラメータが用いられます。