Как спроектировать выходной слой модели word-RNN с использованием вложения word2vec
Я пытаюсь создать Word-RNN-эквивалент Char-RNN, сеть должна генерировать следующее слово в предложении.
В качестве входных данных я использую предварительно обученные 100-мерные векторы word2vec, размер скрытого слоя равен 200. Моя основная проблема - выходной слой, как он должен быть спроектирован?
В char-rnn на выходе это вектор словарного размера (числа уникальных символов) с распределением вероятностей символов (softmax). Таким образом, генерирование следующего символа - это просто выборка из этого распределения. Но при использовании word2vec, когда мой словарный запас превышает 300 тыс., Такой подход невозможен.
Если мой вывод сгенерирует 100-димовый вектор, то я должен найти ближайшее похожее слово с использованием функции gensim Similar_by_vector
Не могли бы вы предоставить хорошую и простую для понимания реализацию на python и тензорном потоке, некоторую ссылку на github или публикацию.
Я нашел похожий вопрос, но он не отвечает на мой вопрос:
1 ответ
Вы можете вывести индекс слова (для каждого примера), избегая, таким образом, однозначного представления слова (которое действительно очень большое). использование tf.contrib.legacy_seq2seq.sequence_loss_by_example
:
Взвешенная кросс-энтропийная потеря для последовательности логитов (за пример).
- logits: список 2D тензоров формы [batch_size x num_decoder_symbols].
- цели: список 1-мерных тензоров серии32 той же длины, что и логиты.
- весовые коэффициенты: список 1-мерных поплавковых тензоров размера партии той же длины, что и логиты.
Обратите внимание, что это не уменьшает размер вашей модели, но экономит много памяти, вычисляя потери от редко закодированных меток. Полный пример реализации word-rnn можно найти здесь, и они используют именно этот подход.