首页 > 解决方案 > 为什么 CuDNNLSTM 在 keras 中比 LSTM 有更多的参数?

问题描述

我一直在尝试计算 Keras 中 LSTM 单元中的参数数量。我创建了两个模型,一个使用 LSTM,另一个使用 CuDNNLSTM。

模型的部分摘要如下

CuDNNLSTM 模型:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param # 
    =================================================================
    embedding (Embedding)        (None, None, 300)         192000
    _________________________________________________________________
    bidirectional (Bidirectional (None, None, 600)         1444800

LSTM 模型


    Layer (type)                 Output Shape              Param #
    =================================================================
    embedding_1 (Embedding)      (None, None, 300)         192000    
    _________________________________________________________________  
    bidirectional (Bidirectional (None, None, 600)         1442400

LSTM 中的参数数量遵循互联网上可用的 lstm 参数计算公式。然而,CuDNNLSTM 有 2400 个额外的参数。

这些额外参数的原因是什么?

代码

    import tensorflow.compat.v1 as tf
    tf.disable_v2_behavior()

    from tensorflow.compat.v1.keras.models import Sequential
    from tensorflow.compat.v1.keras.layers import CuDNNLSTM, Bidirectional, Embedding, LSTM

    model = Sequential()
    model.add(Embedding(640, 300))
    model.add(Bidirectional(<LSTM type>(300, return_sequences=True)))


标签: keraslstmbidirectional

解决方案


LSTM 参数可以分为 3 类:输入权重矩阵 (W)、循环权重矩阵 (R)、偏差 (b)。LSTM 单元计算的一部分是W*x + b_i + R*h + b_r输入b_i偏差和b_r循环偏差。

如果你让b = b_i + b_r,你可以将上面的表达式重写为W*x + R*h + b。这样一来,您就无需保留两个单独的偏置向量 (b_ib_r),而只需存储一个向量 ( b)。

cuDNN 坚持原始的数学公式,b_ib_r分别存储。Keras 没有;它只存储b。这就是为什么 cuDNN 的 LSTM 的参数比 Keras 多的原因。


推荐阅读