Вопрос или проблема
Я пытаюсь создать сеть кодировщик-декодировщик в Keras для генерации предложения определённого стиля. Так как моя задача является неконтролируемой, то есть у меня нет эталонных данных для сгенерированных предложений, я использую классификатор, чтобы помочь в процессе обучения. Я передаю вывод декодировщика в классификатор, чтобы он сказал мне, какой стиль у декодированного предложения.
Декодировщик выдает распределение softmax, которое я собирался напрямую передать классификатору, но я понял, что у него есть слой встраивания, который в Keras принимает только последовательности целых чисел, а не softmax/one-hot. Кто-нибудь знает, как это исправить?
Спасибо
Вы описываете вариацию Генеративных состязательных сетей (GANs). Генератор, часть модели, которая создает новые примеры, должен выводить полные предложения. Дискриминатор, классификатор, принимает эти полные предложения в качестве входных данных.
В частности, вы описываете DiscoGAN, который находит отношения между доменами, учитывая непарные данные. DiscoGAN были применены к стилю изображений.
Ответ или решение
Создание сети кодировщика-декодировщика в Keras для генерации предложений определенного стиля с использованием классификатора без надзорного обучения представляет собой интересную задачу. Поскольку ваш декодер выдает распределение вероятностей через слой softmax, вы сталкиваетесь с проблемой передачи этого выходного значения в слой вложений, который принимает только последовательности целых чисел (индексы токенов).
Вот несколько шагов, которые помогут вам преодолеть эту проблему:
-
Вывод токенов из softmax-распределения: Один из подходов заключается в том, чтобы взять выходные вероятности из softmax и преобразовать их в индексы токенов. Вы можете выбрать токены на основе максимального значения (argmax) из выходного распределения. Например:
import numpy as np # декларация softmax выхода декодера softmax_output = model.decoder_output # softmax выход декодера, shape: (batch_size, seq_length, vocab_size) predicted_indices = np.argmax(softmax_output, axis=-1) # получаем индексы предполагаемых токенов
-
Использование слоя
Embedding
: Далее, вы можете использовать эти индексы в слоеEmbedding
. Если ваш классификатор ожидает вход в виде вложений, вы можете создать новую модель, которая будет включать этот слойEmbedding
, и передавать ей индексы, которые вы получили на предыдущем шаге:from keras.models import Model from keras.layers import Input, Embedding, LSTM, Dense # Пример структуры классификатора embedding_layer = Embedding(input_dim=vocab_size, output_dim=embedding_dim) classifier_input = Input(shape=(None,), dtype='int32') # формы входа embeddings = embedding_layer(classifier_input) classifier_output = LSTM(units=hidden_units)(embeddings) classifier_output = Dense(num_classes, activation='softmax')(classifier_output) classifier_model = Model(classifier_input, classifier_output)
-
Обучение модели: Обучение модели может происходить при помощи обратного распространения ошибки. Вы можете комбинировать потери от декодера и классификатора. Например, вы можете использовать кросс-энтропийную потерю для обоих выходов и суммировать их во время обучения.
-
Тестирование подхода: Важно протестировать различные подходы к извлечению токенов из softmax-распределения, включая использование методов семплирования (например, топ-k выборка или ядерное семплирование) для создания более разнообразного и креативного вывода.
Таким образом, вы сможете передавать выход декодера в классификатор, используя токены, полученные из softmax-распределения. Это позволит вашей сети успешно обучаться и генерировать предложения заданного стиля, даже в условиях отсутствия разметки.
Если у вас есть дополнительные вопросы или требуется уточнение по какому-либо этапу, не стесняйтесь обращаться!