pytorch中CrossEntropyLoss和NLLLoss的区别与联系
pytorch中CrossEntropyLoss和NLLLoss的區(qū)別與聯(lián)系
CrossEntropyLoss和NLLLoss主要是用在多分類問題的損失函數(shù),他們兩個既有不同,也有不淺的聯(lián)系。先分別看一下:
CrossEntropyLoss
稱為交叉熵損失函數(shù),主要的計算公式為:
loss(x,class)=?log(eclass∑j(ex[j]))loss(x,class)=-log(\frac{e^{class}}{\sum_j(e^{x[j]})})loss(x,class)=?log(∑j?(ex[j])eclass?)
其中eclasse^{class}eclass表示某個輸出的指數(shù),∑j(ex[j])\sum_j(e^{x[j]})∑j?(ex[j])表示所有輸出的指數(shù)的累加,指數(shù)的使用保證操作后的值大于0,除以累加和保證了所有值加起來和為1
具體的官方文檔:
NLLLoss
這個損失函數(shù)的全稱為負對數(shù)似然損失(The negative log likelihood loss),具體的公式如下:
l(x,y)=L={l1,l2,...,lN}T,ln=?WynXn,yn,Wc=weight[c]?1l(x,y)=L=\{l_1,l_2,...,l_N\}^T,l_n = -W_{y_n}X_{n,y_n},W_c = weight[c]*1l(x,y)=L={l1?,l2?,...,lN?}T,ln?=?Wyn??Xn,yn??,Wc?=weight[c]?1
其中X為輸入,W為權重,上述公式為reduction=none時的損失函數(shù)計算。WynW_{y_n}Wyn??就表示對應于yny_nyn?類的權重,X也是同樣的道理,N為batch size的大小。
f(n)={∑n=1N1∑n=1NWyn,if?reduction=?mean∑n=1Nln,if?reduction=?sumf(n)= \begin{cases} \sum_{n=1}^N\frac{1}{\sum_{n=1}^NW_{y_n}}, & \text {if $reduction$ = mean} \\ \sum_{n=1}^Nl_n, & \text{if $reduction$ = sum} \end{cases}f(n)={∑n=1N?∑n=1N?Wyn??1?,∑n=1N?ln?,?if?reduction?=?meanif?reduction?=?sum?
官方的文檔為:
區(qū)別
對于CrossEntropyLoss來說網(wǎng)絡的最后一層線性層的輸出可以直接作為該損失函數(shù)的輸入。
對于NLLLoss來說網(wǎng)絡的最后一層線性層的輸入不能直接使用,需要額外加一層.LogSoftmax來對線性的輸出做如下操作:
log(11+e(?X))log(\frac{{1}}{1+e^{(-X)}})log(1+e(?X)1?)
經(jīng)過LogSoftmax后的輸出作為NLLLoss的輸入。
聯(lián)系
從功能實現(xiàn)來說:
CrossEntropyLoss=LogSoftmax層+NLLLossCrossEntropyLoss = LogSoftmax層 + NLLLossCrossEntropyLoss=LogSoftmax層+NLLLoss
在代碼編寫使用中的區(qū)別
總結
以上是生活随笔為你收集整理的pytorch中CrossEntropyLoss和NLLLoss的区别与联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动图-完整清晰展示TCP的三次握手与四次
- 下一篇: 高中必背88个数学公式_俞敏洪:高中干货