Pytorch中常用损失函数的数学原理

x x x表示输出序列, y y y表示目标序列, rms ⁡ \operatorname{rms} rms表示均方根, L = { l 1 ⋯ l n } L=\{l_1\cdots l_n\} L={ l1ln}

将mini-batch译为小批。

1 L1Loss

L 1 = ∣ x − y ∣ L_1=|x-y| L1=xy


2 MSELoss

L = rms ⁡ ( L 1 ) L=\operatorname{rms}(L_1) L=rms(L1)


3 CrossEntropyLoss

L = ∑ j y j ∑ i y i ( − log ⁡ e x j ∑ i e x i ) L =\sum_j \frac{y_j}{\sum_i y_i}(-\log\frac{e^{x_j}}{\sum_i e^{x_i}}) L=jiyiyj(logiexiexj)

注解

熵是基于信息量这个概念,信息量被定义为概率分布的对数。例如现有事件空间X,其中 x ∈ X x\in X xX发生的概率为 P ( X = x ) = p ( x ) P(X=x)=p(x) P(X=x)=p(x),则对于 X = x X=x X=x的信息量为 I ( x ) = − log ⁡ p ( x ) I(x)=-\log p(x) I(x)=logp(x)

可见概率越大的事件发生,则信息量越小,当 p ( x ) = 1 p(x)=1 p(x)=1时, x x x为必然事件,此时信息量为0。例如 1 + 1 = 2 1+1=2 1+1=2是必然的,那么当我们看到 1 + 1 = 2 1+1=2 1+1=2的时候,内心毫无波澜;但万一发现 1 + 1 = 3 1+1=3 1+1=3成立,那信息量太大将导致心态爆炸。

熵则表示系统中信息量总和,信息量越大代表越混乱。简单起见,考虑两点分布,对于事件 x x x,其发生的概率为 p p p,则不发生的概率为 1 − p 1-p 1p,则其熵为这两种可能信息的期望:

H ( x ) = P ( x ) I ( x ) + P ( x ˉ ) I ( x ˉ ) = − p log ⁡ p − ( 1 − p ) log ⁡ ( 1 − p ) \begin{aligned} H(x) &= P(x)I(x)+P(\bar x)I(\bar x)\\ &= -p\log p-(1-p)\log(1-p) \end{aligned} H(x)=P(x)I(x)+P(xˉ)I(xˉ)=plogp(1p)log(1p)

若取对数的底为 a a a,则

H ′ ( p ) = − ln ⁡ p − p 1 p ln ⁡ a + ln ⁡ ( 1 − p ) − ( 1 − p ) − 1 ( 1 − p ) ln ⁡ a = − ln ⁡ p − 1 ln ⁡ a + ln ⁡ ( 1 − p ) − ( − 1 ln ⁡ a ) = ln ⁡ 1 − p p \begin{aligned} H'(p)&=-\ln p-p\frac{1}{p\ln a}+\ln(1-p)-(1-p)\frac{-1}{(1-p)\ln a}\\ &=-\ln p-\frac{1}{\ln a}+\ln(1-p)-(-\frac{1}{\ln a})\\ &=\ln\frac{1-p}{p} \end{aligned} H(p)=lnppplna1+ln(1p)(1p)(1p)lna1=lnplna1+ln(1p)(lna1)=lnp1p

则当 p = 0.5 p=0.5 p=0.5时, H ′ ( p ) = 0 , H ′ ′ ( 0.5 ) = − 4 < 0 H'(p)=0,H''(0.5)=-4<0 H(p)=0,H(0.5)=4<0,代表此时有极大值。也就时说,发生与不发生的概率越是接近,则代表熵越大,即不确定性越大。

假设 x i ∈ X x_i\in X xiX为一组随机变量,其发生的概率为 p i p_i pi,则其熵为

H ( X ) = ∑ − p i log ⁡ p i , ∑ p i = 1 H(X)=\sum -p_i\log p_i,\quad \sum p_i=1 H(X)=pilogpi,pi=1

如果现有一组样本,概率分布为 q i q_i qi,则其对应的信息量为 − log ⁡ q i -\log q_i logqi。而我们希望这组样本的概率分布为 p i p_i pi

对于事件 x i x_i xi而言,样本与目标信息量之差可以衡量样本与目标概率的相似程度;那么对于全体事件 X X X来说,这个信息差的期望则可以起到相似性度量的作用,即

D K L = ∑ p i ( log ⁡ p i − log ⁡ q i ) D_{KL}=\sum p_i(\log p_i- \log q_i) DKL=pi(logpilogqi)

此即K-L散度,又叫相对熵,其绝对值越小,则代表样本和目标分布越相似。

目标概率分布 p i p_i pi往往是已知的,所以

D K L = ∑ p i log ⁡ p i − ∑ p i log ⁡ q i D_{KL}=\sum p_i\log p_i- \sum p_i\log q_i DKL=pilogpipilogqi

其取值将取决于第二项,此即交叉熵的来源

H ( p , q ) = − ∑ p i log ⁡ q i H(p,q)=- \sum p_i\log q_i H(p,q)=pilogqi

交叉熵恒大于0,故交叉熵越小,则样本分布越接近于目标分布。

在Pytorch中, y i ∑ i y i \frac{y_i}{\sum_i y_i} iyiyi代表第 i i i种类别的目标概率; e x i ∑ i e x i \frac{e^{x_i}}{\sum_i e^{x_i}} iexiexi则代表第 i i i种类别的输出概率。整理一下正是交叉熵公式。


4 KLDivLoss

即KL散度,详解见3.


5 BCELoss

即二进制交叉熵(Binary cross entropy)。

交叉熵即

H ( p , q ) = − ∑ p i log ⁡ q i H(p,q)=- \sum p_i\log q_i H(p,q)=pilogqi

其中, p i , q i p_i, q_i pi,qi分别表示目标和样本的概率分布。

对于二项分布而言,其交叉熵中的 q i q_i qi可以分为两种:即事件发生与事件不发生,分别表示为 y , 1 − y y, 1-y y,1y,相应地,目标样本的概率可以写为 y ^ , 1 − y ^ \hat y, 1-\hat y y^,1y^

− y ln ⁡ y ^ − ( 1 − y ) ln ⁡ ( 1 − y ^ ) -y\ln\hat y-(1-y)\ln(1-\hat y) ylny^(1y)ln(1y^)

对于批量样本 { x i , y i } \{x_i, y_i\} { xi,yi},其样本概率也将不再唯一,可写为 y ^ i \hat y_i y^i,从而交叉熵的均值可以表示为

L B S E = ∑ i − y i ln ⁡ x i − ( 1 − y i ) ln ⁡ ( 1 − x i ) L_{BSE}=\sum_i-y_i\ln x_i-(1-y_i)\ln(1-x_i) LBSE=iyilnxi(1yi)ln(1xi)

例如下表的4组样本

i i i y i y_i yi x i x_i xi
0 1 0.8
1 0 0.1
2 0 0.1
3 1 0.9

则计算可得 L B S E = 0.53 L_{BSE}=0.53 LBSE=0.53


6 BCEWithLogits

即在同一个类中封装了BCELoss外加一个Sigmoid层。

L = ∑ i − y i ln ⁡ σ ( x i ) − ( 1 − y i ) ln ⁡ ( 1 − σ ( x i ) ) L=\sum_i-y_i\ln\sigma(x_i)-(1-y_i)\ln(1-\sigma(x_i)) L=iyilnσ(xi)(1yi)ln(1σ(xi))


7 MarginRanking

可译为边距排序,其表达式为

L ( x 1 , x 2 , y ) = max ⁡ ( 0 , − y ⋅ ( x 1 − x 2 ) + m ⁡ ) L(x_1,x_2,y)=\max(0,-y\cdot(x_1-x_2)+\operatorname{m}) L(x1,x2,y)=max(0,y(x1x2)+m)

y y y可取值1或者-1,从而上式变为

L 1 ( x 1 , x 2 ) = max ⁡ ( 0 , x 2 − x 1 + m ⁡ ) L − 1 ( x 1 , x 2 ) = max ⁡ ( 0 , x 1 − x 2 + m ⁡ ) L_1(x_1,x_2)=\max(0,x_2-x_1+\operatorname{m})\\ L_{-1}(x_1,x_2)=\max(0,x_1-x_2+\operatorname{m}) L1(x1,x2)=max(0,x2x1+m)L1(x1,x2)=max(0,x1x2+m)

由于这两种情况呈现出完全相反的两种次序关系,所以只分析 L 1 L_1 L1,则此时损失函数不为0的条件为 x 2 > x 1 − m ⁡ x_2>x_1-\operatorname{m} x2>x1m


8 HingeEmbedding

Hinge损失也针对二分类的情况,对于标签 y n y_n yn,可以取值为1或者-1,则损失为

l n = { x n , y n = 1 max ⁡ 0 , Δ − x ) n , y n = − 1 l_n=\left\{\begin{aligned} &x_n,&y_n&=1\\ &\max{0,\Delta-x)n},&y_n&=-1 \end{aligned} \right. ln={ xn,max0,Δx)n,ynyn=1=1

而总损失可以是 l n l_n ln的均值或和。


9 MultiLabelMargin

即多标签分类损失,是Hinge的多标签扩展,可以表示为

L ( x , y ) = ∑ i , j max ⁡ ( 0 , 1 − ( x [ y j ] − x [ i ] ) ) x . s i z e [ 0 ] L(x,y)=\sum_{i,j}\frac{\max(0,1-(x[y_j]-x[i]))}{x.size[0]} L(x,y)=i,jx.size[0]max(0,1(x[yj]x[i]))


10 HuberLoss

Huber损失结合了L1和MSE损失的优点,

l n = { 0.5 ( x n − y n ) 2 , if ∣ x n − y n ∣ < δ δ ( ∣ x n − y n ∣ − 0.5 δ ) l_n=\left\{\begin{aligned} &0.5(x_n-y_n)^2,\quad \text{if} \vert x_n-y_n \vert < \delta\\ &\delta(\vert x_n-y_n \vert-0.5\delta) \end{aligned}\right. ln={ 0.5(xnyn)2,ifxnyn<δδ(xnyn0.5δ)

δ → ∞ \delta\to\infty δ时,即退化为MSELoss。


11 SmoothL1

即平滑版的L1损失,和MSE相比对异常值不敏感。

l n = { 0.5 ( x n − y n ) 2 / β , if ∣ x n − y n ∣ < β ∣ x n − y n ∣ − 0.5 β l_n=\left\{\begin{aligned} &0.5(x_n-y_n)^2/\beta,\quad \text{if}\quad\vert x_n-y_n \vert < \beta\\ &\vert x_n-y_n \vert-0.5\beta \end{aligned}\right. ln={ 0.5(xnyn)2/β,ifxnyn<βxnyn0.5β


12 SoftMargin

为2分类的logistic损失,通过输入张量 x x x和输出张量 y y y来构建损失函数

L ( x , y ) = 1 N ∑ i log ⁡ [ 1 + exp ⁡ ( − x i y i ) ] L(x,y)=\frac{1}{N}\sum_i\log[1+\exp(-x_iy_i)] L(x,y)=N1ilog[1+exp(xiyi)]


13 MultiLabelSoftMargin

输入 x x x的尺寸为 N × C N\times C N×C,令 y i = ± 1 y_i=\pm1 yi=±1,则其损失函数如下

L ( x , y ) = − 1 C ∑ i y i log ⁡ 1 1 + exp ⁡ ( − x i ) + ( 1 − y i ) log ⁡ exp ⁡ ( − x i ) 1 + exp ⁡ ( − x i ) L(x,y)=-\frac{1}{C}\sum_i y_i\log\frac{1}{1+\exp(-x_i)}+(1-y_i)\log\frac{\exp(-x_i)}{1+\exp(-x_i)} L(x,y)=C1iyilog1+exp(xi)1+(1yi)log1+exp(xi)exp(xi)


14 CosinieEmbedding

即余弦损失。

L ( x , y ) = { 1 − cos ⁡ ( x 1 , x 2 ) , if y = 1 max ⁡ ( 0 , cos ⁡ ( x 1 , x 2 ) − M ) if y = − 1 L(x,y)=\left\{\begin{aligned} &1-\cos(x_1,x_2),&\text{if}&\quad y=1\\ &\max(0,\cos(x_1,x_2)-M)&\text{if}&\quad y=-1 \end{aligned}\right. L(x,y)={ 1cos(x1,x2),max(0,cos(x1,x2)M)ifify=1y=1

其中, M ∈ ( − 1 , 1 ) M\in(-1,1) M(1,1),推荐区间为 ( 0 , 0.5 ) (0,0.5) (0,0.5)

cos ⁡ ( x , y ) \cos(x,y) cos(x,y)为余弦距离,表达式为

cos ⁡ ( x , y ) = ∑ i x i y i ∑ i x i 2 ∑ i y i 2 \cos(x,y)=\frac{\sum_i{x_iy_i}}{\sqrt{\sum_ix_i^2}\sqrt{\sum_iy_i^2}} cos(x,y)=ixi2 iyi2 ixiyi


15 MultiMargin

L ( x , y ) = ∑ i ≠ y max ⁡ ( 0 , M − x y + x i ) p N L(x,y)=\frac{\sum_{i\not=y}\max(0,M-x_y+x_i)^p}{N} L(x,y)=Ni=ymax(0,Mxy+xi)p

其中,输入 x x x是二维的小批张量(mini-batch tensor), y ∈ ( 0 , N ) y\in(0,N) y(0,N)


16 TripletMargin

L ( α , β , γ ) = max ⁡ ( ∥ α i − β i ∥ p − ∥ α i − γ i ∥ p + m , 0 ) L(\alpha,\beta,\gamma)=\max\big(\Vert \alpha_i-\beta_i\Vert_p-\Vert\alpha_i-\gamma_i\Vert_p+m,0\big) L(α,β,γ)=max(αiβipαiγip+m,0)

即三元组损失,其中 α , β , γ \alpha,\beta,\gamma α,β,γ为输入的三个同维度张量。


17 CTC

L ( s ) = − ln ⁡ Π ( x , z ) ∈ S P ( z ∣ x ) = − ∑ ( x , z ) ∈ S ln ⁡ P ( z ∣ x ) L(s)=-\ln\Pi_{(x,z)\in S}P(z|x)=-\sum_{(x,z)\in S}\ln P(z|x) L(s)=lnΠ(x,z)SP(zx)=(x,z)SlnP(zx)

x x x为输入,记 y k t y_k^t ykt t t t输出 k k k的概率, π t \pi_t πt表示路径 π \pi π t t t时刻的值。若 y y y在不同时刻是互相独立的,则输入 x x x输出 π \pi π路径的概率为

p ( π ∣ x ) = ∏ t = 1 T y π t t , ∀ π ∈ L ′ T p(\pi|x)=\prod^T_{t=1}y^t_{\pi_t},\forall\pi\in L'^T p(πx)=t=1Tyπtt,πLT

其中, L L L是标签集合, L ′ = L ∪ { b l a n k } L'=L\cup\{blank\} L=L{ blank}

z z z表示最终的标签,则

p ( z ∣ x ) = ∑ π ∈ B − 1 ( z ) p ( π ∣ x ) , B ( π ) = z p(z|x)=\sum_{\pi\in B^{-1}(z)}p(\pi|x),\quad B(\pi)=z p(zx)=πB1(z)p(πx),B(π)=z

则根据损失函数的定义,可计算其递推关系。

18 NLL

负对数似然损失的表达式可以写为

L = ∑ − log ⁡ x [ y ] L=\sum-\log x[y] L=logx[y]

但在pytorch中并未取对数,所以需要在适用NLLLoss之前,进行softmax和对数的运算。

softmax是一种概率归一化方法,定义为

S ( x i ) = exp ⁡ x i ∑ j exp ⁡ x j S(x_i)=\frac{\exp x_i}{\sum_j\exp x_j} S(xi)=jexpxjexpxi

而pytorch中的LogSoftmax则为

L S ( x i ) = log ⁡ exp ⁡ x i ∑ j exp ⁡ x j LS(x_i)=\log\frac{\exp x_i}{\sum_j\exp x_j} LS(xi)=logjexpxjexpxi

猜你喜欢

转载自blog.csdn.net/m0_37816922/article/details/124074069
今日推荐