MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss
損失函數
- 1.激活函數
- 2.損失函數
- 2.1均方誤差損失函數
- 2.2交叉熵損失函數
- 2.3 NLLLoss()
- 2.4 BCELoss()
1.激活函數
全連接網絡又叫多層感知器,多層感知器的基本單元神經元是模仿人類神經元興奮與抑制機制,對其輸入進行加權求和,若超過某一閾值則該人工神經元輸出為1,否則輸出為0。即 原初的激活函數為階躍函數。由于,sigmoid函數便于求導,便于求導。(因為要優化w,所以要求激活函數應該連續,能夠對權重w可求導)。所以實際應用使用的激活函數為sigmoid函數。
小結激活函數的特點: 連續的光滑函數,便于求導。
sigmoid函數為階躍函數的平滑近似。
2.損失函數
神經網絡中的損失函數用于衡量網絡輸出與期望輸出的之間的差距。當神經網絡用于多類別分類時,網絡輸出數據與標簽一般采用 one-hot向量進行編碼。
如神經網絡用于MNIST手寫數字的識別,每張圖片輸入網絡后,將輸出一個10維的向量Y,10維向量的第k維可以看成是該圖片是數字k的概率,那么,這張圖片最有可能是輸出向量的最大維度對應的數字。
損失函數是用于衡量差距的,換一句話說,當網絡輸出與期望輸出越接近時,損失函數值應該越小。并且當網絡輸出==期望輸出時,損失函數應該為0,也就是說,損失函數具有非負性。小結損失函數的兩點特性:
(1).網絡輸出與期望輸出越接近時,損失函數值應該越小;
(2)損失函數具有非負性
只要滿足以上兩點約束的函數都能設計成損失函數,在實際應用中,一個設計良好的損失函數可能會引發一場新的研究熱潮。因此,損失函數的設計也是神經網絡研究中一塊重要的內容。
本文以下總結常用的一些損失函數,并且,附上pytorch相應實例函數。
2.1均方誤差損失函數
來自官網的解釋:求的是網絡輸出向量x與目標向量y 之間的均方差,每一維度的求差、求平方、求和、求平均。如果將reduction=‘sum’,那么只到求和,不求平均。
均方誤差損失函數使用例子:
loss = nn.MSELoss()
input = torch.randn(3, 10, requires_grad=True)
target = torch.randn(3, 10)
output = loss(input, target)
output.backward()
損失函數輸入數據格式要求(3為minibatch的大小):Input: (3, 10),Target: (3, 10)
均方差損失函數常用與回歸問題,利用神經網絡擬合一個復雜函數f(x)f(x)f(x),網絡的最后一層可以依據需要設置不同的激活函數。例如,在輸出為一維時,可以直接采用全連接層。
2.2交叉熵損失函數
交叉熵概念源于信息論, 用于衡量估計模型概率分布與真實概率分布之間的差異,隨機變量X~p(n),q(n) 為p(n) 的近似概率分布,則隨機變量X與模型 q 之間的交叉熵為:
H(X,q)=?∑np(n)logq(n)H(X,q)=-\sum_np(n)logq(n)H(X,q)=?n∑?p(n)logq(n)
通過數學推導可得,交叉熵=隨機變量的熵+真實分布與模型分布的差距:
H(X,q)=H(X)+D(p∣∣q)H(X,q)=H(X)+D(p||q)H(X,q)=H(X)+D(p∣∣q)
其中,D(p∣∣q)D(p||q)D(p∣∣q)為相對熵,H(X)H(X)H(X)為隨機變量的熵。因為,在同一隨機變量的前提下(H(X)相同),真實分布與模型分布的差距(即相對熵D(p∣∣q)D(p||q)D(p∣∣q))越小,則交熵越小。也就是說, 交叉熵滿足 損失函數的兩條特性。所以可以采用交叉熵作為損失函數。
交叉熵衡量的是兩個兩個概率分布之間的差距,所以,全連接網絡的最后一層輸出應該采用softmax() 函數,將輸出轉化為概率分布;期望輸出(標簽向量)采用onehot編碼。網絡最后一層的加權輸出向量xxx通過softmax()softmax()softmax()激活后得到輸出分布向量z:
zk=softmax(x)k=exk∑iexiz_k=softmax(x)_k=\frac{e^{x_k}}{\sum_ie^{x_i} }\\ zk?=softmax(x)k?=∑i?exi?exk??
計算網絡輸出與目標輸出之間的交叉熵
Loss(z,label)=H(z,label)=?logexj∑iexiLoss(z,label)=H(z,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i} } Loss(z,label)=H(z,label)=?log∑i?exi?exj??
其中,jjj為llabellabellabel中為1 的維度,也就是,待檢測目標所屬的類別。
因為,上面兩個式子可以化簡,直接取最后的結果:
Loss(x,label)=?logexj∑iexiLoss(x,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i}} Loss(x,label)=?log∑i?exi?exj??
(本文最重要的事情)
所以,在pytorch 中CrossEntropyLoss() 函數的輸入為:最后一層全連接的加權輸出向量(不經過softmax()激活),和期望輸出的onehot編碼中為1的位置(類別標號,是一個標量,如手寫數字識別,真實數字8的標號為7)。如果是批次數據,那就是每個數據交叉熵的求和求均值。
簡單的例子:手寫數字識別問題(1,2,3),網絡輸出采用的one-hot 編碼,實際上是一個概率分布。即給定一張數字為1的圖像,經過神經網絡處理過后,最期待網絡輸出的應該是:[1,0,0]。也就是說圖片為1的概率為1:p(圖片為1)=1p(圖片為1)=1p(圖片為1)=1,p(圖片為2)=0p(圖片為2)=0p(圖片為2)=0,p(圖片為3)=0p(圖片為3)=0p(圖片為3)=0。但網絡實際輸出[0.5,0.2,0.3](也應該是一個概率分布),也就是說q(圖片為1)=0.5q(圖片為1)=0.5q(圖片為1)=0.5,q(圖片為2)=0.2q(圖片為2)=0.2q(圖片為2)=0.2,q(圖片為3)=0.3q(圖片為3)=0.3q(圖片為3)=0.3。依據公式計算交叉熵。
交叉差熵損失函數使用例子:
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 10), requires_grad=True) #minibatch=3,即3行,每一行為一個10維向量
target = torch.empty(3, dtype=torch.long).random_(10) # 1行,3列,每一列的數字為0-10之間的整數
output = loss(input, target)
output.backward()
2.3 NLLLoss()
同時,pytorch 還提供了nn.LogSoftmax()與NLLLoss()的組合,實現交叉熵損失函數。此時,網絡的最后一層加權輸出,要經過nn.LogSoftmax()進行激活;
NLLLoss()使用例子:
m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
#input is of size N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
#each element in target has to have 0 <= value < C
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward()
2.4 BCELoss()
pytorch 提供了二元交叉熵損失函數,用于處理二分類問題。
簡單情況:單個樣本時,最后一層網絡輸出應該為概率值,表示這個樣本是一個類別的概率。因此,最后一層的輸出應為sigmoid()[sigmoid()函數與概率對應關系再論]。因此這個網絡輸出與目標輸出之間的交叉熵為:
ln=?(ynlogxn+(1?yn)log(1?xn))l_n=-(y_nlogx_n+(1-y_n)log(1-x_n))ln?=?(yn?logxn?+(1?yn?)log(1?xn?))
yny_nyn?為第n 個樣本為真的概率,xnx_nxn?第n 個樣本為真的網絡輸出概率。在實際二分類問題中,y_n為0或者1(標簽設置準則)。
官網文檔連接(英文):https://pytorch.org/docs/stable/nn.html
總結
以上是生活随笔為你收集整理的MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Projection投影
- 下一篇: 无限踩坑系列(6)-mySQL数据库链接