Тренинг по максимальным потерям в 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
в качестве модели, тренинг оптимизирует общую переменную с именем "сеть / вес".