Tradicionalmente, parece que las RNN usan logits para predecir el próximo paso de tiempo en la secuencia. En mi caso, necesito el RNN para generar una predicción vectorial word2vec (50 de profundidad). Esto significa que la función de coste se ha basado en 2 vectores: Y , el vector real de la siguiente palabra de la serie, y Y_hat , la predicción de la red.
Intenté usar una función de costo de cosine distance pero la red no parece aprender (lo dejé funcionar otras 10 horas en un AWS P3 y el costo siempre es de alrededor de 0.7)
¿Es tal modelo posible en absoluto? Si es así, ¿qué función de costo se debe usar?
Distancia coseno en TF:
cosine_distance = tf.losses.cosine_distance(tf.nn.l2_normalize(outputs, 2), tf.nn.l2_normalize(targets, 2), axis=2)Actualización: estoy tratando de predecir un word2vec para que durante el muestreo pueda elegir la siguiente palabra en función de los vecinos más cercanos del vector predicho.
¿Cuál es la razón por la que desea predecir la incrustación de una palabra? ¿De dónde obtienes las incrustaciones de palabras de "verdad básica"? Para los modelos word2vec, normalmente reutilizará las incrustaciones de palabras entrenadas en modelos futuros. Si entrenó un modelo word2vec con un tamaño de incrustación de 50, tendría incrustaciones de 50 d que podría guardar y usar en modelos futuros. Si solo desea volver a crear un modelo word2vec de verdad de campo existente, entonces podría usar esos valores. Word2vec típico sería tener salidas regulares de softmax a través de una bolsa de palabras continua o skip-gram y luego guardar las incrustaciones de palabras resultantes.
Si realmente tiene una razón para tratar de generar un modelo que crea intentos de coincidir con word2vec, entonces mire su función de pérdida aquí hay algunas sugerencias. No creo que debas normalizar tus resultados o tus objetivos; probablemente quieras que no se vean afectados (los objetivos ya no son los objetivos "verdaderos" si los has normalizado. Además, parece que estás usando dim=0 que ahora ha quedado en desuso y se reemplazó con axis . ¿Probó diferentes valores para dim ? Esto debería representar la dimensión a lo largo de la cual calcular la distancia del coseno y creo que la dimensión 0th sería la dimensión incorrecta (ya que probablemente debería ser la tamaño del lote Probaría con valores de axis=-1 (última dimensión) o axis=1 y vería si observa alguna diferencia.
Por separado, ¿cuál es su tasa de optimizador/aprendizaje? Si la tasa de aprendizaje es demasiado pequeña, es posible que no pueda moverse lo suficiente en la dirección correcta.