Понимание состояния LSTM

Я просматриваю этот учебник по RNNs/LSTM, и мне очень трудно понять состояние LSTM с точки зрения состояния. Мои вопросы таковы:

1. Размер дозирования для обучения

В документах Keras на RNN я выяснил, что скрытое состояние образца в i -ой позиции в партии подаваться как входное скрытое состояние для образца в i -й позиции в следующей партии. Означает ли это, что если мы хотим передать скрытое состояние из образца в образец, мы должны использовать партии размером 1 и, следовательно, выполнять онлайн-градиентный спуск? Есть ли способ передать скрытое состояние в партии размером > 1 и выполнить спуск градиента на этой партии?

2. One- Char Проблемы с отображением

В параграфе "Условный LSTM для One- Char to One- Char Отображение" был предоставлен код, который использует batch_size = 1 и stateful = True, чтобы научиться предсказывать следующую букву алфавита с учетом буква алфавита. В последней части кода (строка 53 до конца полного кода) модель тестируется, начиная со случайной буквы ( "K" ) и предсказывает "B", после чего "B" предсказывает "C" и т.д. Кажется, что он хорошо работает, за исключением "K" . Тем не менее, я попробовал следующую настройку кода (последняя часть тоже поддерживала строки 52 и выше):

    # demonstrate a random starting point
    letter1 = "M"
    seed1 = [char_to_int[letter1]]
    x = numpy.reshape(seed, (1, len(seed), 1))
    x = x / float(len(alphabet))
    prediction = model.predict(x, verbose=0)
    index = numpy.argmax(prediction)
    print(int_to_char[seed1[0]], "->", int_to_char[index])
    letter2 = "E"
    seed2 = [char_to_int[letter2]]
    seed = seed2
    print("New start: ", letter1, letter2)
    for i in range(0, 5):
        x = numpy.reshape(seed, (1, len(seed), 1))
        x = x / float(len(alphabet))
        prediction = model.predict(x, verbose=0)
        index = numpy.argmax(prediction)
        print(int_to_char[seed[0]], "->", int_to_char[index])
        seed = [index]
    model.reset_states()

and these outputs:

    M -> B
    New start: M E
    E -> C
    C -> D
    D -> E
    E -> F

It looks like the LSTM did not learn the alphabet but just the positions of the letters, and that regardless of the first letter we feed in, the LSTM will always predict B since it the second letter, then C and so on.

Поэтому, как сохранение предыдущего скрытого состояния в качестве начального скрытого состояния для текущего скрытого состояния помогает нам в обучении, учитывая, что во время теста, если мы начнем с буквы "K" , например, буквы A-J не будут раньше, а начальное скрытое состояние не будет таким же, как во время обучения?

3. Подготовка LSTM к книге для генерации предложений

Я хочу обучить свой LSTM всей книге, чтобы узнать, как генерировать предложения и, возможно, изучать стиль авторов, как я могу, естественно, обучить LSTM этому тексту (ввести весь текст и позволить LSTM определить зависимости между словами) вместо того, чтобы "искусственно" создавать партии предложений из этой книги, чтобы обучать мой LSTM? Я считаю, что я должен использовать устаревшие LSTM, но я не уверен, как это сделать.

Ответ 1

  • Наличие LSTM с сохранением состояния в Keras означает, что переменная Keras будет использоваться для хранения и обновления состояния, и на самом деле вы можете проверить значение вектора состояния в любое время (то есть до вы вызываете reset_states()). С другой стороны, не-stateful модель будет использовать начальное нулевое состояние каждый раз, когда обрабатывает пакет, так что вы всегда называете reset_states() после train_on_batch, test_on_batch и predict_on_batch. Объяснение о том, что государство будет повторно использоваться для следующей партии на моделях с учетом состояния, - это только различие с неконфессиональными; конечно, состояние всегда будет проходить внутри партии, и вам не нужно иметь партии размером 1 для того, чтобы это произошло. Я вижу два сценария, в которых полезны модели с сохранением состояния:

    • Вы хотите тренироваться на разделенных последовательностях данных, потому что они очень длинные, и было бы нецелесообразно тренироваться по всей их длине.
    • Во время прогнозирования вы хотите получить вывод для каждой временной точки в последовательности, а не только в конце (либо потому, что вы хотите вернуть ее в сеть, либо потому, что это необходимо вашему приложению). Я лично делаю это в моделях, которые я экспортирую для последующей интеграции (которые являются "копиями" учебной модели с размером партии 1).
  • Я согласен, что пример RNN для алфавита на самом деле не очень полезен на практике; он будет работать только тогда, когда вы начинаете с буквы A. Если вы хотите научиться воспроизводить алфавит, начинающийся с любой буквы, вам нужно будет обучить сеть такими примерами (подпоследовательности или вращения алфавита). Но я думаю, что регулярная сеть по пересылке может научиться предсказывать следующую букву обучения алфавитом на таких парах, как (A, B), (B, C) и т.д. Я думаю, что этот пример предназначен для демонстрационных целей больше всего на свете.

  • Возможно, вы, вероятно, уже прочитали его, но популярный пост Неоправданная эффективность повторяющихся нейронных сетей показывает некоторые интересные результаты по строки того, что вы хотите сделать (хотя на самом деле это не особенно важно для реализации). У меня нет личного опыта обучения RNN с текстовыми данными, но есть ряд подходов, которые вы можете исследовать. Вы можете создавать персональные модели (например, те, что находятся в сообщении), где вы вводите и получаете по одному символу за раз. Более продвинутый подход - сделать некоторую предварительную обработку текстов и преобразовать их в последовательности чисел; Keras включает в себя некоторые функции предварительной обработки текста. Наличие одного номера в качестве пространства возможностей, вероятно, не будет работать так хорошо, поэтому вы можете просто превратить каждое слово в вектор с одним горячим кодированием или, что более интересно, чтобы сеть узнала наилучшее векторное представление для каждого, что это то, что они называют en embedding. Вы можете пойти еще дальше с предварительной обработкой и посмотреть на что-то вроде NLTK, особенно если вы хотите удалить стоп-слова, знаки препинания и тому подобное, Наконец, если у вас есть последовательности разных размеров (например, вы используете полные тексты вместо выдержек фиксированного размера, которые могут или не могут быть важны для вас), вам нужно быть более осторожным и использовать masking и/или примерный вес. В зависимости от конкретной проблемы вы можете соответствующим образом настроить обучение. Если вы хотите научиться генерировать похожий текст, "Y" будет похож на "X" (однострочный кодированный), только сдвинутый на одну (или более) позицию (в этом случае вам может понадобиться использовать return_sequences=True и TimeDistributed layers). Если вы хотите определить автора, ваш результат может быть softmax Dense layer.

Надеюсь, что это поможет.