dynamic_lstmp
API属性:声明式编程(静态图)专用API
( input, size, proj_size, param_attr=None, bias_attr=None, use_peepholes=True, is_reverse=False, gate_activation=’sigmoid’, cell_activation=’tanh’, candidate_activation=’tanh’, proj_activation=’tanh’, dtype=’float32’, name=None, h_0=None, c_0=None, cell_clip=None, proj_clip=None ) [源代码]
注解
在实现的时候为了提升效率,用户必须将输入先进行线性映射,将维度为 [T, hidden_size] 的输入映射为 [T, 4×hidden_size] 输入,然后再传给该OP。
该OP实现了LSTMP(LSTM Projected)层。LSTMP层在LSTM层之后有一个单独的的线性映射层。 — 。
与标准的LSTM层相比,LSTMP多出来的线性映射层,用于从原始隐藏状态
映射到较低维的状态
, 从而减少参数总数和计算复杂度,特别是输出单元相对较大的情况下。
该OP的默认实现方式为 diagonal/peephole 连接,参见 Gers, F. A., & Schmidhuber, J. (2000)。 如果需要禁用 peephole 连接方法,将 use_peepholes 设为 False 即可。
该OP对于序列中每一个时间步的计算公式如下:
公式中的概念信息如下:
表示时间步
的输入
表示时间步
的 hidden 状态
: 隐藏状态循环的映射输出的状态
-
分别表示前一个时间步的 hidden 状态,cell 状态和循环映射输出状态
表示候选的 cell 状态
-
,
和
分别为 input gate,forget gate,output gate
-
表示 weight (例如,
是在计算 input gate
时,对输入
做线性变换的 weight)
-
表示 bias (例如,
是 input gate 的 bias)
-
表示 gate 的非线性激活函数,默认为 sigmoid
分别表示 cell 输入 cell 输出和映射输出的非线性激活函数,默认为 tanh
-
表示矩阵的 Hadamard product,即对两个维度相同的矩阵,将相同位置的元素相乘,得到另一个维度相同的矩阵
经过lstmp运算输出的 hidden 的映射和 cell 状态的tuple,包括
cell:LSTM cell的输出结果,维度为
的LoDTensor,且LoD保持与输入一致,数据类型与input一致。
import paddle.fluid as fluid
dict_dim, emb_dim = 128, 64
data = fluid.layers.data(name='sequence', shape=[1],
dtype='int32', lod_level=1)
emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim])
fc_out = fluid.layers.fc(input=emb, size=hidden_dim * 4,
act=None, bias_attr=None)
proj_out, cell = fluid.layers.dynamic_lstmp(input=fc_out,
size=hidden_dim * 4,
proj_size=proj_dim,
is_reverse=True,
cell_activation="tanh",
proj_activation="tanh")
proj_out.shape # (-1, 256)
cell.shape # (-1, 512)