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

文章目录

  • 一、逻辑回归参数估计基本思路
    • 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_length species
1 0
3 1
  • 由于只有一个特征,因此可以构建逻辑回归模型为: 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_length species 1-predict 0-predict
1 0 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)
3 1 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
index labels
1 0
2 1
3 1
4 1
  • 则信息熵的计算过程中 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
index labels
1 0
2 1
3 0
4 1
  • 对于该数据集,我们可以计算信息熵为 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
index labels
1 1
2 1
3 1
4 1
  • 信息熵计算可得: 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')

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

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. 单样本交叉熵计算

  • 交叉熵的计算公式看似复杂,但实际运算过程比较简单,对于类似逻辑回归模型输出为连续变量,而真实标签为离散变脸的数据集,可以举例说明计算过程。例如有数据集情况如下:
index labels predicts
1 1 0.8
2 0 0.3
3 0 0.4
4 1 0.7
  • 我们可以将其改写成如下形式:
index A类 B类
1 0 1
predicts 0.2 0.8
2 1 0
predicts 0.7 0.3
3 1 0
predicts 0.6 0.4
4 0 1
predicts 0.3 0.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
  • 至此,我们就完成了完整的逻辑回归损失函数的构建。但正如此前所讨论的一样,对于逻辑回归的损失函数来说,尽管也是凸函数,但无法使用最小二乘法进行求解。

你可能感兴趣的:(机器学习,python,人工智能)