Что такое num_unit в ячейке LSTM?

Я очень старался искать везде, но не смог найти, что такое num_units в TensorFlow на самом деле. Я попытался связать свой вопрос с этим вопросом, но не смог т получить четкое объяснение там.


В TensorFlow при создании RNN на основе LSTM мы используем следующую команду

cell = rnn.BasicLSTMCell(num_units=5, state_is_tuple=True)

Как говорится в блоге Колаха, это базовая ячейка LSTM:

введите описание изображения здесь

Теперь предположим, что мои данные:

idx2char = ['h', 'i', 'e', 'l', 'o']

# Teach hello: hihell -> ihello
x_data = [[0, 1, 0, 2, 3, 3]]   # hihell
x_one_hot = [[[1, 0, 0, 0, 0],   # h 0
              [0, 1, 0, 0, 0],   # i 1
              [1, 0, 0, 0, 0],   # h 0
              [0, 0, 1, 0, 0],   # e 2
              [0, 0, 0, 1, 0],   # l 3
              [0, 0, 0, 1, 0]]]  # l 3

y_data = [[1, 0, 2, 3, 3, 4]]    # ihello

Мой ввод:

x_one_hot = [[[1, 0, 0, 0, 0],   # h 0
              [0, 1, 0, 0, 0],   # i 1
              [1, 0, 0, 0, 0],   # h 0
              [0, 0, 1, 0, 0],   # e 2
              [0, 0, 0, 1, 0],   # l 3
              [0, 0, 0, 1, 0]]]  # l 3

который имеет форму [6,5].

В этом блоге у нас есть следующая картинка

введите описание изображения здесь

Насколько я знаю, BasicLSTMCell развернется за t временных шагов, где t - это мое количество строк (пожалуйста, поправьте меня, если я ошибаюсь!). Например, на следующем рисунке LSTM разворачивается на t = 28 временных шагов.

введите описание изображения здесь

В блоге Колы написано

каждая строка несет целый вектор

Итак, давайте посмотрим, как моя входная матрица [6,5] будет проходить через эту RNN на основе LSTM.

введите описание изображения здесь

Если моя приведенная выше диаграмма верна, то что такое num_units (которое мы определили в ячейке LSTM)? Является ли это параметром ячейки LSTM?

Если num_unit является параметром одной ячейки LSTM, то это должно быть что-то вроде:

введите описание изображения здесь

введите описание изображения здесь

Если приведенная выше диаграмма верна, то где эти 5 num_units в следующем схематическом представлении ячейки LSTM (согласно блогу Кола)?

введите описание изображения здесь


Если бы вы могли дать свой ответ с цифрой, это было бы очень полезно! Вы можете редактировать или создать новую диаграмму доски здесь.


person Aaditya Ura    schedule 11.03.2018    source источник


Ответы (1)


Ваше понимание вполне правильное. Однако, к сожалению, существует несоответствие между терминологией Tensorflow и литературой. Чтобы понять, вам нужно покопаться в коде реализации Tensorflow.

ячейка во вселенной Tensorflow называется слоем LSTM во вселенной Кола (т. е. развернутой версией). Вот почему вы всегда определяете одну ячейку, а не слой в своей архитектуре Tensorflow. Например,

cell=rnn.BasicLSTMCell(num_units=5,state_is_tuple=True)

Проверьте код здесь.

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L90

Определение ячейки в этом пакете отличается от определения, используемого в литературе. В литературе ячейка относится к объекту с одним скалярным выходом. Определение в этом пакете относится к горизонтальному массиву таких единиц.

Поэтому, чтобы понять num_units в Tensorflow, лучше всего представить развернутый LSTM, как показано ниже.

введите здесь описание изображения

В развернутой версии у вас есть вход X_t, который является тензором. Когда вы указываете вход формы

[batch_size, time_steps, n_input]

в Tensorflow, он знает, сколько раз его нужно развернуть, исходя из вашего параметра time_steps.

Таким образом, если у вас есть X_t в виде одномерного массива в TensorFlow, то в развернутой версии Colahs каждая ячейка LSTM x_t становится скалярным значением (обратите внимание на заглавную букву X (vector/ массив) и малый регистр x (скаляр) - также в цифрах Кола)

Если у вас есть X_t в качестве 2D-массива в Tensorflow, то в развернутой версии Colahs каждая ячейка LSTM x_t становится 1D-массивом/вектором (как в вашем случае здесь) и скоро.

А теперь самый главный вопрос.

Как Tensorflow узнает, что такое выходное/скрытое измерение ** Z_t/H_t?

(Обратите внимание на разницу между H_t и Z_t — я обычно предпочитаю держать их отдельно, так как H_t возвращается к входу (циклу), а Z_t — это выход — не показано на рисунке)

Будет ли это тот же размер, что и X_t?

Нет. Форма может быть любой. Вам нужно указать его в Tensorflow. И это num_units – выходной размер.

Проверьте здесь в коде:

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L298-L300

    @property
    def output_size(self):
        return self._num_units

Tensorflow использует реализацию ячейки LSTM, как определено во вселенной Colahs, из следующей статьи:

https://arxiv.org/pdf/1409.2329.pdf

person user1302884    schedule 15.03.2018