2017-02-15 21 views
2

Я хотел бы подготовить модель для генерации текста, похожей на this blog postKeras - Как использовать уровень встроенного ввода() для ввода и вывода?

Эта модель использует - насколько я понимаю - следующая архитектуру
[Последовательность слов индексов] -> [Вложение] -> [ LSTM] -> [1 Hot Encoded "next word"]

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


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

В основном:

[Последовательность слов индексов] -> [Вложение] -> [LSTM] -> [Встраивание-Вектор "следующего слова"]

Моя проблема заключается, как модель изучает вложения «на лету», как я могу подавать вывод так же, как я подаю вход (как индексы слов), а затем просто говорю модель «Но прежде чем использовать выход, замените его вектором внедрения»?


Большое спасибо за всю помощь :-)

+0

Вы получили эту работу? Если это так, любые ссылки на код/​​блог (или даже самоответ) - правильно отмеченный ответ показывают только классификационный подход, а не регрессионный подход, который вы хотели сделать. –

ответ

1

В тренировочном этапе:

Вы можете использовать два входа (один для мишени, один для ввода, там смещение 1 между этими двумя последовательностями) и повторно использовать слой внедрения. Если вы вводите предложение [1, 2, 3, 4], вы можете создать из него две последовательности: in = [1, 2, 3], out = [2, 3, 4]. Затем вы можете использовать функциональный API Keras' для повторного вложения слой:

emb1 = Embedding(in) 
emb2 = Embedding(out) 
predict_emb = LSTM(emb1) 
loss = mean_squared_error(emb2, predict_emb) 

Примечание это не Keras код, просто псевдо-код.

В стадии тестирования:

Как правило, вы должны будете написать свою собственную функцию декодирования. Во-первых, вы выбираете слово (или несколько слов) для начала. Затем подайте это слово (или короткую последовательность слов) в сеть, чтобы предсказать вложение следующего слова. На этом этапе вы можете определить свою собственную функцию выборки, скажем: вы можете выбрать слово, вложение которого ближе всего к предсказанному как следующее слово, или вы можете захотеть пробовать следующее слово из дистрибутива, в котором слова с более близкие вложения к предсказанному вложению имеют большую вероятность выбора. Когда вы выберете следующее слово, подайте его в сеть и предскажите следующую, и так далее.

Итак, вам нужно сгенерировать одно слово (иначе говоря, одно вложение), а не вводить целую последовательность в сеть.

Если вышеприведенные утверждения слишком абстрактны для вас, вот хороший пример: https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

Line 85 является введение часть, которая случайным образом выбрать небольшой кусок текста из корпуса работать. В строке 90 есть цикл, в котором каждый шаг выбирает символ (это char-rnn, поэтому каждый timestep вводит символ.Для вашего случая это должно быть слово, а не символ): L95 прогнозирует распределение следующего символа, образцы L96 из дистрибутива. Надеюсь, это достаточно ясно.

+0

Большое спасибо, что имеет смысл для обучения! Но что делать во время выполнения? Когда я хочу предсказать «выход» и не подавать его в сеть? –

+0

Я обновил ответ. Надеюсь, поможет. – soloice

+0

Да, спасибо! –