Почему у CuDNNLSTM больше параметров, чем у LSTM в кератах? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытался вычислить количество параметров в ячейке 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 доступно по всему inte rnet. Тем не менее, 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)))


1 Ответ

0 голосов
/ 25 февраля 2020

Параметры 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 с исходная математическая формулировка и b_i и b_r хранятся отдельно. Керас нет; это только хранит b. Вот почему LSTM cuDNN имеет больше параметров, чем Keras.

...