我一直在尝试计算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_i
和b_r
(,而只需要存储一个矢量(b
(。
cuDNN坚持原来的数学公式,并分别存储CCD_ 9和CCD_。Keras没有;它只存储CCD_ 11。这就是为什么cuDNN的LSTM比Keras有更多的参数。