Понимание модели Seq2Seq

вот мое понимание базовой последовательности для последовательности LSTMs. Предположим, мы имеем дело с установкой "вопрос-ответ".

У вас есть два набора LSTMs (зеленый и синий ниже). Каждый набор весов соответственно (т. е. каждая из 4 зеленых ячеек имеет одинаковый вес и аналогично с синими ячейками). Первый-это много к одному LSTM, который резюмирует вопрос на последнем скрытом слое / ячейке памяти.

второй набор (синий) - это много для многих LSTM, который имеет разные веса для первого набора LSTMs. Входной сигнал просто предложение ответа пока выход такое же предложение перенесенное одним.

вопрос в два раза: 1. Мы проходим последнее скрытое состояние только к синему LSTMs как начальное скрытое состояние. Или это последнее скрытое состояние и ячейка памяти. 2. Есть ли способ установить начальное скрытое состояние и память ячейки в Keras или Tensorflow? Если так ссылка?

http://suriyadeepan.github.io/img/seq2seq/seq2seq2.png (Изображение взято из suriyadeepan.гитуб.io)

2 ответов


  1. мы передаем последнее скрытое состояние только синим 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.

  1. есть ли способ установить начальное скрытое состояние и память ячейки в Keras или Tensorflow? Если да, то ссылка?

TensorFlow

просто укажите начальное состояние LSTMCell при вызове. Например, в официальный учебник RNN:

lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
...
    output, state = lstm(current_batch_of_words, state)

есть еще


(Edit: этот ответ является неполным и не учитывает фактические возможности передачи состояния. См. принятый ответ).

С Керрас точка зрения, что картина имеет только два слоя.

  • зеленая группа - это один слой LSTM.
  • синяя группа-это еще один слой LSTM.

нет никакой связи между зеленым и синим другие передачи результатов. Итак, ответ на 1 есть:

  1. только вектор мысли (который является фактическим выходом слоя) передается на другой слой.

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

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

в керасе это так:

enter image description here

легко, у вас есть доступ только к внешним стрелкам (включая "вектор мысли").
Но иметь доступ к каждому шагу (каждому отдельному зеленому блоку на вашей картинке) не является открытой вещью. Так...

  1. передача состояний из одного слоя к другому также не ожидается в водоснабжении. Вам, вероятно, придется взломать вещи. (См. это:https://github.com/fchollet/keras/issues/2995)

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

единственное понятие, которое вы имеете от шагов:

  • вы должны вводить вещи в форме (sentences, length, wordIdFeatures)

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

вы можете выбрать, чтобы иметь один выход (sentences, cells), для которого вы полностью теряете след шагов. Или...

  • выходы как (sentences, length, cells), из которого вы знаете выход каждого блока через измерение длины.

один ко многим или многие ко многим?

Теперь первый слой много к одному (но ничего предотвращает его от многих до многих, если хотите).

но второй... это сложно.

  • если вектор мысли был сделан многими к одному. Вам придется управлять способом создания одного ко многим. (Это не тривиально в keras, но вы можете подумать о повторении вектора мысли для ожидаемой длины, что делает его входным для всех шагов. Или, может быть, заполнить всю последовательность нулями или единицами, сохраняя только первый элемент в качестве мысли вектор)
  • если вектор мысли был сделан многими ко многим, вы можете воспользоваться этим и сохранить легкое много ко многим, если вы готовы принять, что выход имеет точно такое же количество шагов, как и вход.

Keras не имеет готового решения для 1 для многих случаев. (Из одного ввода предсказать целую последовательность).