0

對於一個標準的機器學習問題,例如MNIST上的圖像分類,損失函數是固定的,因此優化過程可以簡單地通過調用函數和饋入輸入進入他們。沒有必要手工推導出梯度並編碼體面的程序。有沒有什麼辦法可以完成隨機梯度下降不是從零開始

但是現在我很困惑,當遇到一些複雜的表述時。假設我們正在解決半監督問題,而損失函數有兩個部分:Ls + lambda * Lu。第一部分是一個正常的分類公式,例如交叉熵損失。第二部分各不相同。在我的情況下,Lu是矩陣分解損失,具體爲:Lu = MF(D, C * W)。總損失函數可以寫爲:

L = \sum log p(yi|xi) + MF(D, C * W) = \sum log p(yi|Wi) + MF(D, C * W) = \sum log p(yi|T * Wi + b) + MF(D, C * W)

如果參數是W, C, Tb。第一部分是分類損失,輸入xiW的原始數據,即Wi,大小爲(d, 1)的向量。並且標籤yi可以是大小爲(c, 1)的單熱矢量,因此參數Tb將輸入映射到標籤大小。第二部分是矩陣分解損失。

現在我很困惑,當我要使用sgd優化這個函數。它可以通過寫下公式推導梯度來解決,然後從頭開始完成一個培訓程序。但我想知道是否有更簡單的方法?因爲使用像Tensorflow或Keras這樣的深度學習工具可以輕鬆地訓練分類模型,所有您需要做的就是構建網絡並提供數據。

所以同樣,有沒有一種工具可以在我定義損失函數後自動計算梯度?因爲從頭開始獲取漸變是非常煩人的。分類損失和矩陣分解損失是非常普遍的,所以我認爲可以徹底實現組合。

回答

0

如果你能在他們的框架/語言中制定你的優化問題,Theano和Tensorflow會爲你準確地做到這一點。這些框架還足以實現非基於NN的算法,如簡單的基於一階的優化,比如你的算法。

如果這是不可能的,你可以試試autograd,這可以在numpy的一個子集上做到這一點。只需將你的損失表達爲numpy函數(同時堅持支持的函數;閱讀文檔)並讓autograd構建漸變。請記住,Theano & Tensorflow所使用的結構化方法會更有效率(因爲定義更明確,並且因爲這兩個庫有更多的進化)。

+0

非常感謝。我正在閱讀Tensorflow的手冊,因爲我之前沒有使用它。我會問我是否遇到其他問題。感謝你的建議。還有一個問題,我是否需要導出漸變?或者我只需要制定損失函數? –