使用 Softmax / 交叉熵進行反向傳播
我試圖了解反向傳播如何用於 softmax/交叉熵輸出層。
交叉熵誤差函數為
和和作為神經元的目標和輸出, 分別。總和在輸出層中的每個神經元上。本身就是softmax函數的結果:
同樣,總和在輸出層中的每個神經元上,並且是神經元的輸入:
這是前一層中所有神經元及其相應輸出的總和和重量朝向神經元更有偏見.
現在,要更新權重連接一個神經元在帶有神經元的輸出層在上一層,我需要使用鍊式法則計算誤差函數的偏導數:
和作為神經元的輸入.
最後一個詞很簡單。因為兩者之間只有一個重量和,導數為:
第一項是關於輸出的誤差函數的推導:
中間項是softmax函數相對於其輸入的推導更難:
假設我們有對應於類的三個輸出神經元然後是:
及其使用商規則的推導:
回到反向傳播的中間術語,這意味著:
把它放在一起我得到
這意味著,如果這個類的目標是,那麼我不會為此更新權重。這聽起來不對。
對此進行調查,我發現人們對 softmax 推導有兩種變體,其中一種另一個為,喜歡這里或這裡。
但我對此毫無意義。此外,我什至不確定這是否是我的錯誤的原因,這就是我發布所有計算的原因。我希望有人能澄清我在哪裡遺漏了什麼或出錯了。
**注意:**我不是反向傳播方面的專家,但現在閱讀了一下,我認為以下警告是合適的。在閱讀有關神經網絡的論文或書籍時,使用標準求和/索引表示法、矩陣表示法和多索引表示法(包括張量-張量導數的最後兩者的混合)來編寫導數並不少見)。通常的意圖是這應該“從上下文中理解”,所以你必須小心!
我注意到您的推導中有一些不一致之處。我真的不做神經網絡,所以以下可能是不正確的。但是,這就是我將如何解決這個問題。
首先,您需要考慮總和,並且您不能假設每個術語僅取決於一個權重。所以取梯度關於組件的, 我們有
然後,表達作為
我們有
在哪裡是克羅內克三角洲。那麼softmax-分母的梯度是
這使
或者,擴展日誌
請注意,導數是關於, 的任意分量,這給出了學期 (只有當). 所以梯度關於那麼是
在哪裡 是常數(對於給定的向量)。 這顯示了與您的結果的第一個區別:不再倍增. 請注意,對於典型情況是我們有的“one-hot”(如您的第一個鏈接中所述)。
如果我理解正確,第二個不一致之處是“" 輸入到似乎不太可能是““這是softmax的輸出。我認為這實際上在網絡架構中“更遠”更有意義?
調用這個向量,然後我們有
最後,得到梯度關於權重矩陣,我們使用鍊式法則
給出最終表達式(假設 one-hot, IE)
在哪裡是最低級別的輸入(您的示例)。 因此,這顯示了與您的結果的第二個區別:““大概應該是從下面的級別,我稱之為,而不是上面的級別(這是).
希望這會有所幫助。這個結果是否看起來更一致?
**更新:**響應評論中 OP 的查詢,這裡是第一步的擴展。首先,請注意向量鍊式法則需要求和(參見此處)。其次,為了確保得到所有梯度分量,您應該始終為偏導數分母中的分量引入一個新的下標字母。因此,要使用完整的鍊式法則完全寫出梯度,我們有
和
所以
在實踐中,總和減少了,因為你得到了很多條款。儘管它可能涉及很多“額外”的求和和下標,但使用完整的鍊式規則將確保您始終獲得正確的結果。