Predicción de la siguiente palabra usando el ejemplo del modelo de lenguaje tensorflow

El tutorial tensorflow sobre el modelo de lenguaje permite calcular la probabilidad de oraciones:

probabilities = tf.nn.softmax(logits) 

en los comentarios a continuación, también especifica una forma de predecir la siguiente palabra en lugar de las probabilidades, pero no especifica cómo se puede hacer esto. Entonces, ¿cómo generar una palabra en lugar de una probabilidad usando este ejemplo?

 lstm = rnn_cell.BasicLSTMCell(lstm_size) # Initial state of the LSTM memory. state = tf.zeros([batch_size, lstm.state_size]) loss = 0.0 for current_batch_of_words in words_in_dataset: # The value of state is updated after processing each batch of words. output, state = lstm(current_batch_of_words, state) # The LSTM output can be used to make next word predictions logits = tf.matmul(output, softmax_w) + softmax_b probabilities = tf.nn.softmax(logits) loss += loss_function(probabilities, target_words) 

Debe encontrar el argmax de las probabilidades y volver a traducir el índice a una palabra invirtiendo el mapa word_to_id. Para que esto funcione, debe guardar las probabilidades en el modelo y luego recuperarlas desde la función run_epoch (también puede guardar solo el argmax). Aquí hay un fragmento de código:

 inverseDictionary = dict(zip(word_to_id.values(), word_to_id.keys())) def run_epoch(...): decodedWordId = int(np.argmax(logits)) print (" ".join([inverseDictionary[int(x1)] for x1 in np.nditer(x)]) + " got" + inverseDictionary[decodedWordId] + + " expected:" + inverseDictionary[int(y)]) 

Vea la implementación completa aquí: https://github.com/nelken/tf

Su salida es una lista de TensorFlow y es posible obtener su máximo argumento (la clase más probable pronosticada) con una función de TensorFlow. Esta es normalmente la lista que contiene las probabilidades de la siguiente palabra.

En “Evaluar el modelo” de esta página , su lista de resultados es y en el siguiente ejemplo:

Primero vamos a averiguar dónde predecimos la etiqueta correcta. tf.argmax es una función extremadamente útil que le da el índice de la entrada más alta en un tensor a lo largo de algún eje. Por ejemplo, tf.argmax(y,1) es la etiqueta que nuestro modelo cree que es más probable para cada entrada, mientras que tf.argmax(y_,1) es la etiqueta verdadera. Podemos usar tf.equal para verificar si nuestra predicción coincide con la verdad. correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

Otro enfoque que es diferente es tener palabras pre-vectorizadas (incrustadas / codificadas). Podría vectorizar sus palabras (por lo tanto, incrustarlas) con Word2vec para acelerar el aprendizaje, es posible que desee echar un vistazo a esto. Cada palabra podría representarse como un punto en un espacio de significado de 300 dimensiones, y podría encontrar automáticamente las “N palabras” más cercanas al punto predicho en el espacio en la salida de la red. En ese caso, la forma de proceder de argmax ya no funciona y probablemente podría comparar la similitud de coseno con las palabras que realmente quería comparar, pero para eso no estoy seguro en realidad cómo puede esto causar inestabilidades numéricas. En ese caso, y no representará palabras como características, sino incrustaciones de palabras sobre una dimensionalidad de, digamos, de 100 a 2000 en tamaño según diferentes modelos. Se puede buscar en Google algo como esto para obtener más información: “hombre mujer reina palabra, palabra word2vec”, para comprender mejor el tema de las incrustaciones.

Nota: cuando hablo de word2vec aquí, se trata de usar un modelo externo de word2vec pre-entrenado para ayudar a su entrenamiento a tener solo entradas pre-integradas y crear salidas incrustadas. Word2vec puede redefinir las palabras correspondientes de esas salidas para encontrar las palabras pronosticadas superiores correspondientes correspondientes.

Tenga en cuenta que el enfoque que sugiero no es exacto, ya que solo sería útil saber si predecimos EXACTAMENTE la palabra que queríamos predecir. Para un enfoque más suave, sería posible usar las métricas ROUGE o BLEU para evaluar su modelo en caso de que use oraciones o algo más largo que una palabra.

En realidad, es una ventaja que la función devuelve una probabilidad en lugar de la palabra en sí. Ya que está utilizando una lista de palabras, con las probabilidades asociadas, puede hacer un procesamiento adicional y boost la precisión de su resultado.

Para responder a su pregunta: puede tomar la lista de palabras, iterarla y hacer que el progtwig muestre la palabra con la mayor probabilidad.