pytorch中CrossEntropyLoss和NLLLoss的区别与联系
pytorch中CrossEntropyLoss和NLLLoss的區別與聯系
CrossEntropyLoss和NLLLoss主要是用在多分類問題的損失函數,他們兩個既有不同,也有不淺的聯系。先分別看一下:
CrossEntropyLoss
稱為交叉熵損失函數,主要的計算公式為:
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表示某個輸出的指數,∑j(ex[j])\sum_j(e^{x[j]})∑j?(ex[j])表示所有輸出的指數的累加,指數的使用保證操作后的值大于0,除以累加和保證了所有值加起來和為1
具體的官方文檔:
NLLLoss
這個損失函數的全稱為負對數似然損失(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時的損失函數計算。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?
官方的文檔為:
區別
對于CrossEntropyLoss來說網絡的最后一層線性層的輸出可以直接作為該損失函數的輸入。
對于NLLLoss來說網絡的最后一層線性層的輸入不能直接使用,需要額外加一層.LogSoftmax來對線性的輸出做如下操作:
log(11+e(?X))log(\frac{{1}}{1+e^{(-X)}})log(1+e(?X)1?)
經過LogSoftmax后的輸出作為NLLLoss的輸入。
聯系
從功能實現來說:
CrossEntropyLoss=LogSoftmax層+NLLLossCrossEntropyLoss = LogSoftmax層 + NLLLossCrossEntropyLoss=LogSoftmax層+NLLLoss
在代碼編寫使用中的區別
總結
以上是生活随笔為你收集整理的pytorch中CrossEntropyLoss和NLLLoss的区别与联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动图-完整清晰展示TCP的三次握手与四次
- 下一篇: 高中必背88个数学公式_俞敏洪:高中干货