为什么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)))

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坚持原来的数学公式,并分别存储CCD_ 9和CCD_。Keras没有;它只存储CCD_ 11。这就是为什么cuDNN的LSTM比Keras有更多的参数。

最新更新