10 多層感知機 + 代碼實現 - 動手學深度學習v2

簡單談談softmax函數。
在我看來,因為我們是要去擬合δ=[δ1, δ2, ..., δn],當然,我們理想的label是一個one hot編碼,即類似于[0, 1, 0, ..., 0],其中僅有一個1。
我們當然是可以直接將預測結果的tensor去找到最大的索引作為其的分類。也即,如果預測結果為[0.9, 0.2, -0.1],隨便編的一組數據,求和可以不為1,為任意數。其中很顯然第一個索引值最大,我們就可以將其分類為第一類,但是值得一提的是,這樣我們將無法很好的計算loss,因為這樣的結果值具有太大的不確定性,他可以是1000,也可以是-1000000000,這將會對我們的loss造成很大的不便。
誠然,我們也可以選擇argmax函數,去找到最大索引,然后將預測結果改為[1, 0, 0],但是這樣仍然會造成一定的loss丟失,這對我們的梯度修改是不友好的。
于是我們這里引入了softmax函數。注意到softmax的解析式為 softmax(xi) = exp(xi) / ∑exp(xi),例如在上例中的,我們預測結果為
ans=[0.9, 0.2, -0.1],這樣我們在進行exp(ans)之后會得到 res = [2.46, 1.22, 0.90],之后再直接調用 res / res.sum(),就可以輕松投影到目標區(qū)間,也即 [0.53, 0.26, 0.19],結果求和可能不為1啊,因為我進行了一定的截尾。通過這種行為,所有的值被約束在了0-1之間,loss的計算也便得更加便捷。
關于softmax與交叉熵
其實講到這里應該還算明了了。在上一章節(jié)中就已經提到,我們softmax只是簡單的處理了一下我們的預測結果,而并不是損失函數,甚至可以說是和損失函數沒有任何關系。softmax,只是為了更加方便的去計算loss,而交叉熵CrossEntropy,才是我們的損失函數。
寫于2023.2.27 17:31
如有錯誤,還望指正!