2017-09-06 48 views
0

我一直在使用張量流來訓練深度NN語音模型的語音識別一段時間。我使用的損失函數是交叉熵,並且NN模型性能非常好。現在我想將損失函數改爲更復雜的名爲MMI(最大互信息)的函數,這也是語音識別領域中使用的經典標準。我在這裏放置了一個paper,它描述了這種損失函數,以防你有興趣。無論如何反推衍生物的自定義損失函數的衍生物是由我自己計算

當使用這種特殊的損失函數時,損失函數的導數w.r.t.輸出層的激活可以通過隱馬爾可夫模型場景中定義的一些特殊算法來計算。這意味着我可以計算損失函數w.r.t的導數。通過我自己激活輸出層而不是隻寫出損失函數並讓Tensorflow自動計算衍生產品。

但是基於我的糟糕經歷,我不知道如何反推我自己計算的衍生產品。有沒有辦法做到這一點,而無需觸摸Tensorflow C++源代碼?

回答

0

如果涉及的所有計算都使用現有的tensorflow函數,可能是。

您只需設置計算來自當前變量的梯度的操作鏈。

然後,您只需使用將您的梯度乘以減去學習率的變量。

因此,您通常會模仿TF背景中發生的情況。

編輯:如果在numpy計算例如你可以使用的梯度。

#perform numpy calculations 

a=f(output_npy,variables_npy) 
grad_from_user=tf.placeholder(tf.float32, a.shape) 
grad_update=tf.assign_add(variables_tf,-lr*grad_from_user) 
#and then 
sess.run(grad_update,feed_dict={grad_from_user:a,...}) 
+0

感謝您的回答。計算損失函數的導數w.r.t.激活輸出層是在Tensorflow之外計算的,我傾向於使用佔位符來接收這些值。而且你說我必須建立業務鏈,這是否意味着我必須自己計算未解決的衍生工具?如果NN模型太複雜以至於難以弄清鏈式操作,例如LSTM + CNN。 – lijianhackthon

+0

使用佔位符也可以很好地工作。 – jean

+0

我不明白你的評論的結尾,你可以使用tensorflow backprop來完成你的工作或者自己完成工作。如果你想混合使用這兩種,你可以使用'tf.gradients()'這會給你所需的中間體。 – jean