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多出来的线性映射层,用于从原始隐藏状态

    映射到较低维的状态

    dynamic_lstmp - 图2

    , 从而减少参数总数和计算复杂度,特别是输出单元相对较大的情况下。

    该OP的默认实现方式为 diagonal/peephole 连接,参见 Gers, F. A., & Schmidhuber, J. (2000)。 如果需要禁用 peephole 连接方法,将 use_peepholes 设为 False 即可。

    该OP对于序列中每一个时间步的计算公式如下:

    dynamic_lstmp - 图4

    dynamic_lstmp - 图6

    dynamic_lstmp - 图8

    公式中的概念信息如下:

    • dynamic_lstmp - 图10

      表示时间步

      的输入

    • dynamic_lstmp - 图12

      表示时间步

      的 hidden 状态

    • dynamic_lstmp - 图14

      : 隐藏状态循环的映射输出的状态

    • 分别表示前一个时间步的 hidden 状态,cell 状态和循环映射输出状态

    • dynamic_lstmp - 图16

      表示候选的 cell 状态

    • dynamic_lstmp - 图19

      分别为 input gate,forget gate,output gate

    • 表示 weight (例如,

      dynamic_lstmp - 图21

      是在计算 input gate

      时,对输入

      dynamic_lstmp - 图23

      做线性变换的 weight)

    • 表示 bias (例如,

      dynamic_lstmp - 图25

      是 input gate 的 bias)

    • 表示 gate 的非线性激活函数,默认为 sigmoid

    • dynamic_lstmp - 图27

      分别表示 cell 输入 cell 输出和映射输出的非线性激活函数,默认为 tanh

    • 表示矩阵的 Hadamard product,即对两个维度相同的矩阵,将相同位置的元素相乘,得到另一个维度相同的矩阵

    经过lstmp运算输出的 hidden 的映射和 cell 状态的tuple,包括

    • cell:LSTM cell的输出结果,维度为

      dynamic_lstmp - 图38

      的LoDTensor,且LoD保持与输入一致,数据类型与input一致。

    1. import paddle.fluid as fluid
    2. dict_dim, emb_dim = 128, 64
    3. data = fluid.layers.data(name='sequence', shape=[1],
    4. dtype='int32', lod_level=1)
    5. emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim])
    6. fc_out = fluid.layers.fc(input=emb, size=hidden_dim * 4,
    7. act=None, bias_attr=None)
    8. proj_out, cell = fluid.layers.dynamic_lstmp(input=fc_out,
    9. size=hidden_dim * 4,
    10. proj_size=proj_dim,
    11. is_reverse=True,
    12. cell_activation="tanh",
    13. proj_activation="tanh")
    14. proj_out.shape # (-1, 256)
    15. cell.shape # (-1, 512)