tutorial neural network guide for experts example convolutional neural-network tensorflow

neural-network - neural - tensorflow tutorial



Entrenamiento de pérdida de margen máximo Tensorflow? (1)

Quiero entrenar una red neuronal en tensorflow con una función de pérdida de margen máximo usando una muestra negativa por muestra positiva:

max(0,1 -pos_score +neg_score)

Lo que estoy haciendo actualmente es esto: la red toma tres entradas: input1 , y luego un ejemplo positivo input2_pos y un ejemplo negativo input2_neg . (Estos son índices de una capa de incrustaciones de palabras.) Se supone que la red calcule un puntaje que exprese cómo son dos ejemplos relacionados. Aquí hay una versión simplificada de mi código:

input1 = tf.placeholder(dtype=tf.int32, shape=[batch_size]) input2_pos = tf.placeholder(dtype=tf.int32, shape=[batch_size]) input2_neg = tf.placeholder(dtype=tf.int32, shape=[batch_size]) # f is a neural network outputting a score pos_score = f(input1,input2_pos) neg_score = f(input1,input2_neg) cost = tf.maximum(0., 1. -pos_score +neg_score) optimizer= tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

Lo que veo cuando ejecuto esto es que la red acaba de descubrir qué entrada contiene el ejemplo positivo: siempre predice una puntuación similar en la línea de:

pos_score = 0.9965983 neg_score = 0.00341663

¿Cómo puedo estructurar las variables / capacitación para que la red aprenda la tarea?

Solo quiero una red que tome dos entradas y calcule una puntuación que exprese la correlación entre ellas y la entrene con una pérdida máxima de margen.

Calcular las puntuaciones de positivo y negativo por separado no me parece una opción, ya que no se reproducirá de forma adecuada. Otra opción parece ser aleatorizar las entradas, pero luego, para la función de pérdida, necesito saber qué ejemplo es el positivo, ingresando eso ya que otro parámetro daría la solución nuevamente.

¿Algunas ideas?


Dados sus resultados (1 por cada positivo, 0 por cada negativo), parece que tiene que aprender diferentes redes:

  • para predecir 1 para el primero
  • para predecir 0 para el segundo

Al usar la pérdida de margen máximo, debe usar la misma red para calcular tanto pos_score como neg_score . La forma de hacerlo es compartir las variables . Le daré un pequeño ejemplo usando tf.get_variable() :

with tf.variable_scope("network"): w = tf.get_variable("weights", shape=..., initializer=...) def f(x, y): with tf.variable_scope("network", reuse=True): w = tf.get_variable("weights") res = w * (x - y) # some computation return res

Con esta función f como modelo, la capacitación optimizará la variable compartida con el nombre "red / pesas".