У меня проблемы с реализацией механизма внимания Богданау в пользовательской архитектуре seq2seq (кодер-декодер).До сих пор я достиг этой точки:
# all variables are of shape (unrollings, batch_size, hidden_size)
merged_states = []
for i in range(len(encoder_hidden_states)):
merged_states.append(tf.concat([encoder_hidden_states[i], prev_decoder_hidden_state], axis=1))
eij = tf.layers.dense(tf.convert_to_tensor(merged_states), encoder_hidden_states[0].shape[1], activation='tanh')
softmax = tf.nn.softmax(eij, dim=0)
context = tf.reduce_sum(tf.multiply(softmax, encoder_hidden_states), axis=0)
В статье упоминается, что функция счета представляет собой однослойную сеть, но я видел, как другие использовали: эту формулу .Из моего понимания кода выше следует реализовать последнюю часть уравнения без умножения на v. У меня есть несколько вопросов здесь:
- Какого размера должен быть вектор v и почему он требуется?
- После того, как я вычислил новый контекст, покажите, должен ли он передаваться в декодер?Из того, что я видел, люди объединяют текущий ввод (предыдущий вывод декодера с контекстом), и это будет новый ввод декодера.
Заранее спасибо.