Тренинг по максимальным потерям в Tensorflow?

Я хочу обучить нейронную сеть тензорному потоку с функцией потери максимального запаса, используя одну отрицательную выборку на положительную выборку:

max(0,1 -pos_score +neg_score)

В настоящее время я делаю следующее: сеть принимает три входа: input1, а затем один положительный пример input2_pos и один отрицательный пример input2_neg. (Это индексы для слоя встраивания слов.) Предполагается, что сеть рассчитывает оценку, которая выражает, насколько связаны два примера. Вот упрощенная версия моего кода:

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)

Когда я запускаю это, я вижу, что таким образом сеть просто узнает, какие входные данные содержат положительный пример - она ​​всегда прогнозирует аналогичный показатель по направлениям:

pos_score = 0.9965983
neg_score = 0.00341663

Как я могу структурировать переменные / обучение, чтобы сеть изучала задачу вместо этого?

Мне нужна только одна сеть, которая принимает два входа и вычисляет оценку, выражающую корреляцию между ними, и обучает ее с максимальной потерей прибыли.

Расчет баллов для положительного и отрицательного по отдельности не кажется мне вариантом, так как тогда он не будет правильно распространяться. Другой вариант, по-видимому, заключается в рандомизации входных данных - но тогда для функции потерь мне нужно знать, какой пример является положительным - вводить это в качестве другого параметра, чтобы снова дать решение?

Есть идеи?

1 ответ

Решение

Учитывая ваши результаты (1 для каждого положительного, 0 для каждого отрицательного), кажется, что у вас есть две разные сети обучения:

  • предсказать 1 для первого
  • предсказать 0 для второго

При использовании максимальных потерь необходимо использовать одну и ту же сеть для pos_score а также neg_score, Способ сделать это - поделиться переменными. Я приведу небольшой пример использования 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

С этой функцией f в качестве модели, тренинг оптимизирует общую переменную с именем "сеть / вес".

Другие вопросы по тегам