Ответ Фань Луо указывает на правильное направление, но в конечном итоге не будет работать, поскольку включает непроизводные операции. Обратите внимание, что такие операции приемлемы для реального значения (функция потерь принимает реальное значение и прогнозируемое значение, непроизводные операции подходят только для реального значения).
Честно говоря, это то, о чем я спрашивал в первую очередь. Невозможно сделать то, что я хотел, но мы можем получить похожее и производное поведение:
1) Поэлементная мощность значений softmax. Это делает меньшие значения намного меньше. Например, при степени 4 [0,5, 0,2, 0,7] становится [0,0625, 0,0016, 0,2400]. Обратите внимание, что 0,2 сравнимо с 0,7, но 0,0016 ничтожно мало по сравнению с 0,24. Чем выше my_power, тем больше будет конечный результат похож на one-hot.
soft_extreme = Lambda(lambda x: x ** my_power)(softmax)
2) Важно отметить, что нормализуются как softmax, так и one-hot векторы, но не наш "soft_extreme". Сначала найдите сумму массива:
norm = tf.reduce_sum(soft_extreme, 1)
3) Нормализовать soft_extreme:
almost_one_hot = Lambda(lambda x: x / norm)(soft_extreme)
Примечание. Установка слишком высокого значения my_power в 1) приведет к NaN. Если вам нужно лучшее преобразование softmax в one-hot, вы можете выполнить шаги с 1 по 3 два или более раз подряд.
4) Наконец, нам нужен вектор из словаря. Поиск запрещен, но мы можем взять средний вектор, используя матричное умножение. Поскольку наш soft_normalized похож на горячее кодирование, это среднее значение будет похоже на вектор, связанный с наивысшим аргументом (исходное предполагаемое поведение). Чем выше my_power в (1), тем вернее это будет:
target_vectors = tf.tensordot(almost_one_hot, embedding_matrix, axes=[[1], [0]])
Примечание. Это не будет работать напрямую с пакетами! В моем случае я изменил свой «горячий» (с [batch, Dictionary_length] на [batch, 1, Dictionary_length], используя tf.reshape. > Затем выровнял время партии embedding_matrix и, наконец, использовал:
predicted_vectors = tf.matmul(reshaped_one_hot, tiled_embedding)
Могут быть более элегантные решения (или менее требовательные к памяти, если разбиение матрицы встраивания на мозаику невозможно), так что не стесняйтесь исследовать больше.
person
Pablo
schedule
27.06.2018