文章目录
一、逻辑回归参数估计基本思路
1. 构建损失函数
2. 损失函数求解
二、利用极大似然估计进行参数估计
三、熵、相对熵与交叉熵
1. 熵(entropy)的基本概念与计算公式
2. 熵的基本性质
3. 相对熵(relative entropy)与交叉熵(cross entropy)
四、交叉熵损失函数
1. 单样本交叉熵计算
2. 多样本交叉熵计算
3. 对比极大似然估计函数
4. 二分类交叉熵损失函数
在模型基本结构构建完成之后,接下来我们开始讨论如何进行逻辑回归的参数估计。所谓参数估计,其实就是模型参数求解的更加具有统计学风格的称呼。根据逻辑回归的基本公式
- y=1+e−(w^T⋅x^)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 |
由于只有一个特征,因此可以构建逻辑回归模型为:
- 至此我们即构建了一个由两条数据所构成的逻辑回归损失函数。
- 注意,在上述损失函数的构建过程中有两个关键步骤,需要再次提醒。
(2) 在构建损失函数的过程中,我们需要将概率连乘改为对数累加,有一个很重要的原因是,在实际建模运算过程中,尤其是面对大量数据进行损失函数构建过程中,由于有多少条数据就要进行多少次累乘,而累乘的因子又是介于 (0,1) 之间的数,因此极有可能累乘得到一个非常小的数,而通用的计算框架计算精度有限,即有可能在累乘的过程中损失大量精度,而转化为对数累加之后能够很好的避免该问题的发生。
2. 损失函数求解
- 从数学角度可以证明,按照上述构成构建的逻辑回归损失函数仍然是凸函数,此时我们仍然可以通过对 LogitLoss(w,b) 求偏导然后令偏导函数等于 0、再联立方程组的方式来对参数进行求解。
值得一提的是,上述构建损失函数和求解损失函数的过程,也被称为极大似然估计。接下来我们就将极大似然估计的方法推广到一般过程。
二、利用极大似然估计进行参数估计
- 接下来,我们考虑更为一般的情况,围绕逻辑回归方程的一般形式,采用极大似然估计方法进行参数估计:
逻辑回归模型:
公式推导致此即可,后续我们将借助该公式进行损失函数求解。
(4) 求解对数似然函数
通过一系列数学过程可以证明,通过极大似然估计构建的损失函数是凸函数,此时我们可以采用导数为 0 联立方程组的方式进行求解,这也是极大似然估计对参数求解的一般方法。
但这种方法会涉及大量的导数运算、方程组求解等,并不适用于大规模甚至是超大规模数值运算。
因此,在机器学习领域,我们通常会采用一些更加通用的优化方法对逻辑回归的损失函数进行求解,通常来说是牛顿法或者梯度下降算法,其中,梯度下降算法是机器学习中最为通用的求解损失函数的优化算法。
本节我们将继续介绍另外一种推导逻辑回归损失函数的方法—— KL 离散度计算法,并介绍有关信息熵、交叉熵等关键概念。
由于模型本身和损失函数构建方式都和线性回归有所不同,逻辑回归的损失函数无法采用最小二乘法进行求解。
三、熵、相对熵与交叉熵
接下来,我们介绍另一种构建逻辑回归损失函数的基本思路——借助相对熵(relative entropy,又称KL离散度)构建损失函数。
尽管最终损失函数构建结果和极大似然估计相同,但该过程所涉及到的关于信息熵(entropy)、相对熵等概念却是包括 EM 算法、决策树算法等诸多机器学习算法的理论基础。
1. 熵(entropy)的基本概念与计算公式
通常我们用熵(entropy)来表示随机变量不确定性的度量,或者说系统混乱程度、信息混乱程度。熵的计算公式如下:
-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
2. 熵的基本性质
可以证明,熵的计算结果在 [0,1] 之间,并且熵值越大,系统越混乱、信息越混乱。例如,有如下两个数据集,其中数据集 2 总共 4 条样本,0、1类各占 50%。
数据集2
index | labels |
1 | 0 |
2 | 1 |
3 | 0 |
4 | 1 |
对于该数据集,我们可以计算信息熵为
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 |
信息熵计算可得:
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 是离散变量时,我们可以通过如下相对熵计算公式来衡量二者差异:
四、交叉熵损失函数
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 表示每条样本可能所属的类别。围绕该数据集,第一条数据的交叉熵计算过程如下: