2016-07-08 219 views
2

我想训练神经网络tensorflow使用每个阳性样品一个负样品最大利润损失函数:Tensorflow最大利润损失培训?

max(0,1 -pos_score +neg_score) 

什么我目前做的是这样的: 网络需要三个输入:输入1,然后一个正例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 

我怎么能结构中的变量/培训,使网络学习任务呢?

我只想要一个网络,需要两个输入并计算表示它们之间相关性的分数,并以最大利润率损失对其进行训练。

分别计算正面和负面的分数似乎不是我的选择,因为它不会正确地反向传播。另一个选择似乎是随机化输入 - 但是对于损失函数,我需要知道哪个示例是正确的 - 输入另一个参数会再次提供解决方案?

任何想法?

+0

你的代码似乎很好。如果网络预测1对积极对和0对于消极者,它似乎已经完全了解你的任务!损失是否趋于0? –

回答

4

鉴于你的结果(1为每个正,0为每负)似乎有两个不同的网络学习:

  • 预测1为第一个
  • 为第二个预测0

当使用最大毛利损失时,您需要使用相同的网络来计算pos_scoreneg_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为模型,训练将优化名称为“网络/权重”的共享变量。

+0

非常感谢!这似乎已经解决了这个问题:) – Daniela