Softmax函數概述
- soft version of max
- 大的愈來愈大,小的愈來愈小
Softmax常與crossentropy(交叉熵)搭配連用html
上圖中假設有三個輸出,分別是2.0,1.0和0.1,若是將數值轉換成機率的話,咱們但願機率最大的值做爲預測的label。即咱們但願將最大值2.0所對應的索引做爲相應的label輸出,那麼如何做爲probilities輸出呢?python
sigmoid函數能夠將input壓縮到[0,1]的範圍,可是對於分類問題來講,咱們不只要求機率範圍是[0,1],還要求全部的機率和爲1,即
∑pi=1markdown
爲了解決此類問題,就有了Softmax函數,具體的函數表達式爲app
S(yi)=∑jeyjeyi
另外有一點要注意,Softmax具備差距放大功能,例如原來2.0和1.0是兩倍關係,通過Softmax壓縮後,變爲0.7和0.2,增大到3.5倍關係函數
Softmax求導
對Softmax函數進行求導,首先寫出其函數表達式ui
pi=∑k=1Neakeai
根據除法求導法則,若
f(x)=h(x)g(x),則
f′(x)=h2(x)g′(x)h(x)−h′(x)g(x)spa
當
i=j時code
∇aj∇∑k=1Neakeai=(∑k=1Neak)2eai∑k=1Nak−eajeai=(∑k=1Neak)2eai(∑k=1Nak−eaj)=∑k=1Neakeaj∗∑k=1Neak(∑k=1Neak−eaj)=pi(1−pj)
當
i=j時orm
∇aj∇∑k=1Neakeai=(∑k=1Neak)20−eajeai=∑k=1Neak−eaj∗∑k=1Neakeai=−pj∗pi
對以上求導過程進行總結xml
∇aj∇pi={pi(1−pj)−pj∗pii=ji=j
須要注意的一點是,因爲
pj和
pj均在
[0,1]範圍內,故
pi(1−pj)>0,
−pi∗pj<0
下面使用代碼舉例
import torch
import torch.nn.functional as F
a = torch.rand(3, requires_grad=True)
p = F.softmax(a, dim=0)
print('softmax:', p)
torch.autograd.grad(p[0],[a], retain_graph=True)
複製代碼
輸出
softmax: tensor([0.2732, 0.3780, 0.3489], grad_fn=<SoftmaxBackward>)
(tensor([ 0.1985, -0.1033, -0.0953]),)
複製代碼
這裏進行了
∇ai∇p0的操做,因爲
a是
[0,2]的tensor,因此返回了一個
1∗3的tensor。而且仔細觀察會發現,當
i=0時,梯度信息爲正
參數retain_graph=True
須要解釋一下。因爲PyTorch在求導一次以後,就會將這個圖的梯度信息清除掉,若是第二次再求導,就會報錯。但若是寫上這個參數,就能夠保留梯度信息,就能再求一次導