2016-07-08 281 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