Вопрос или проблема
Я изучаю Keras и LSTM и наткнулся на этот учебник, но не понимаю размерности целевой переменной. Цитируя статью ниже:
Данные y для обучения в данном случае – это слова ввода x, смещенные на один временной шаг, – другими словами, на каждом временном шаге модель пытается предсказать следующее слово в последовательности. Однако это происходит на каждом временном шаге – следовательно, выходной слой имеет такое же количество временных шагов, как и входной слой.
Чтобы сделать это немного яснее, рассмотрим следующее предложение:
“Кошка села на коврик и съела свою шляпу. Затем он встал и сплюнул”
Если num_steps установлено на 5, данные, которые будут использоваться в качестве входных данных для данного примера, будут “Кошка села на коврик”. В этом случае, поскольку мы предсказываем следующее слово в последовательности через нашу модель, для каждого временного шага соответствующие выходные данные y или целевые данные будут “села на коврик”.
Статья затем показывает следующий код для генерации батчей:
def generate(self):
x = np.zeros((self.batch_size, self.num_steps))
y = np.zeros((self.batch_size, self.num_steps, self.vocabulary))
while True:
for i in range(self.batch_size):
if self.current_idx + self.num_steps >= len(self.data):
# сбросить индекс обратно в начало набора данных
self.current_idx = 0
x[i, :] = self.data[self.current_idx:self.current_idx + self.num_steps]
temp_y = self.data[self.current_idx + 1:self.current_idx + self.num_steps + 1]
# преобразовать все temp_y в представление one hot
y[i, :, :] = to_categorical(temp_y, num_classes=self.vocabulary)
self.current_idx += self.skip_step
yield x, y
Я понимаю, что модель пытается предсказать следующее слово, и я понимаю, что размерности x
равны self.batch_size, self.num_steps
, но я не понимаю размерности y
: self.batch_size, self.num_steps, self.vocabulary
. Почему не просто self.batch_size, self.vocabulary
? Возможно, я неправильно понял статью, но я думал, что каждая запись в батче соответствует разному временной шагу, или, по крайней мере, я бы так предположил для любой другой модели, не относящейся к LSTM. Keras автоматически разворачивает выход y
, потому что это связано с LSTM?
Если num_steps установлено на 5, данные, которые будут использоваться в качестве входных данных для данного примера, будут “Кошка села на коврик”. В этом случае, поскольку мы предсказываем следующее слово в последовательности через нашу модель, для каждого временного шага соответствующие выходные данные y или целевые данные будут “села на коврик”.
В этом примере y
– это последовательность слов с длиной num_steps
, начинающаяся с самого следующего слова. Входные и выходные данные обе имеют длину num_steps
.
Keras возвращает последовательность для выхода, когда return_sequences
равно True. https://keras.io/layers/recurrent/#lstm
return_sequences: Логическое значение. Указывает, следует ли возвращать последний выход в выходной последовательности или всю последовательность.
В общем, вход данных в LSTM имеет размерности (batch, time, features). Размерность батча не должна зависеть от времени. Выход может быть либо последовательностью, либо одним числом, что в Keras обрабатывается с помощью return_sequences
.
Ответ или решение
Вопрос, который вы подняли, касается размерностей целевой переменной (y) в модели LSTM, реализованной в Keras, и является важным аспектом при работе с последовательными данными. Давайте подробнее разберем, почему целевая переменная имеет такие размерности, а также как это связано с архитектурой LSTM.
Размерности входных и выходных данных
Как вы уже упомянули, входные данные (x) имеют размерности (self.batch_size, self.num_steps)
, где:
- self.batch_size — количество последовательностей (примеров) в одном батче,
- self.num_steps — длина последовательности, то есть количество временных шагов.
Теперь для целевой переменной (y) у нас размерности (self.batch_size, self.num_steps, self.vocabulary)
. Давайте разберем, что это означает:
- self.batch_size — это по-прежнему количество примеров в батче, как и в x.
- self.num_steps — число временных шагов. Каждый временной шаг соответствует одному предсказанному слову, которое мы хотим получить на выходе модели.
- self.vocabulary — количество уникальных слов в вашем словаре. Это необходимо для представления каждого слова в виде one-hot вектора.
Почему y имеет размерность (self.batch_size, self.num_steps, self.vocabulary)
В случае работы с LSTM, мы моделируем задачу предсказания последовательности. На каждом временном шаге модель пытается предсказать следующее слово на основе входной последовательности. Поскольку мы хотим предсказать слово для каждого временного шага, нам нужно хранить предсказания для всех num_steps
.
Таким образом, для каждого из self.num_steps
у вас есть вектор, который показывает вероятности (или одноразовое представление) всех слов в словаре для данного временного шага. Поэтому выходные данные (y) имеют размерности (self.batch_size, self.num_steps, self.vocabulary)
.
Работа с return_sequences
В Keras, параметр return_sequences
в слоях LSTM управляет тем, будет ли возвращаться полная последовательность выходов (то есть все временные шаги) или только последний выход. Когда return_sequences=True
, LSTM будет возвращать выходы для каждого временного шага с размерностями (self.batch_size, self.num_steps, номер_особенности)
, где номер_особенности — это количество представлений для вашего предсказания (например, количество классов в задаче классификации).
Заключение
Итак, для вашей задачи предсказания текста, размерность целевой переменной y в форме (self.batch_size, self.num_steps, self.vocabulary)
является стандартной и обусловлена тем, что нам нужно предсказать слово на каждом временном шаге, сохраняя вероятности для всех слов в словаре. Keras не "разматывает" выходные данные автоматически без конфигурации return_sequences
, и вам нужно гарантировать, что настройки вашего слоя правильно отражают ваши требования к выходным данным.
Если у вас остались дополнительные вопросы или необходимость в пояснениях, пожалуйста, не стесняйтесь задавать их!