Понимание модели Seq2Seq
вот мое понимание базовой последовательности для последовательности LSTMs. Предположим, мы имеем дело с установкой "вопрос-ответ".
У вас есть два набора LSTMs (зеленый и синий ниже). Каждый набор весов соответственно (т. е. каждая из 4 зеленых ячеек имеет одинаковый вес и аналогично с синими ячейками). Первый-это много к одному LSTM, который резюмирует вопрос на последнем скрытом слое / ячейке памяти.
второй набор (синий) - это много для многих LSTM, который имеет разные веса для первого набора LSTMs. Входной сигнал просто предложение ответа пока выход такое же предложение перенесенное одним.
вопрос в два раза: 1. Мы проходим последнее скрытое состояние только к синему LSTMs как начальное скрытое состояние. Или это последнее скрытое состояние и ячейка памяти. 2. Есть ли способ установить начальное скрытое состояние и память ячейки в Keras или Tensorflow? Если так ссылка?
2 ответов
- мы передаем последнее скрытое состояние только синим LSTMs в качестве начального скрытого состояния. Или это последнее скрытое состояние и память ячейки.
как в скрытом состоянии h
и сотовый передаются в декодер.
TensorFlow
на исходный код seq2seq, вы можете найти следующий код в basic_rnn_seq2seq()
:
_, enc_state = rnn.static_rnn(enc_cell, encoder_inputs, dtype=dtype)
return rnn_decoder(decoder_inputs, enc_state, cell)
если вы используете LSTMCell
, возвращенный enc_state
от кодировщика будет Кортеж (c, h)
. Как вы можете видеть, кортеж передается непосредственно декодеру.
Керрас
в Керасе" состояние " определено для LSTMCell
тоже кортежа!--11--> (обратите внимание, что порядок отличается от TF). В LSTMCell.call()
, вы можете найти:
h_tm1 = states[0]
c_tm1 = states[1]
чтобы получить Штаты, возвращенные из LSTM
слой, вы можете указать return_state=True
. Возвращаемое значение-кортеж (o, h, c)
. Тензор o
выход этого слоя, который будет равно h
если вы не укажете return_sequences=True
.
- есть ли способ установить начальное скрытое состояние и память ячейки в Keras или Tensorflow? Если да, то ссылка?
TensorFlow
просто укажите начальное состояние LSTMCell
при вызове. Например, в официальный учебник RNN:
lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
...
output, state = lstm(current_batch_of_words, state)
есть еще
(Edit: этот ответ является неполным и не учитывает фактические возможности передачи состояния. См. принятый ответ).
С Керрас точка зрения, что картина имеет только два слоя.
- зеленая группа - это один слой LSTM.
- синяя группа-это еще один слой LSTM.
нет никакой связи между зеленым и синим другие передачи результатов. Итак, ответ на 1 есть:
- только вектор мысли (который является фактическим выходом слоя) передается на другой слой.
память и состояние (не уверен, что это два разных объекта) полностью содержатся внутри одного слоя и изначально не предназначены для просмотра или совместного использования с любым другим слоем.
каждый отдельный блок на этом изображении полностью невидим в керасе. Они считаются "временными шагами", что-то, что отображается только в форме входных данных. Редко важно беспокоиться о них (за исключением очень продвинутых обычаев).
в керасе это так:
легко, у вас есть доступ только к внешним стрелкам (включая "вектор мысли").
Но иметь доступ к каждому шагу (каждому отдельному зеленому блоку на вашей картинке) не является открытой вещью. Так...
- передача состояний из одного слоя к другому также не ожидается в водоснабжении. Вам, вероятно, придется взломать вещи. (См. это:https://github.com/fchollet/keras/issues/2995)
но, учитывая вектор мысли достаточно большой, вы можете сказать, что он научится переносить то, что важно само по себе.
единственное понятие, которое вы имеете от шагов:
- вы должны вводить вещи в форме
(sentences, length, wordIdFeatures)
В шаги будут выполняться с учетом того, что каждый срез в измерении длины является входом для каждого зеленого блока.
вы можете выбрать, чтобы иметь один выход (sentences, cells)
, для которого вы полностью теряете след шагов. Или...
- выходы как
(sentences, length, cells)
, из которого вы знаете выход каждого блока через измерение длины.
один ко многим или многие ко многим?
Теперь первый слой много к одному (но ничего предотвращает его от многих до многих, если хотите).
но второй... это сложно.
- если вектор мысли был сделан многими к одному. Вам придется управлять способом создания одного ко многим. (Это не тривиально в keras, но вы можете подумать о повторении вектора мысли для ожидаемой длины, что делает его входным для всех шагов. Или, может быть, заполнить всю последовательность нулями или единицами, сохраняя только первый элемент в качестве мысли вектор)
- если вектор мысли был сделан многими ко многим, вы можете воспользоваться этим и сохранить легкое много ко многим, если вы готовы принять, что выход имеет точно такое же количество шагов, как и вход.
Keras не имеет готового решения для 1 для многих случаев. (Из одного ввода предсказать целую последовательность).