0

我想產生一個基於標量輸入的數學運算選擇nn模型。該操作是根據由nn產生的softmax結果來選擇的。然後,該操作必須應用於標量輸入以生成最終輸出。到目前爲止,我已經提出了在softmax輸出上應用argmax和onehot,以便生成一個掩碼,然後將其應用於要執行的所有可能操作(如下面的僞代碼所示)的拼接值矩陣中。問題在於argmax和onehot都不是可區分的。我對此很陌生,所以任何人都會受到高度讚賞。提前致謝。如何在TensorFlow中執行可微分操作選擇?

#perform softmax  
    logits = tf.matmul(current_input, W) + b 
    softmax = tf.nn.softmax(logits) 

    #perform all possible operations on the input 
    op_1_val = tf_op_1(current_input) 
    op_2_val = tf_op_2(current_input) 
    op_3_val = tf_op_2(current_input) 
    values = tf.concat([op_1_val, op_2_val, op_3_val], 1) 

    #create a mask 
    argmax = tf.argmax(softmax, 1) 
    mask = tf.one_hot(argmax, num_of_operations) 

    #produce the input, by masking out those operation results which have not been selected 
    output = values * mask 

回答

0

我相信這是不可能的。這與paper中描述的Hard Attention很相似。在圖像標題中使用注意力很強,使模型只能在每個步驟中只關注圖像的某個部分。注意力難以區分,但有兩種方法可以解決這個問題:

1-使用強化學習(RL):RL用於訓練制定決策的模型。即使損失函數不會將任何梯度反向傳播到用於決策的softmax,您也可以使用RL技術來優化決策。對於一個簡化的例子,您可以將損失視爲懲罰,併發送給softmax層中具有最大值的節點一個與懲罰成比例的策略梯度,以便在決策不合格時降低決策的分數(結果在高損失)。

2-使用類似於軟件的注意事項:不要只選擇一項操作,而應根據softmax將其與權重混合。所以不是:

output = values * mask 

用途:

output = values * softmax 

現在,操作將收斂到零基於多少SOFTMAX將選擇。與RL相比,這更容易訓練,但如果必須從最終結果中完全刪除未選定的操作(將它們完全設置爲零),則它將不起作用。

這是另一種答案,大約硬和軟的注意,你可能會發現有用的會談:https://stackoverflow.com/a/35852153/6938290

+0

非常感謝您的回答。我已經用softmax本身進行了實驗,並且如果logits之間的差異非常大,它看起來像爲最大值生成值接近1,較小值爲0。用「softmax = tf.nn.softmax(10000 * logits)」來產生我的面具是否合理,以便馬上產生很大的差異,或者我應該訓練nn通過權重來挑選它? – user59271

+0

我認爲你應該訓練nn通過權重選擇它。與1000這樣的大數相乘唯一的問題是它會在訓練過程的早期飽和softmax。對於較大的logit值,softmax的梯度幾乎爲0,因此即使在訓練過程開始時,softmax後面的權重也會得到較少的更新。儘管乘以1000應該會增加梯度,但它可能與softmax中梯度的指數衰減不匹配。 –