Lesson 4.2 逻辑回归参数估计:极大似然估计、相对熵与交叉熵损失函数

news2024/11/28 19:49:59

文章目录

  • 一、逻辑回归参数估计基本思路
    • 1. 构建损失函数
    • 2. 损失函数求解
  • 二、利用极大似然估计进行参数估计
  • 三、熵、相对熵与交叉熵
    • 1. 熵(entropy)的基本概念与计算公式
    • 2. 熵的基本性质
    • 3. 相对熵(relative entropy)与交叉熵(cross entropy)
  • 四、交叉熵损失函数
    • 1. 单样本交叉熵计算
    • 2. 多样本交叉熵计算
    • 3. 对比极大似然估计函数
    • 4. 二分类交叉熵损失函数

  • 在模型基本结构构建完成之后,接下来我们开始讨论如何进行逻辑回归的参数估计。所谓参数估计,其实就是模型参数求解的更加具有统计学风格的称呼。根据逻辑回归的基本公式: y = 1 1 + e − ( w ^ T ⋅ x ^ ) y = \frac{1}{1+e^{-(\hat w^T \cdot \hat x)}} y=1+e(w^Tx^)1
  • 不难看出,逻辑回归的参数其实就是线性方程中的自变量系数和截距。不过由于加入了联系函数,逻辑回归的参数并不能像线性回归一样利用最小二乘法进行快速求解。
  • 当然,和所有的机器学习模型一样,要求解模型参数,就先必须构造损失函数,然后根据损失函数的基本情况寻找优化算法求解。
  • 对于逻辑回归来说,有两种不同的方法来创建和求解损失函数,两种方法出发点各不相同但却殊途同归:分别是极大似然估计(Maximum Likelihood Estimate)和通过相对熵(relative entropy)构建交叉熵损失函数。
# 科学计算模块
import numpy as np
import pandas as pd

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

# 自定义模块
from ML_basic_function import *

一、逻辑回归参数估计基本思路

  • 尽管逻辑回归的损失函数构建过程比较复杂,但逻辑回归的损失函数的基本形式比较容易理解。
  • 因此首先我们先通过一个简单的例子来讨论关于逻辑回归的参数估计的基本思路,即损失函数构建和求解的一般思路。

1. 构建损失函数

  • 现有简单数据集如下:
sepal_lengthspecies
10
31
  • 由于只有一个特征,因此可以构建逻辑回归模型为: y = s i g m o i d ( w x + b ) = 1 1 + e − ( w x + b ) y=sigmoid(wx+b)=\frac{1}{1+e^{-(wx+b)}} y=sigmoid(wx+b)=1+e(wx+b)1
  • 我们将模型输出结果视作概率,则分别带入两条数据可得模型输出结果为: p ( y = 1 ∣ x = 1 ) = 1 1 + e − ( w + b ) p(y=1|x=1)=\frac{1}{1+e^{-(w+b)}} p(y=1∣x=1)=1+e(w+b)1 p ( y = 1 ∣ x = 3 ) = 1 1 + e − ( 3 w + b ) p(y=1|x=3)=\frac{1}{1+e^{-(3w+b)}} p(y=1∣x=3)=1+e(3w+b)1
  • 其中 p ( y = 1 ∣ x = 1 ) p(y=1|x=1) p(y=1∣x=1) 表示 x x x 取值为 1 时 y y y 取值为 1 的条件概率。
  • 两条数据的真实情况为第一条数据 y y y 取值为 0,而第二条数据 y y y 取值为 1,因此我们可以计算 p ( y = 0 ∣ x = 1 ) p(y=0|x=1) p(y=0∣x=1) 如下: p ( y = 0 ∣ x = 1 ) = 1 − p ( y = 1 ∣ x = 1 ) = 1 − 1 1 + e − ( w + b ) = e − ( w + b ) 1 + e − ( w + b ) p(y=0|x=1) = 1-p(y=1|x=1)=1-\frac{1}{1+e^{-(w+b)}}=\frac{e^{-(w+b)}}{1+e^{-(w+b)}} p(y=0∣x=1)=1p(y=1∣x=1)=11+e(w+b)1=1+e(w+b)e(w+b)
  • 即:
sepal_lengthspecies1-predict0-predict
10 1 1 + e − ( w + b ) \frac{1}{1+e^{-(w+b)}} 1+e(w+b)1 e − ( w + b ) 1 + e − ( w + b ) \frac{e^{-(w+b)}}{1+e^{-(w+b)}} 1+e(w+b)e(w+b)
31 1 1 + e − ( 3 w + b ) \frac{1}{1+e^{-(3w+b)}} 1+e(3w+b)1 e − ( 3 w + b ) 1 + e − ( 3 w + b ) \frac{e^{-(3w+b)}}{1+e^{-(3w+b)}} 1+e(3w+b)e(3w+b)
  • 一般来说,损失函数的构建目标和模型评估指标保持一致(例如 SSELoss 和 SSE),对于大多数分类模型来说,模型预测的准确率都是最基础的评估指标。
  • 此处如果我们希望模型预测结果尽可能准确,就等价于希望 p ( y = 0 ∣ x = 1 ) p(y=0|x=1) p(y=0∣x=1) p ( y = 1 ∣ x = 1 ) p(y=1|x=1) p(y=1∣x=1) 两个概率结果越大越好。该目标可以统一在求下式最大值的过程中: p ( y = 0 ∣ x = 1 ) ⋅ p ( y = 1 ∣ x = 3 ) p(y=0|x=1)\cdot p(y=1|x=3) p(y=0∣x=1)p(y=1∣x=3)
  • 即我们希望 x 取 1 时 y 取 0 和 x 取 3 时 y 取 1 的同时发生的概率越大越好。
  • 此外,考虑到损失函数一般都是求最小值,因此可将上式求最大值转化为对应负数结果求最小值,同时累乘也可以转化为对数相加结果,因此上式求最大值可等价于下式求最小值: L o g i t L o s s ( w , b ) = − l n ( p ( y = 1 ∣ x = 3 ) ) − l n ( p ( y = 0 ∣ x = 1 ) ) = − l n ( 1 1 + e − ( 3 w + b ) ) − l n ( e − ( w + b ) 1 + e − ( w + b ) ) = l n ( 1 + e − ( 3 w + b ) ) + l n ( 1 + 1 e − ( w + b ) ) = l n ( 1 + e − ( 3 w + b ) + e ( w + b ) + e − 2 w ) \begin{aligned} LogitLoss(w, b)&=-ln(p(y=1|x=3))-ln(p(y=0|x=1)) \\ &=-ln(\frac{1}{1+e^{-(3w+b)}})- ln(\frac{e^{-(w+b)}}{1+e^{-(w+b)}}) \\ &=ln(1+e^{-(3w+b)})+ln(1+\frac{1}{e^{-(w+b)}}) \\ &=ln(1+e^{-(3w+b)}+e^{(w+b)}+e^{-2w}) \end{aligned} LogitLoss(w,b)=ln(p(y=1∣x=3))ln(p(y=0∣x=1))=ln(1+e(3w+b)1)ln(1+e(w+b)e(w+b))=ln(1+e(3w+b))+ln(1+e(w+b)1)=ln(1+e(3w+b)+e(w+b)+e2w)
  • 至此我们即构建了一个由两条数据所构成的逻辑回归损失函数。
  • 注意,在上述损失函数的构建过程中有两个关键步骤,需要再次提醒。
  • (1) 是在将模型高准确率的诉求具象化为 p ( y = 0 ∣ x = 1 ) ⋅ p ( y = 1 ∣ x = 3 ) p(y=0|x=1)\cdot p(y=1|x=3) p(y=0∣x=1)p(y=1∣x=3) 参数的过程,此处我们为何不能采用类似 SSE 的计算思路取构建损失函数,即进行如下运算: ∣ ∣ y − y h a t ∣ ∣ 2 2 = ∣ ∣ y − 1 1 + e − ( w ^ T ⋅ x ^ ) ∣ ∣ 2 2 ||y-yhat||_2^2=||y-\frac{1}{1+e^{-(\hat w^T \cdot \hat x)}}||_2^2 ∣∣yyhat22=∣∣y1+e(w^Tx^)122
  • 我们一般不会采用该方法构建损失函数,其根本原因在于,在数学层面上我们可以证明,对于逻辑回归,当 y 属于 0-1 分类变量时, ∣ ∣ y − y h a t ∣ ∣ 2 2 ||y-yhat||_2^2 ∣∣yyhat22 损失函数并不是凸函数,而非凸的损失函数将对后续参数最优解求解造成很大麻烦。而相比之下,概率连乘所构建的损失函数是凸函数,可以快速求解出全域最小值。
  • (2) 在构建损失函数的过程中,我们需要将概率连乘改为对数累加,有一个很重要的原因是,在实际建模运算过程中,尤其是面对大量数据进行损失函数构建过程中,由于有多少条数据就要进行多少次累乘,而累乘的因子又是介于 (0,1) 之间的数,因此极有可能累乘得到一个非常小的数,而通用的计算框架计算精度有限,即有可能在累乘的过程中损失大量精度,而转化为对数累加之后能够很好的避免该问题的发生。

2. 损失函数求解

  • 从数学角度可以证明,按照上述构成构建的逻辑回归损失函数仍然是凸函数,此时我们仍然可以通过对 LogitLoss(w,b) 求偏导然后令偏导函数等于 0、再联立方程组的方式来对参数进行求解。
    ∂ L o g i t L o s s ( w , b ) ∂ w = 0 \frac{\partial LogitLoss(w,b)}{\partial w}=0 wLogitLoss(w,b)=0 ∂ L o g i t L o s s ( w , b ) ∂ b = 0 \frac{\partial LogitLoss(w,b)}{\partial b}=0 bLogitLoss(w,b)=0
  • 值得一提的是,上述构建损失函数和求解损失函数的过程,也被称为极大似然估计。接下来我们就将极大似然估计的方法推广到一般过程。

二、利用极大似然估计进行参数估计

  • 接下来,我们考虑更为一般的情况,围绕逻辑回归方程的一般形式,采用极大似然估计方法进行参数估计:
  • 逻辑回归模型: y = 1 1 + e − ( w ^ T ⋅ x ^ ) y = \frac{1}{1+e^{-(\hat w^T \cdot \hat x)}} y=1+e(w^Tx^)1
  • 其中: w ^ = [ w 1 , w 2 , . . . w d , b ] T , x ^ = [ x 1 , x 2 , . . . x d , 1 ] T \hat w = [w_1,w_2,...w_d, b]^T, \hat x = [x_1,x_2,...x_d, 1]^T w^=[w1,w2,...wd,b]T,x^=[x1,x2,...xd,1]T
  • 求解过程总共分为四个步骤,分别是:
  • (1) 确定似然项
  • 所谓似然函数,可简单理解为前例中累乘的函数。而累乘过程中的每个项,可称为似然项,不难发现,似然项其实和数据是一一对应的,带入多少条数据进行建模,似然函数中就有多少个似然项。
  • 我们知道,对于逻辑回归来说,当 w ^ \hat w w^ x ^ \hat x x^ 取得一组之后,既可以有一个概率预测输出结果,即: p ( y = 1 ∣ x ^ ; w ^ ) = 1 1 + e − ( w ^ T ⋅ x ^ ) p(y=1|\hat x;\hat w) = \frac{1}{1+e^{-(\hat w^T \cdot \hat x)}} p(y=1∣x^;w^)=1+e(w^Tx^)1
  • 而对应 y y y 取 0 的概率为: 1 − p ( y = 1 ∣ x ^ ; w ^ ) = 1 − 1 1 + e − ( w ^ T ⋅ x ^ ) = e − ( w ^ T ⋅ x ^ ) 1 + e − ( w ^ T ⋅ x ^ ) 1-p(y=1|\hat x;\hat w) =1- \frac{1}{1+e^{-(\hat w^T \cdot \hat x)}}=\frac{e^{-(\hat w^T \cdot \hat x)}}{1+e^{-(\hat w^T \cdot \hat x)}} 1p(y=1∣x^;w^)=11+e(w^Tx^)1=1+e(w^Tx^)e(w^Tx^)
  • 我们可以令 p 1 ( x ^ ; w ^ ) = p ( y = 1 ∣ x ^ ; w ^ ) p_1(\hat x;\hat w)=p(y=1|\hat x;\hat w) p1(x^;w^)=p(y=1∣x^;w^) p 0 ( x ^ ; w ^ ) = 1 − p ( y = 1 ∣ x ^ ; w ^ ) p_0(\hat x;\hat w)=1-p(y=1|\hat x;\hat w) p0(x^;w^)=1p(y=1∣x^;w^)
  • 因此,第 i i i 个数据所对应的似然项可以写成: p 1 ( x ^ ; w ^ ) y i ⋅ p 0 ( x ^ ; w ^ ) ( 1 − y i ) p_1(\hat x;\hat w)^{y_i} \cdot p_0(\hat x;\hat w)^{(1-y_i)} p1(x^;w^)yip0(x^;w^)(1yi)
  • 其中, y i y_i yi 表示第 i i i 条数据对应的类别标签。不难发现,当 y i = 0 y_i=0 yi=0 时,代表的是 i i i 第条数据标签为 0,此时需要带入似然函数的似然项是 p 0 ( x ^ ; w ^ ) p_0(\hat x;\hat w) p0(x^;w^)(因为希望 p 0 p_0 p0 的概率更大)。
  • 反之,当 y i = 1 y_i=1 yi=1 时,代表的是 i i i 第条数据标签为 1,此时需要带入似然函数的似然项是 p 1 ( x ^ ; w ^ ) p_1(\hat x;\hat w) p1(x^;w^)。上述似然项可以同时满足这两种不同的情况。
  • (2) 构建似然函数
  • 接下来,通过似然项的累乘计算极大似然函数: ∏ i = 1 N [ p 1 ( x ^ ; w ^ ) y i ⋅ p 0 ( x ^ ; w ^ ) ( 1 − y i ) ] \prod^N_{i=1}[p_1(\hat x;\hat w)^{y_i} \cdot p_0(\hat x;\hat w)^{(1-y_i)}] i=1N[p1(x^;w^)yip0(x^;w^)(1yi)]
  • (3) 进行对数转换
  • 然后即可在似然函数基础上对其进行(以 e 为底的)对数转换,为了方便后续利用优化方法求解最小值,同样我们考虑构建负数对数似然函数:
    L ( w ^ ) = − l n ( ∏ i = 1 N [ p 1 ( x ^ ; w ^ ) y i ⋅ p 0 ( x ^ ; w ^ ) ( 1 − y i ) ] ) = ∑ i = 1 N [ − y i ⋅ l n ( p 1 ( x ^ ; w ^ ) ) − ( 1 − y i ) ⋅ l n ( p 0 ( x ^ ; w ^ ) ) ] = ∑ i = 1 N [ − y i ⋅ l n ( p 1 ( x ^ ; w ^ ) ) − ( 1 − y i ) ⋅ l n ( 1 − p 1 ( x ^ ; w ^ ) ) ] \begin{aligned} L(\hat w) &= -ln(\prod^N_{i=1}[p_1(\hat x;\hat w)^{y_i} \cdot p_0(\hat x;\hat w)^{(1-y_i)}]) \\ &= \sum^N_{i=1}[-y_i \cdot ln(p_1(\hat x;\hat w))-(1-y_i) \cdot ln(p_0(\hat x;\hat w))] \\ &= \sum^N_{i=1}[-y_i \cdot ln(p_1(\hat x;\hat w))-(1-y_i) \cdot ln(1-p_1(\hat x;\hat w))] \end{aligned} L(w^)=ln(i=1N[p1(x^;w^)yip0(x^;w^)(1yi)])=i=1N[yiln(p1(x^;w^))(1yi)ln(p0(x^;w^))]=i=1N[yiln(p1(x^;w^))(1yi)ln(1p1(x^;w^))]
  • 公式推导致此即可,后续我们将借助该公式进行损失函数求解。
  • (4) 求解对数似然函数
  • 通过一系列数学过程可以证明,通过极大似然估计构建的损失函数是凸函数,此时我们可以采用导数为 0 联立方程组的方式进行求解,这也是极大似然估计对参数求解的一般方法。
  • 但这种方法会涉及大量的导数运算、方程组求解等,并不适用于大规模甚至是超大规模数值运算。
  • 因此,在机器学习领域,我们通常会采用一些更加通用的优化方法对逻辑回归的损失函数进行求解,通常来说是牛顿法或者梯度下降算法,其中,梯度下降算法是机器学习中最为通用的求解损失函数的优化算法。
  • 本节我们将继续介绍另外一种推导逻辑回归损失函数的方法—— KL 离散度计算法,并介绍有关信息熵、交叉熵等关键概念。
  • 由于模型本身和损失函数构建方式都和线性回归有所不同,逻辑回归的损失函数无法采用最小二乘法进行求解。

三、熵、相对熵与交叉熵

  • 接下来,我们介绍另一种构建逻辑回归损失函数的基本思路——借助相对熵(relative entropy,又称KL离散度)构建损失函数。
  • 尽管最终损失函数构建结果和极大似然估计相同,但该过程所涉及到的关于信息熵(entropy)、相对熵等概念却是包括 EM 算法、决策树算法等诸多机器学习算法的理论基础。

1. 熵(entropy)的基本概念与计算公式

  • 通常我们用熵(entropy)来表示随机变量不确定性的度量,或者说系统混乱程度、信息混乱程度。熵的计算公式如下: H ( X ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(X) = -\sum^n_{i=1}p(x_i)log(p(x_i)) H(X)=i=1np(xi)log(p(xi))
  • 其中, p ( x i ) p(x_i) p(xi) 表示多分类问题中第 i i i 个类别出现的概率, n n n 表示类别总数,通常来说信息熵的计算都取底数为 2,并且规定 l o g 0 = 0 log0=0 log0=0。举例说明信息熵计算过程,假设有二分类数据集 1 标签如下:
数据集1
indexlabels
10
21
31
41
  • 则信息熵的计算过程中 n = 2 n=2 n=2,令 p ( x 1 ) p(x_1) p(x1) 表示类别 0 的概率, p ( x 2 ) p(x_2) p(x2) 表示类别 1 的概率(反之亦然),则 p ( x 1 ) = 1 4 p(x_1)=\frac{1}{4} p(x1)=41 p ( x 2 ) = 3 4 p(x_2)=\frac{3}{4} p(x2)=43
  • 则该数据集的信息熵计算结果如下:
    H ( X ) = − ( p ( x 1 ) l o g ( p ( x 1 ) ) + p ( x 2 ) l o g ( p ( x 2 ) ) ) = − ( 1 4 ) l o g ( 1 4 ) − ( 3 4 ) l o g ( 3 4 ) \begin{aligned} H(X) &= -(p(x_1)log(p(x_1))+p(x_2)log(p(x_2))) \\ &=-(\frac{1}{4})log(\frac{1}{4})-(\frac{3}{4})log(\frac{3}{4}) \end{aligned} H(X)=(p(x1)log(p(x1))+p(x2)log(p(x2)))=(41)log(41)(43)log(43)
-1/4 * np.log2(1/4) - 3/4 * np.log2(3/4)
#0.8112781244591328
  • 当然,我们也可以定义信息熵计算函数
def entropy(p):
    if p == 0 or p == 1:
        ent = 0
    else:
        ent = -p * np.log2(p) - (1-p) * np.log2(1-p)
    return ent
  • 简单测试函数性能:
entropy(1/4)
#0.8112781244591328
  • 同时,在二分类问题中, n = 2 n=2 n=2 p ( x 1 ) + p ( x 2 ) = 1 p(x_1)+p(x_2)=1 p(x1)+p(x2)=1,我们也可推导二分类的信息熵计算公式为:
    H ( X ) = − p ( x ) l o g ( p ( x ) ) − ( 1 − p ( x ) ) l o g ( 1 − p ( x ) ) H(X) = -p(x)log(p(x))-(1-p(x))log(1-p(x)) H(X)=p(x)log(p(x))(1p(x))log(1p(x))
  • 其中 p ( x ) p(x) p(x) 为样本标签为 0 或 1 的概率。

2. 熵的基本性质

  • 可以证明,熵的计算结果在 [0,1] 之间,并且熵值越大,系统越混乱、信息越混乱。例如,有如下两个数据集,其中数据集 2 总共 4 条样本,0、1类各占 50%。
数据集2
indexlabels
10
21
30
41
  • 对于该数据集,我们可以计算信息熵为 H 1 ( X ) = − ( 1 2 ) l o g ( 1 2 ) − ( 1 2 ) l o g ( 1 2 ) H_1(X) = -(\frac{1}{2})log(\frac{1}{2})-(\frac{1}{2})log(\frac{1}{2}) H1(X)=(21)log(21)(21)log(21)
entropy(1/2)
#1.0
  • 此时信息熵达到最高值,也就代表对于上述二分类的数据集,标签随机变量的不确定性已经达到峰值。
  • 进一步我们计算下列数据集 3 的信息熵:
数据集3
indexlabels
11
21
31
41
  • 信息熵计算可得: H 1 ( X ) = − ( 4 4 ) l o g ( 4 4 ) − ( 0 4 ) l o g ( 0 4 ) = 0 H_1(X) = -(\frac{4}{4})log(\frac{4}{4})-(\frac{0}{4})log(\frac{0}{4})=0 H1(X)=(44)log(44)(40)log(40)=0
  • 这里需要注意的是,信息熵计算中规定 l o g 0 = 0 log0=0 log0=0
entropy(0)
#0
  • 此时信息熵取得最小值,也就代表标签的取值整体呈现非常确定的状态,系统信息规整。
  • 值得一提的是,此时标签本身的信息量也为 0,并没有进一步进行预测的必要。
  • 结合上述三个数据集,不难看出,当标签取值不均时信息熵较高,标签取值纯度较高时信息熵较低。
  • 假设 p 为未分类数据集中1样本所占比例,则数据集信息熵随着 p 变化为变化趋势如下:
p = np.linspace(0, 1, 50)
ent_l = [entropy(x) for x in p]
plt.plot(p, ent_l)
plt.xlabel('P')
plt.ylabel('Entropy')

在这里插入图片描述

3. 相对熵(relative entropy)与交叉熵(cross entropy)

  • 相对熵也被称为 Kullback-Leible r散度(KL 散度)或者信息散度(information divergence)。通常用来衡量两个随机变量分布的差异性。
  • 假设对同一个随机变量 X,有两个单独的概率分布 P(x) 和 Q(x),当 X 是离散变量时,我们可以通过如下相对熵计算公式来衡量二者差异:
    D K L ( P ∣ ∣ Q ) = ∑ i = 1 n P ( x i ) l o g ( P ( x i ) Q ( x i ) ) D_{KL}(P||Q)=\sum ^n_{i=1}P(x_i)log(\frac{P(x_i)}{Q(x_i)}) DKL(P∣∣Q)=i=1nP(xi)log(Q(xi)P(xi))
  • 和信息熵类似,相对熵越小,代表 Q(x) 和 P(x) 越接近。
  • 从交叉熵的计算公式不难看出,这其实是一种非对称性度量,也就是 D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q)≠D_{KL}(Q||P) DKL(P∣∣Q)=DKL(Q∣∣P)
  • 从本质上来说,相对熵刻画的是用概率分布 Q 来刻画概率分布 P 的困难程度,而在机器学习领域,我们一般令 Q 为模型输出结果,而 P 为数据集标签真实结果,以此来判断模型输出结果是否足够接近真实情况。
  • Q 为拟合分布 P 为真实分布,也被称为前向 KL 散度(forward KL divergence)
  • 当然,上述相对熵公式等价于:
    D K L ( P ∣ ∣ Q ) = ∑ i = 1 n P ( x i ) l o g ( P ( x i ) Q ( x i ) ) = ∑ i = 1 n P ( x i ) l o g ( P ( x i ) ) − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) = − H ( P ( x ) ) + [ − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) ] \begin{aligned} D_{KL}(P||Q)&=\sum ^n_{i=1}P(x_i)log(\frac{P(x_i)}{Q(x_i)}) \\ &=\sum ^n_{i=1}P(x_i)log(P(x_i))-\sum ^n_{i=1}P(x_i)log(Q(x_i)) \\ &=-H(P(x))+[-\sum ^n_{i=1}P(x_i)log(Q(x_i))] \end{aligned} DKL(P∣∣Q)=i=1nP(xi)log(Q(xi)P(xi))=i=1nP(xi)log(P(xi))i=1nP(xi)log(Q(xi))=H(P(x))+[i=1nP(xi)log(Q(xi))]
  • 而对于给定数据集,信息熵 H ( P ( X ) ) H(P(X)) H(P(X)) 是确定的,因此相对熵的大小完全由 − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) -\sum ^n_{i=1}P(x_i)log(Q(x_i)) i=1nP(xi)log(Q(xi)) 决定。
  • 该式计算结果也被称为交叉熵(cross entropy)计算
    c r o s s _ e n t r o p y ( P , Q ) = − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) cross\_entropy(P,Q) = -\sum ^n_{i=1}P(x_i)log(Q(x_i)) cross_entropy(P,Q)=i=1nP(xi)log(Q(xi))
  • 因此,如果我们希望 P、Q 二者分布尽可能接近,我们就需要尽可能减少相对熵,但由于相对熵 = 交叉熵 - 信息熵,因此我们只能力求减少交叉熵。
  • 当然,也正因如此,交叉熵可以作为衡量模型输出分布是否接近真实分布的重要度量方法。
  • 简单总结上述过程要点:
  • 我们用相对熵 D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q)来表示模型拟合分布Q和数据真实分布P之间的差距,相对熵越小拟合效果越好;
  • 根据计算公式, D K L ( P ∣ ∣ Q ) = − H ( P ( x ) ) + [ − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) ] D_{KL}(P||Q)=-H(P(x))+[-\sum ^n_{i=1}P(x_i)log(Q(x_i))] DKL(P∣∣Q)=H(P(x))+[i=1nP(xi)log(Q(xi))],相对熵=交叉熵-信息熵;
  • 对于给定数据集,信息熵是确定的,因此我们只能通过尽可能减小交叉熵来降低相对熵。

四、交叉熵损失函数

1. 单样本交叉熵计算

  • 交叉熵的计算公式看似复杂,但实际运算过程比较简单,对于类似逻辑回归模型输出为连续变量,而真实标签为离散变脸的数据集,可以举例说明计算过程。例如有数据集情况如下:
indexlabelspredicts
110.8
200.3
300.4
410.7
  • 我们可以将其改写成如下形式:
indexA类B类
101
predicts0.20.8
210
predicts0.70.3
310
predicts0.60.4
401
predicts0.30.7
  • 其中 A、B 表示每条样本可能所属的类别。围绕该数据集,第一条数据的交叉熵计算过程如下:
    c r o s s _ e n t r o p y = − 0 ∗ l o g ( 0.2 ) − 1 ∗ l o g ( 0.8 ) cross\_entropy = -0 * log(0.2)-1*log(0.8) cross_entropy=0log(0.2)1log(0.8)
-np.log2(0.8)
#0.3219280948873623
  • 再次理解交叉熵计算公式中的叠加是类别的叠加。
  • 上述数据集标签由 0-1 转化为 A、B,也被称为名义型变量的独热编码。

2. 多样本交叉熵计算

  • 而对于多个数据集,整体交叉熵实际上是每条数据交叉熵的均值。例如上述数据集,整体交叉熵计算结果为:
    − 1 ∗ l o g ( 0.8 ) − 1 ∗ l o g ( 0.7 ) − 1 ∗ l o g ( 0.6 ) − 1 ∗ l o g ( 0.7 ) 4 \frac{-1 * log(0.8)-1 * log(0.7)-1 * log(0.6)-1 * log(0.7)}{4} 41log(0.8)1log(0.7)1log(0.6)1log(0.7)
(-np.log2(0.8)-np.log2(0.7)-np.log2(0.6)-np.log2(0.7)) / 4
#0.5220100086782713
  • 据此,我们可以给出多样本交叉熵计算公式如下:
    c r o s s _ e n t r o p y = − 1 m ∑ j m ∑ i n p ( p i j ) l o g ( q i j ) cross\_entropy = -\frac{1}{m}\sum ^m_j \sum^n_ip(p_{ij})log(q_{ij}) cross_entropy=m1jminp(pij)log(qij)
  • 其中 m 为数据量,n 为类别数量。

3. 对比极大似然估计函数

  • 围绕上述数据集,如果考虑采用极大似然估计来进行计算,我们发现基本计算流程保持一致:
    L ( w ^ ) = ∑ i = 1 N [ − y i ⋅ l n ( p 1 ( x ^ ; w ^ ) ) − ( 1 − y i ) ⋅ l n ( 1 − p 1 ( x ^ ; w ^ ) ) ] L(\hat w)= \sum^N_{i=1}[-y_i \cdot ln(p_1(\hat x;\hat w))-(1-y_i) \cdot ln(1-p_1(\hat x;\hat w))] L(w^)=i=1N[yiln(p1(x^;w^))(1yi)ln(1p1(x^;w^))]
  • 带入数据可得: − l n ( 0.8 ) − l n ( 0.7 ) − l n ( 0.6 ) − l n ( 0.7 ) -ln(0.8)-ln(0.7)-ln(0.6)-ln(0.7) ln(0.8)ln(0.7)ln(0.6)ln(0.7)
-np.log(0.8)-np.log(0.7)-np.log(0.6)-np.log(0.7)
  • 尽管具体数值计算结果有所差异,但基本流程都是类似的——取类别 1 的概率的对数运算结果进行累加再取负数。
  • 因此在实际建模过程中,考虑采用极大似然估计构建损失函数,和采用交叉熵构建损失函数,效果是相同的,二者构建的损失函数都能很好的描绘模型预测结果和真实结果的差异程度。不过在机器学习领域,一般以交叉熵损失函数为主。

4. 二分类交叉熵损失函数

  • 据此,我们也可最终推导二分类交叉熵损失函数计算公式,结合极大似然估计的计算公式和交叉熵的基本计算流程,二分类交叉熵损失函数为: b i n a r y C E ( w ^ ) = − 1 n ∑ i = 1 N [ y i ⋅ l o g ( p 1 ( x ^ ; w ^ ) ) + ( 1 − y i ) ⋅ l o g ( 1 − p 1 ( x ^ ; w ^ ) ) ] binaryCE(\hat w)= -\frac{1}{n}\sum^N_{i=1}[y_i \cdot log(p_1(\hat x;\hat w))+(1-y_i) \cdot log(1-p_1(\hat x;\hat w))] binaryCE(w^)=n1i=1N[yilog(p1(x^;w^))+(1yi)log(1p1(x^;w^))]
  • 我们也可以定义一个函数来进行二分类交叉熵损失函数的计算:
def BCE(y, yhat):
    """
    二分类交叉熵损失函数
    """
    return(-(1/len(y))*np.sum(y*np.log2(yhat)+(1-y)*np.log2(1-yhat)))
  • 简单进行验证
y = np.array([1, 0, 0, 1]).reshape(-1, 1)
yhat = np.array([0.8, 0.3, 0.4, 0.7]).reshape(-1, 1)
BCE(y, yhat)
#0.5220100086782713
  • 至此,我们就完成了完整的逻辑回归损失函数的构建。但正如此前所讨论的一样,对于逻辑回归的损失函数来说,尽管也是凸函数,但无法使用最小二乘法进行求解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode[947]移除最多的同行或同列石头

难度:中等题目:n块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n的数组 stones,其中 stones[i] [xi, yi]…

MATLAB算法实战应用案例精讲-【人工智能】Grover量子搜索算法(补充篇)

前言 因为量子计算的并行性, 搜索问题, 比如说数据库搜索, 最短路径问题, 加密问题, 图形着色问题等, 都被视为可以做到量子加速. Grover 算法,有时也称为量子搜索算法(quantum search algorithm),指一种在量子计算机上运行的非结构化搜索算法,是量子计算的典型算法…

LeetCode[765]情侣牵手

难度:困难题目:n对情侣坐在连续排列的 2n个座位上,想要牵到对方的手。人和座位由一个整数数组 row表示,其中 row[i]是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3)&…

#A. Balanced Lineup排队(rmq模板题)

题目思路建议先看看详解rmq问题很明显这道题意是跟你一段数列,并给出多次询问,询问区间内最大值和最小值的差。如果去暴力枚举显然会超时,所以要用st算法来解决。我们要建立两个RMQ预处理内容,分别处理最大值和最小值。建一个mx[i][j]代表从i开始,长度为…

精品图表Crack:TeeChart ActiveX version 2023.1

TeeChart ActiveX version 2023 数据可视化专家,Visual Studio.Net、Visual Basic、Visual Studio 6和 IIS / ASP的图表组件 概述 TeeChart Pro ActiveX 图表组件库提供数百种 2D 和 3D 图形样式、56 种数学和统计函数供您选择,以及无限数量的轴和 14 个工具箱组件…

DFS(五)最小轮盘锁

752. 打开转盘锁 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 。每个拨轮可以自由旋转:例如把 9 变为 0,0 变为 9 。每次旋转都只能旋转一个拨轮的一位数字。 锁的初始数字为 0000 ,一…

【2023.01.26】定时执行专家 V6.6 兔年春节版 - 更新日志

目录 ◆ 最新版下载链接 ◆ 软件更新日志 – TimingExecutor Full Change Log ▼ 2023-01-23 V6.6 ▼ 2023-01-20 V6.5 ▼ 2022-12-25 V6.4 ▼ 2022-11-15 V6.3 ▼ 2022-10-01 V6.2 ▼ 2022-07-30 V6.1(Build 769.30072022) ▼ 2022-0…

Linux-Ubuntu入门到精通之远程操作指令

1️⃣shutdown 2️⃣查看或配置网卡信息 3️⃣网卡和IP地址 4️⃣ifconfig 5️⃣ping 6️⃣远程登录和复制文件 7️⃣ ssh 基础(重点) 8️⃣域名 和 端口号 9️⃣SSH 客户端的简单使用 1️⃣0️⃣Windows 下 SSH 客户端的安装 Putty :http:/…

数据结构 | 海量数据处理 | 位图和哈希切分的常见应用 | 布隆过滤器的使用场景

文章目录位图应用question 1question 2question 3位图的作用哈希切分布隆过滤器作为一种数据结构,哈希桶有着不同于其他数据结构的思想——直接映射,这使得在哈希结构中查找数据的效率达到了最快的O(1),比起搜索树的比较数据大小,…

数学建模——降维算法

降维 降维的意义 降低无效、错误数据对建模的影响,提高建模的准确性少量切具有代表性的数据将大幅缩减挖掘所需的时间降低存储数据的成本 需要降维的情况 维度灾难。很难有一个简洁的模型在高维空间中依旧具有鲁棒性,而随着模型复杂度的增加&#xf…

【LeetCode每日一题:1663. 具有给定数值的最小字符串~~~递归+DFS+贪心】

题目描述 小写字符 的 数值 是它在字母表中的位置(从 1 开始),因此 a 的数值为 1 ,b 的数值为 2 ,c 的数值为 3 ,以此类推。 字符串由若干小写字符组成,字符串的数值 为各字符的数值之和。例如…

你会仲裁吗——劳动仲裁需要准备

目录 劳动仲裁申请书 仲裁思路 ​编辑 一、仲裁前准备 1、自己不认可年终奖 2、自己不认可绩效 二、【仲裁前】协商阶段 1、主张3个月足额年终奖 2、公司协商离职赔偿方案 年终奖仲裁证据 延时加班费 周末加班费 节假日加班费 其他福利-如房补 申请劳动仲裁交通…

uniapp组件传参方式梳理

前言 日常开发中经常会遇到组件之间传递参数问题,整理了几种常见的传参方式,方便日后复习梳理. 常见组件传参的三种方式: 1.父组件向子组件传参 2.子组件向父组件传参 3.子组件向非父组件传参 1.父组件向子组件传参自定义组件: <template><view c…

XPath入门

好久没用XPath了&#xff08;之前没做笔记&#xff09;&#xff0c;最近要用的时候又到处查。。。&#xff08;痛苦.jpg&#xff09;&#xff0c;还是记录下吧&#xff08;π_π&#xff09; XPath&#xff0c;是XML Path Language的缩写&#xff0c; 是一门在 XML 文档中查找…

【Linux】POSIX信号量

目录&#x1f308;前言&#x1f338;1、POSIX信号量&#x1f368;1.1、概念&#x1f367;1.2、PV操作&#x1f33a;2、POSIX信号量相关API&#x1f368;2.1、初始化和销毁信号量&#x1f367;2.2、等待信号量&#xff08;P&#xff09;&#x1f370;2.3、发布信号量&#xff08…

ImmutableList hessian2序列化失败问题分析

问题描述 A服务提供了个RPC接口给B服务使用&#xff0c;入参里有个参数是List类型&#xff0c;B服务在传参时使用Guava里的 ImmutableList&#xff0c;结果发生报错。 其中&#xff0c;B服务即consumer端的异常为&#xff1a;「com.alibaba.dubbo.remoting.RemotingException:…

AD采集之离散化概念(Quantizer模型使用介绍)

模拟量采集的PLC程序和功能块算法,可以参看下面的文章链接: PLC模拟量采集算法数学基础(线性传感器)_RXXW_Dor的博客-CSDN博客_模拟量采集线性校准模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_RXXW_BOSS的博客-CSDN博客_…

缓存数据库memcached

目录 一.memcached简介 memcached简介 memcached的特点 二.memcached安装 2.1.yum安装 2.2.源码安装 三.memcached命令 3.1.memcached的特征 3.2.memcached的set命令 3.3.memcached的get命令 四.memcached应用实例配置 4.1.图示 4.2.基础配置 4.3.环境规划 4.3.1…

SpringBoot程序的打包和运行

程序打包 SpringBoot程序是基于Maven创建的&#xff0c;在Maven中提供有打包的指令&#xff0c;叫做package。本操作可以在Idea环境下执行。 mvn package​ 打包后会产生一个与工程名类似的jar文件&#xff0c;其名称是由模块名版本号.jar组成的。 程序运行 ​ 程序包打好以…

TeeGrid for .NET 2023

TeeGrid for .NET 2023 TeeGrid for.NET为Visual Studio项目提供了一个非常快速的数据网格。打包功能的.NET数据网格提供了诸如排序、分组或过滤网格数据、可调整列大小、主详细视图、可拖动选择、网格滚动等功能。只需使用几个属性设置即可启用这些内置功能。TeeGrid可以链接到…