从似然到交叉熵:极大似然、对数似然、负对数似然、Pytorch

从似然到交叉熵:极大似然、对数似然、负对数似然、Pytorch

此篇我们将从似然的定义出发,逐步推导出负对数似然,再与交叉熵对比。

全篇说人话。

同时会介绍pytorch的部分API。

1. Definition of max likelihood

在很多时候,Probability与Likelihood是相同的,但是在统计学中,两者是有区别的。

我们想象两个事物,一个是模型、是理想的;一个是事实、是现实的。

事实的期望与模型是相当的,但是事实具有现实性,因此其与模型是不尽相同的。

Probability是在模型已知的情况下,事实发生的概率。

例如,已经有了一个硬币(投硬币的模型已知,当然是用无数次事实而得来的近似的期望计算而来),我们去估计还没有发生的事实(投出的硬币是正是反)。

Likelihood则恰恰相反,事实已经发生了(可以发生一次可以发生无数次),我们需要去估计这个模型(在机器学习中则是估计模型的参数)。

例如,我们已经投了十次硬币,六次是正面的,我们去估计投硬币的模型(在机器学习则可以表现为,估计硬币正面朝上的概率θ)

他们表达的其实是同一件事,只是立足于不同的角度。因此两者在数值上是相同的,但在意义上是不同的。
P ( X ∣ θ ) = L ( θ ∣ X ) (1) P(X|θ) = L(θ|X)\tag{1} P(Xθ)=L(θX)(1)

2. The process from MLE to CrossEntropyLoss

2.1. Maximum likelihood estimation(MLE)

用一句话概括似然:

现实下已经发生了这件事,他在理论世界中对应某个A模型的可能性 叫做A模型的似然值。

当我们理解了似然,自然极大似然也就出来了。我们就是想求得具有最大似然值的模型,也就是其最有可能性对应的模型。

给定一个概率模型 D \mathcal{D} D,已知其概率密度函数(离散型为概率分布函数)为 f θ D f_θ\mathcal{D} fθD,其中θ是模型的参数。

我们可以从这个模型中抽出一个具有n个值的采样(batch_size) ( X 1 , X 2 , X 3 , . . . , X n ) (X_1,X_2,X_3,...,X_n) (X1,X2,X3,...,Xn),利用 f θ D f_θ\mathcal{D} fθD计算其似然。
L ( θ ∣ X 1 , X 2 , . . . , X n ) = P ( X 1 , X 2 , . . . , X n ∣ θ ) (2) L(θ|X_1,X_2,...,X_n) = P(X_1,X_2,...,X_n|θ)\tag{2} L(θX1,X2,...,Xn)=P(X1,X2,...,Xnθ)(2)

由于机器学习基本假设——样本独立,可以将(2)式推导:
P ( X 1 , X 2 , . . . , X n ) = ∏ i = 1 n f θ ( X i ) (3) P(X_1,X_2,...,X_n)=\prod_{i=1}^n f_θ(X_i)\tag{3} P(X1,X2,...,Xn)=i=1nfθ(Xi)(3)

此式中,我们能够看出我们只要一旦获得一组采样,我们就能获得一个关于θ的似然函数。

从数学上来说,我们可以在所有的θ中取到一个θ,使其带入似然函数中时,使似然函数最大,那么这个θ就是极大似然估计。即
θ ^ = arg ⁡ max ⁡ θ L ( θ ∣ X 1 , X 2 , . . . , X n ) . (4) \hat{θ} =\arg\max\limits_{θ}{L(θ|X_1,X_2,...,X_n)}.\tag{4} θ^=argθmaxL(θX1,X2,...,Xn).(4)

E2.1.1 MLE in Binary problem

考虑二分类问题。
y ^ θ = σ ( t θ ( x ) ) (5) \hat{y}_θ = \sigma(t_θ(x))\tag{5} y^θ=σ(tθ(x))(5)
此处, y ^ θ \hat{y}_θ y^θ为预测为正样本的概率。 t θ ( x ) t_θ(x) tθ(x)是带有参数的线性变换, σ ( x ) \sigma(x) σ(x)为非线性变换函数。

特别注意一点,在此处 σ ( t θ ( x ) ) \sigma(t_θ(x)) σ(tθ(x))对应的是模型的概率密度函数 f θ D f_θ\mathcal{D} fθD

那么,
L ( θ ∣ X 1 , X 2 , . . . , X n ) = P ( X 1 , X 2 , . . . , X n ∣ θ ) = ∏ i = 1 n ( y ^ θ , i ) y i ( 1 − y ^ θ , i ) 1 − y i \begin{align} L(θ|X_1,X_2,...,X_n) =&P(X_1,X_2,...,X_n|θ) \nonumber \\ =&\prod_{i=1}^n (\hat{y}_{θ,i})^{y_i}(1-\hat{y}_{θ,i})^{1-y_i}\tag{6} \end{align} L(θX1,X2,...,Xn)==P(X1,X2,...,Xnθ)i=1n(y^θ,i)yi(1y^θ,i)1yi(6)
此式中, y i y_i yi代表第i个样本真实的情况,0代表反例,1代表真例。显然,当真实为真例时,前项作用;反之,后项作用。

2.2. Log-Likelihood

为方便计算,我们将Likelihood加了个对数即变为了Log-Likelihood

E2.2.1 Log-Likelihood in Binary problem

l o g L ( θ ∣ X 1 , X 2 , . . . , X n ) = l o g P ( X 1 , X 2 , . . . , X n ∣ θ )   = ∑ i = 1 n ( y i l o g ( y ^ θ , i ) + ( 1 − y i ) l o g ( 1 − y ^ θ , i ) ) \begin{align} logL(θ|X_1,X_2,...,X_n)=&logP(X_1,X_2,...,X_n|θ) \nonumber \\ ~=&\sum_{i=1}^n (y_ilog(\hat{y}_{θ,i})+(1-y_i)log(1-\hat{y}_{θ,i}))\tag{7} \end{align} logL(θX1,X2,...,Xn)= =logP(X1,X2,...,Xnθ)i=1n(yilog(y^θ,i)+(1yi)log(1y^θ,i))(7)

2.3.Negative Log-Likelihood

由于此小结过于简短,我们不分出额外的E2.3.2,将Negative Log-Likelihood in Binary problem放在一起解释

在机器学习里,我们往往将损失函数作为需要优化的目标,将具有最小损失函数的模型称为optimum。

因此我们习惯于在(7)式上加上负号,使其变为,
l o g L ( θ ∣ X 1 , X 2 , . . . , X n ) = − ∑ i = 1 n ( y i l o g ( y ^ θ , i ) + ( 1 − y i ) l o g ( 1 − y ^ θ , i ) ) (8) logL(θ|X_1,X_2,...,X_n) =-\sum_{i=1}^n (y_ilog(\hat{y}_{θ,i})+(1-y_i)log(1-\hat{y}_{θ,i}))\tag{8} logL(θX1,X2,...,Xn)=i=1n(yilog(y^θ,i)+(1yi)log(1y^θ,i))(8)
这里简单的总结一下,我们当初的目标是获得最大似然 θ ^ \hat{θ} θ^,现在Negetive Log-Likelihood其实并没有背弃当初的目标,只是做了变换,虽然其极值发生了改变,但是其极值点的θ没有发生变化,依旧是极大似然估计 θ ^ \hat{θ} θ^

2.4. CrossEntropyLoss

其与Negetive Log-Likelihood在数学表达式上很相似,只不过是从不同的角度去理解这个问题。

交叉熵是信息论中衡量两个概率分布(模型)之间差异的指标。

负对数似然是通过概率论工具推导而来。

其实要较真的话,两者之间的差别还是有的,例如:在交叉熵中,log的底数一定是2是不可以改变的,因为其为熵在信息论中的定义。而在负对数似然中,log的底数是多少都无所谓,log存在的意义只不过是将连乘变为连加。

3. Generalize to Multiclass Classification

上面讨论的是二分类问题,而往往我们遇到的是多分类问题。
l o g L ( θ ∣ D ) = l o g ( D ∣ θ ) = ∑ i = 1 n l o g ( y ^ θ , i ( y i ) ) (9) logL(θ|\mathcal{D})=log(\mathcal{D}|θ) = \sum_{i=1}^n log(\hat{y}_{θ,i}^{(y_i)})\tag{9} logL(θD)=log(Dθ)=i=1nlog(y^θ,i(yi))(9)
注意,在此式, l o g ( y ^ θ , i ( y i ) ) log(\hat{y}_{θ,i}^{(y_i)}) log(y^θ,i(yi))中上标 ( y i ) (y_i) (yi)表示在C Classes分类问题中,仅对真实类别位置所对应概率值求对数。

用向量解释为: y ^ θ , i \hat{y}_{θ,i} y^θ,i为一维向量,长度为C。 y ^ θ , i ( y i ) \hat{y}_{θ,i}^{(y_i)} y^θ,i(yi)则为在 y ^ θ , i \hat{y}_{θ,i} y^θ,i中取出第 y i y_i yi个。

为统一表达,我们将二分类问题也转化为此方式方式:
l o g L ( θ ∣ X 1 , X 2 , . . . , X n ) = − ∑ i = 1 n ( l o g ( y ^ θ , i ( y i ) ) 其中, y ^ θ , i ( 1 ) = y ^ θ , i , y ^ θ , i ( 0 ) = 1 − y ^ θ , i (10) logL(θ|X_1,X_2,...,X_n) = -\sum_{i=1}^n (log(\hat{y}_{θ,i}^{(y_i)}) \tag{10}\\ 其中,\hat{y}_{θ,i}^{(1)} = \hat{y}_{θ,i},\hat{y}_{θ,i}^{(0)}=1-\hat{y}_{θ,i} logL(θX1,X2,...,Xn)=i=1n(log(y^θ,i(yi))其中,y^θ,i(1)=y^θ,i,y^θ,i(0)=1y^θ,i(10)

4. PytorchAPI

我会将PytorchAPI与上述推导过程对比说明。

4.1 logSoftMax

CLASStorch.nn.LogSoftmax(dim=None)

需要输入的是未经过normalized的输出(logits)。
L o g S o f t m a x ( x i ) = l o g ( e x p ( x i ) ∑ j e x p ( x j ) ) LogSoftmax(x_i) = log(\frac{exp(x_i)}{\sum_{j}exp(x_j)})\nonumber LogSoftmax(xi)=log(jexp(xj)exp(xi))
我们将(9)式变为:
l o g L ( θ ∣ D ) = ∑ i = 1 n l o g ( y ^ θ , i ( y i ) ) = ∑ i = 1 n ( l o g   y ^ θ , i ) ( y i ) logL(θ|\mathcal{D})=\sum_{i=1}^n log(\hat{y}_{θ,i}^{(y_i)})=\sum_{i=1}^n(log\,\hat{y}_{θ,i})^{(y_i)}\nonumber logL(θD)=i=1nlog(y^θ,i(yi))=i=1n(logy^θ,i)(yi)
这个函数的作用其实就是求出 l o g   y ^ θ , i log\,\hat{y}_{θ,i} logy^θ,i的部分。

对于多分类问题,得到的是normalized并且求了对数的输入,输出依旧是一个向量,也称log-probabilities。

4.2 NLLLOSS

torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction=‘mean’)

需要输入的是log-probabilities。input.shape = (batch_size,C)。

由于具体算法的实现,因此target应该属于range©。

因为其是用数组索引来实现仅取真实类别位置所对应概率值

l ( x , y ) = { l 1 , l 2 , . . . , l n } T 其中    l i = − w ( y i ) x i ( y i ) \begin{gather*} \mathcal{l}(x,y)=\{l_1,l_2,...,l_n\}^T\\ 其中\,\,l_i= -w^{(y^i)}x_i^{(y^i)} \end{gather*} l(x,y)={l1,l2,...,ln}T其中li=w(yi)xi(yi)

其中x是input,y是target,n是batch_size,w(weight)是每一个分类的权重。当你有一个不平衡的训练集时,设置w是很有用的。

如果参数中的reduction设置为:

  • none,直接返回l(x,y),向量,长度为batch_size
  • mean,返回其平均值,标量
  • sum,返回其和,标量。其实我们前三小节用的都是sum

4.3 CROSSENTROPYLOSS

torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction=‘mean’, label_smoothing=0.0)

需要输入的是未经过normalized的输出(logits)。input.shape=(batch_size,C)

由于具体算法的实现,因此target应该属于range©。
l ( x , y ) = { l 1 , l 2 , . . . , l n } T 其中    l i = − w ( y i ) l o g e x p ( x n ( y n ) ) ∑ c = 1 C e x p ( x n ( c ) ) \begin{gather*} \mathcal{l}(x,y)=\{l_1,l_2,...,l_n\}^T\\ 其中\,\,l_i= -w^{(y^i)}log\frac{exp(x_n^{(y^n)})}{\sum_{c=1}^Cexp(x_n^{(c)})} \end{gather*} l(x,y)={l1,l2,...,ln}T其中li=w(yi)logc=1Cexp(xn(c))exp(xn(yn))
如果参数中的reduction设置为:

  • none,直接返回l(x,y),向量,长度为batch_size
  • mean,返回其平均值,标量
  • sum,返回其和,标量。其实我们前三小节用的都是sum

为加深印象,同样将其与我们在前三节中的推导对应。

由于之前我们用的都是sum的loss,且我们没有设置weight,即为
l o s s = ∑ i = 1 n l n = ∑ i = 1 n l o g e x p ( x n ( y n ) ) ∑ c = 1 C e x p ( x n ( c ) ) loss= \sum_{i=1}^n l_n=\sum_{i=1}^n log\frac{exp(x_n^{(y^n)})}{\sum_{c=1}^Cexp(x_n^{(c)})}\nonumber loss=i=1nln=i=1nlogc=1Cexp(xn(c))exp(xn(yn))
与(9)式对比,发现,(9)式中的 y ^ θ , i \hat{y}_{θ,i} y^θ,i即为此式中的 e x p ( x n ) ∑ c = 1 C e x p ( x n ( c ) ) \frac{exp(x_n)}{\sum_{c=1}^Cexp(x_n^{(c)})} c=1Cexp(xn(c))exp(xn)

最后,其实CROSSENTROPYLOSS也就等于在NLLLOSS前加上logSoftMax。

Obtaining log-probabilities in a neural network is easily achieved by adding a LogSoftmax layer in the last layer of your network. You may use CrossEntropyLoss instead, if you prefer not to add an extra layer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值