前言
本文主要对逻辑回归中的数学原理进行介绍,将不涉及或很少涉及代码实现,阅读前请确保已了解基本的机器学习相关内容和数学基础。
文章概述
逻辑回归:一种名为 "回归" 的线性分类器,其本质是由线性回归变化而来的,是一种广泛使用于分类问题中的广义回归算法。
提出问题:本文将会基于以下问题来对逻辑回归进行展开讨论和介绍:
- 为什么需要掌握逻辑回归?
- sigmoid函数是怎么来的?
- 交叉熵损失函数是怎么来的?
- 怎么使用梯度下降对逻辑回归进行求解?
- 逻辑回归通过什么方法减少过拟合程度?
- 逻辑回归怎么完成多分类任务?
注:
- 若不特别说明则向量默认为列向量
- 加粗的符号表示为向量,如 <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w
为什么需要逻辑回归
逻辑回归基于线性回归,对数据的质量要求相对严格,且原理相对需要更多的数学基础,在一些相关书籍中也很少被介绍,但它仍然是一个受工业商业热爱,使用广泛的模型,有着不可替代的优点,包括但不限于:
- 逻辑回归对线性关系的拟合效果非常好:对于特征与标签之间线性关系极强的数据,例如金融领域中的信用卡欺诈、评分卡制作,电商中的营销预测等数据,都是逻辑回归的强项。虽然现在有了很多效果更好的更为先进的模型,但逻辑回归在金融领域,尤其是银行业中的统治地位仍然不可动摇;相对的,逻辑回归在非线性数据的效果很多时候比随机模型还要差。
- 计算速度很快:对于线性数据,逻辑回归的拟合和计算都非常快,计算效率优于SVM和随机森林,在大型数据上尤其能够看得出区别。
- 分类结果为类概率数值:可以把逻辑回归返回的结果当成连续型数据来利用。例如在评分卡制作时,我们不仅需要判断客户是否会违约,还需要给出相应的"信用分",因此我们可以基于模型输出的后验概率来评定信用分。
当然,在很多工具或库中,例如决策树、随机森林这样的模型也可基于相关算法输出相应概率,上面介绍的各个优点在很多情况下也不是逻辑回归特有的。
逻辑回归是一个在线性数据上表现优异的分类器,主要被应用在金融领域,福布斯杂志曾在讨论逻辑回归时说过:"技术上来说,最佳模型的AUC面积低于0.8时,逻辑回归的性能明显优于树模型"。此外,逻辑回归在小数据集上表现更好,而对于大型的数据集,树模型的效果往往更好。逻辑回归在当下仍然是一个重要模型,不仅是对于一些与之紧密相关的应用场景,对于之后更深入的学习它也是不可或缺的一部分。
逻辑回归基本原理
在这里,本文会对逻辑回归的基本原理做全方位的数学解释说明,以二元逻辑回归为例介绍逻辑回归的由来以及相关公式推导,包括其基本形式、sigmoid函数以及其损失函数和基于梯度下降算法的求解。
从线性回归到逻辑回归
线性回归:简单对线性回归相关知识进行回顾,模型如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = [ w 0 w 1 ⋯ w n ] [ x 0 x 1 ⋮ x n ] = w T x ( x 0 = 1 ) y = \begin{bmatrix} w_0 & w_1 & \cdots & w_n \end{bmatrix}\begin{bmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{bmatrix} = \bold{w}^T\bold{x}(x_0=1) </math>y=[w0w1⋯wn]⎣ ⎡x0x1⋮xn⎦ ⎤=wTx(x0=1)
我们也常使用如下方式来表示线性回归:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = w T x + w 0 y = \bold{w}^T\bold{x} + w_0 </math>y=wTx+w0
- 其中向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> w , x \bold{w,x} </math>w,x 中的第一个元素分别为 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 , x 1 w_1, x_1 </math>w1,x1.
线性回归的任务,就是构造一个预测函数来映射输入的特征矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 和标签值 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 的线性关系,而构造预测函数的核心就是找出模型的各个权重系数 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ w 1 ⋯ w n ] \begin{bmatrix}w_1 & \cdots & w_n\end{bmatrix} </math>[w1⋯wn] 和截距 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 0 w_0 </math>w0。
提出问题 :通过上方函数,线性回归使用输入的特征矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 来输出一组连续型变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> y p r e d y_{pred} </math>ypred,以完成各种预测连续型变量的任务;若我们的标签是离散型变量,例如对满足0-1分布的离散型变量进行预测,该怎么办呢?
基本思路:线性回归将输入的特征矩阵映射为一组连续型变量,这组连续型变量的取值范围是没有限定的,若我们想要从回归预测转到二分类任务上,最简单且直接的思路无非就是将输出的这组连续型变量映射到一个新的0-1分布的空间,同样最粗暴的方式就是将原来的回归预测的范围限定在 0 ~ 1 之间,这样模型回归预测的结果只能在预先定义的范围中,也就是 0 ~ 1 之间。
联系函数(link function) :我们设一个相应的、符合我们基本思路的联系函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( z ) g(z) </math>g(z),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 为原线性回归模型的输出值,令 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( z ) g(z) </math>g(z) 的值分布在区间 (0,1) 中,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( z ) g(z) </math>g(z) 趋近于0时,标签为0,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( z ) g(z) </math>g(z) 趋近于1时,标签为1,这样就得到了一个分类模型;其中在逻辑回归中,这个函数就是Sigmoid函数。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> g ( z ) = s i g m o i d ( z ) = 1 1 + e − z g(z) = sigmoid(z) = \frac{1}{1+e^{-z}} </math>g(z)=sigmoid(z)=1+e−z1
上图涉及的相关绘图代码以供参考(可忽略并折叠):
python
import numpy as np
import matplotlib.pyplot as plt
sigmoid = lambda z: 1 / (1 + np.e ** (-z))
x = np.arange(-10, 10, 0.1)
plt.figure(figsize=(8,4))
plt.scatter(0, 0.5, s=50, c='red', alpha=0.7, edgecolor='white',linewidth=1)
plt.plot(x, sigmoid(x), color = 'blue', alpha=0.7)
plt.plot([0, 0, -10], [0, 0.5, 0.5], linestyle=':', color='red', alpha=0.6)
plt.text(0.45, 0.45, '(0, 0.5)', color='red', alpha=0.7)
plt.yticks([0, 0.2, 0.4, 0.5, 0.6, 0.8, 1])
plt.xlabel('z')
plt.ylabel('g(z)')
plt.show()
Sigmoid函数 :如上图所示,该函数是一个S型的函数,当自变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 趋近正无穷时,因变量g(z)趋近于1,而当 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 趋近负无穷时, <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( z ) g(z) </math>g(z) 趋近于0;该函数能将任何实数映射到(0,1)区间,因此可用于将输出为任意值的函数转换为适合二分类的函数。由于该性质,Sigmoid函数也被当作归一化的一种方法,可将数据压缩到区间 [0,1] 中。
- 注意:sigmoid函数中只能无限趋近于0和1,即取值范围两边都为开区间。
将线性回归函数代入sigmoid函数后得到二元逻辑回归模型的一般形式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> g ( z ) = 1 1 + e − z = 1 1 + e − ( w T x + w 0 ) g(z) = \frac{1}{1+e^{-z}} = \frac{1}{1 + e^{-(\bold{w}^T\bold{x}+w_0)}} </math>g(z)=1+e−z1=1+e−(wTx+w0)1
至此,我们已经得到了二元逻辑回归模型的一般形式。
sigmoid函数的由来
对于sigmoid函数的介绍我们却在上方一笔带过,接下来,我们将会重点介绍sigmoid函数是如何推导出来的。
在此本文会先介绍线性判别函数,这是一个很原始的二分类判别器,本文将介绍它的原理和不足之处,以此引出sigmoid函数以及其相对于线性判别函数解决的问题。对于线性判别函数的原理不影响下文sigmoid函数推导的原理阅读,若不感兴趣则可跳过线性判别函数部分。
线性判别函数
决策边界:对于分类问题,无论什么模型,本质上都是其依据训练数据在对应特征空间中推导出了不同分类间的决策边界,模型依靠确定的决策边界对新的特征向量进行分类预测。
对于决策边界的确定也有着不同方法以及对应的不同模型(例如朴素贝叶斯依靠概率密度来进行决策),但最直观同时也是最粗暴的方法为对该决策边界直接进行估计,在这里我们引入线性判别函数。
线性判别函数(Linear Discriminant Function):统计模式识别中用以对模式进行分类的一种最简单的判别函数称为线性判别函数。
上图中我们假设红色三角为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1,蓝色圆圈为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2;我们先分别得到这两类数据对应的两个线性回归模型 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) g_1(x) </math>g1(x) 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 2 ( x ) g_2(x) </math>g2(x):
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> g 1 ( x ) = [ w 11 w 12 ] [ x 11 x 12 ] + w 10 = w 1 T x + w 10 g 2 ( x ) = [ w 21 w 22 ] [ x 21 x 22 ] + w 20 = w 2 T x + w 20 g_1(x) = \begin{bmatrix} w_{11} & w_{12} \end{bmatrix}\begin{bmatrix} x_{11} \\ x_{12} \end{bmatrix} + w_{10} = \bold{w_1}^T\bold{x} + w_{10} \\ g_2(x) = \begin{bmatrix} w_{21} & w_{22} \end{bmatrix}\begin{bmatrix} x_{21} \\ x_{22} \end{bmatrix} + w_{20} = \bold{w_2}^T\bold{x} + w_{20} </math>g1(x)=[w11w12][x11x12]+w10=w1Tx+w10g2(x)=[w21w22][x21x22]+w20=w2Tx+w20
- 其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 11 w_{11} </math>w11 中的下标指的是类别1中的第一个权重系数,其它参数同理
对于这两个模型,有以下定义:
- 若 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) > g 2 ( x ) g_1(x) > g_2(x) </math>g1(x)>g2(x),则为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1
- 若 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) ≤ g 2 ( x ) g_1(x) \le g_2(x) </math>g1(x)≤g2(x),则为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2
我们当然不能直接认为若 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) > g 2 ( x ) g_1(x) > g_2(x) </math>g1(x)>g2(x),则为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1,这里不能将 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) g_1(x) </math>g1(x) 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 2 ( x ) g_2(x) </math>g2(x) 当成两个独立的模型来看,我们最后要将两模型的输出值进行比较以进行决策,由于规定当 <math xmlns="http://www.w3.org/1998/Math/MathML"> g 1 ( x ) > g 2 ( x ) g_1(x) > g_2(x) </math>g1(x)>g2(x) 时,则为类 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1,因此模型会在拟合训练数据后趋于符合我们的定义,最终确定出一条决策边界(如上图中的蓝色线条)。
基于我们上方的两个定义,为了寻找对应决策边界,我们可以进行如下简单的变换:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C 1 : g 1 ( x ) > g 2 ( x ) → g 1 ( x ) − g 2 ( x ) > 0 C 2 : g 1 ( x ) ≤ g 2 ( x ) → g 1 ( x ) − g 2 ( x ) ≤ 0 C_1:g_1(x) > g_2(x) \rightarrow g_1(x) - g_2(x) > 0 \\ C_2:g_1(x) \le g_2(x) \rightarrow g_1(x) - g_2(x) \le 0 </math>C1:g1(x)>g2(x)→g1(x)−g2(x)>0C2:g1(x)≤g2(x)→g1(x)−g2(x)≤0
可以看到左边式子是一样的,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> g ( x ) = g 1 ( x ) − g 2 ( x ) = ( w 1 T x + w 10 ) − ( w 2 T x + w 20 ) = ( w 1 − w 2 ) T x + ( w 10 − w 20 ) \begin{align} g(x) &= g_1(x) - g_2(x) \\ &= (\bold{w_1}^T\bold{x} + w_{10}) - (\bold{w_2}^T\bold{x} + w_{20}) \\ &= (\bold{w_1} - \bold{w_2})^T\bold{x} + (w_{10} - w_{20}) \\ \end{align} </math>g(x)=g1(x)−g2(x)=(w1Tx+w10)−(w2Tx+w20)=(w1−w2)Tx+(w10−w20)
观察易得 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 1 − w 2 \bold{w_1} - \bold{w_2} </math>w1−w2 还是一个向量, <math xmlns="http://www.w3.org/1998/Math/MathML"> w 10 − w 20 w_{10}-w_{20} </math>w10−w20 也还是一个常数,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> 令 { w = w 1 − w 2 w 0 = w 10 − w 20 ,即: g ( x ) = w T x + w 0 令\begin{cases}\bold{w} = \bold{w_1}- \bold{w_2} \\ w_0 = w_{10}-w_{20} \end{cases},即:g(x) = \bold{w}^T\bold{x} + w_0 </math>令{w=w1−w2w0=w10−w20,即:g(x)=wTx+w0
最终得到的 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x) 就是我们的线性判别函数的表达式。
如上图所示,易得该函数符合以下定义:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l a b e l = { C 1 , g ( x ) > 0 C 2 , o t h e r w i s e label = \begin{cases} C_1, \quad g(x) > 0 \\ C_2, \quad otherwise \end{cases} </math>label={C1,g(x)>0C2,otherwise
这里是以二维数据为例,但无论对于几维数据,线性判别函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x) 本质上是在其特征空间中定义了一个超平面(Hyperplane),将该特征空间分为两个半空间,以该超平面作为决策边界来对数据进行二分类。
例如对于我们上方的二维特征空间,图中的蓝色线条就是超平面。
对于我们上方推导得到的函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x),这就是一个很原始的线性分类器,可以做基本的二分类工作,但其本身也有着很大的局限性。
上图涉及的相关绘图代码以供参考(可忽略并折叠):
python
import numpy as np
import matplotlib.pyplot as plt
g_func = np.vectorize(lambda x: 1 if x > 0 else 0)
x = np.arange(-10, 10, 0.1)
plt.figure(figsize=(8,4))
plt.plot(x, g_func(x), color = 'red', alpha=0.6)
plt.xlabel('x')
plt.ylabel('g(x)')
plt.show()
模型弊端 :如上图所示,我们求得的线性判别函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) g(x) </math>g(x) 对于二分类的决策策略为 "非此即彼",这会造成很大的问题,例如当输入某个特征矩阵后,若 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( x ) = 0.00001 g(x)=0.00001 </math>g(x)=0.00001,模型的输出结果为1,但其实模型本身并没有多大把握,因为差一点点模型就会输出0;此外,假如输入某特征向量后,模型输出1,虽然我们知道它属于类1,但是我们却不知道它在多大程度上属于1,也就是这个模型得到这个分类结果的可信度无法通过这个模型得知。
sigmoid函数推导
注:sigmoid函数在网上也有着基于不同角度的不同的推导方法,方法不唯一,不必局限于本文方法。
设某概率模型,已知特征向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \bold{x} </math>x,则模型输出为 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2 的后验概率分别为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> 已知 P ( C 1 ∣ x ) = z ,则 P ( C 2 ∣ x ) = 1 − z 已知P(C_1|{\bold{x}}) = z,则P(C_2|{\bold{x}}) = 1-z </math>已知P(C1∣x)=z,则P(C2∣x)=1−z
则有以下决策策略:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l a b e l = { C 1 , z > 0.5 C 2 , O t h e r w i s e label=\begin{cases} C_1, \quad z > 0.5 \\ C_2, \quad Otherwise \end{cases} </math>label={C1,z>0.5C2,Otherwise
不难发现,可以推出以下公式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> z > 0.5 → z 1 − z > 1 → l o g z 1 − z > 0 z > 0.5 \quad \rightarrow \quad \frac{z}{1-z} > 1 \quad \rightarrow \quad log\frac{z}{1-z} > 0 </math>z>0.5→1−zz>1→log1−zz>0
对数函数的底数设为 <math xmlns="http://www.w3.org/1998/Math/MathML"> e e </math>e,不难看出,令 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = l o g z 1 − z y = log\frac{z}{1-z} </math>y=log1−zz,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> y > 0 y>0 </math>y>0时, <math xmlns="http://www.w3.org/1998/Math/MathML"> l a e b l = C 1 laebl=C_1 </math>laebl=C1,反之 <math xmlns="http://www.w3.org/1998/Math/MathML"> l a b e l = C 2 label=C_2 </math>label=C2,对于函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = l o g z 1 − z y=log\frac{z}{1-z} </math>y=log1−zz,我们求其反函数:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> z = l n y 1 − y → e z = y 1 − y → y = e z − e z y → y = e z 1 + e z = 1 1 + e − z ⏟ s i g m o i d z = ln\frac{y}{1-y} \quad \rightarrow \quad e^z = \frac{y}{1-y} \quad \rightarrow \quad y = e^z - e^zy \quad \rightarrow \quad y= \frac{e^z}{1+e^z} = \underbrace{\frac{1}{1+e^{-z}}}_{sigmoid} </math>z=ln1−yy→ez=1−yy→y=ez−ezy→y=1+ezez=sigmoid 1+e−z1
至此可以看出函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> l o g z 1 − z log\frac{z}{1-z} </math>log1−zz 的反函数就是sigmoid函数。
回顾一下反函数的定义 :一般来说,设函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ) ( x ∈ A ) y=f(x)(x∈A) </math>y=f(x)(x∈A) 的值域是 <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C,若找得到一个函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( y ) g(y) </math>g(y) 在每一处 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( y ) g(y) </math>g(y) 都等于对应的 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x,这样的函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> x = g ( y ) ( y ∈ C ) x=g(y)(y∈C) </math>x=g(y)(y∈C) 叫做函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ) ( x ∈ A ) y=f(x)(x∈A) </math>y=f(x)(x∈A) 的反函数,记作 <math xmlns="http://www.w3.org/1998/Math/MathML"> x = f − 1 ( y ) x=f^{-1}(y) </math>x=f−1(y) 。反函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> x = f − 1 ( y ) x=f^{-1}(y) </math>x=f−1(y) 的定义域、值域分别是函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ) y=f(x) </math>y=f(x) 的值域、定义域。
求反函数的原因 :原函数中自变量为后验概率,因变量为一个范围为 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( − ∞ , ∞ ) (-\infty, \infty) </math>(−∞,∞)的连续型变量,这与我们的目的恰恰相反,我们想让线性回归模型的输出值(连续型变量)作为自变量,而用于二分类的后验概率作为因变量。
对于原函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = l o g z 1 − z y = log\frac{z}{1-z} </math>y=log1−zz,其中自变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 为后验概率,因变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 用于判别( <math xmlns="http://www.w3.org/1998/Math/MathML"> y ∈ ( − ∞ , + ∞ ) y\in (-\infty, +\infty) </math>y∈(−∞,+∞));参考反函数的定义,则其反函数,也就是sigmoid函数中的因变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 相当于原函数中的后验概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z;而自变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 则相当于原函数中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y,
- 对于原函数,若 <math xmlns="http://www.w3.org/1998/Math/MathML"> z > 0.5 z > 0.5 </math>z>0.5,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> y > 0 y>0 </math>y>0,为 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1,若 <math xmlns="http://www.w3.org/1998/Math/MathML"> z < 0.5 z<0.5 </math>z<0.5, 则 <math xmlns="http://www.w3.org/1998/Math/MathML"> y < 0 y<0 </math>y<0,为 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2.
- 对于反函数(sigmoid函数),若 <math xmlns="http://www.w3.org/1998/Math/MathML"> z > 0 z>0 </math>z>0,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> y > 0.5 y>0.5 </math>y>0.5,为 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 1 C_1 </math>C1;若 <math xmlns="http://www.w3.org/1998/Math/MathML"> z < 0 z<0 </math>z<0,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> y < 0.5 y<0.5 </math>y<0.5,为 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2.
线性回归输出值作为sigmoid的输入值的原因 :对于原函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = l n z 1 − z y=ln\frac{z}{1-z} </math>y=ln1−zz,假设线性回归模型的输出结果作为sigmoid函数的输入,sigmoid函数的输出值为后验概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = l n ( z 1 − z ) = l n ( s i g m o i d ( w T x ) 1 − s i g m o i d ( w T x ) ) = l n ( 1 1 + e − w T x e − w T x 1 + e − w T x ) = l n ( 1 e − w T x ) = l n ( e w T x ) = w T x \begin{align} y=ln(\frac{z}{1-z}) = ln(\frac{sigmoid(\bold{w}^T\bold{x})}{1-sigmoid(\bold{w}^T\bold{x})}) = ln(\frac{\frac{1}{1+e^{-\bold{w}^T\bold{x}}}}{\frac{e^{-\bold{w}^T\bold{x}}}{1+e^{-\bold{w}^T\bold{x}}}}) = ln(\frac{1}{e^{-\bold{w}^T\bold{x}}}) = ln(e^{\bold{w}^T\bold{x}}) = \bold{w}^T\bold{x} \end{align} </math>y=ln(1−zz)=ln(1−sigmoid(wTx)sigmoid(wTx))=ln(1+e−wTxe−wTx1+e−wTx1)=ln(e−wTx1)=ln(ewTx)=wTx
由此可见在原函数中我们的因变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 其实就是线性回归的输出值,则sigmoid函数中的自变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 其实也就是线性回归的输出值,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> w T x \bold{w}^T\bold{x} </math>wTx。
从我们推导的过程来看,对于sigmoid函数,输入值 <math xmlns="http://www.w3.org/1998/Math/MathML"> z z </math>z 是一个取值范围为 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( − ∞ , + ∞ ) (-\infty, +\infty) </math>(−∞,+∞) 的连续变量,也就是将线性回归的输出值作为其输入值;而输出值 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 其实就是后验概率,由于输出值为一个概率,因此我们可以根据输出值来判断该样本多大程度上属于该类别。
- 例:输入某特征向量后输出 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.65 0.65 </math>0.65,则我们可以说该样本属于类别1的概率为0.65,属于类别0的概率为0.35.
LOSS:交叉熵损失函数
交叉熵损失的直观理解
对于给定的输入 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \bold{x} </math>x,模型输出为标签 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2 的概率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p ( C 1 ∣ x ) p(C_1|\bold{x}) </math>p(C1∣x),输出为标签 <math xmlns="http://www.w3.org/1998/Math/MathML"> C 2 C_2 </math>C2 的概率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p ( C 2 ∣ x ) p(C_2|\bold{x}) </math>p(C2∣x),易得两概率事件对应的信息量分别为 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g p ( C 1 ∣ x ) -logp(C_1|\bold{x}) </math>−logp(C1∣x) 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g p ( C 2 ∣ x ) -log p(C_2|\bold{x}) </math>−logp(C2∣x);
对于信息量公式的推导,可以参考:信息熵(香农熵)-CSDN博客
将输入样本对应特征向量,输出正确标签看作一个概率事件,概率越小的事件产生的信息量越大,而概率越大的事件产生的信息量越小;代入到逻辑回归模型中,则模型输出对应正确标签的概率越大,则对应信息量越小,反之则对应信息量越大,正好符合损失函数的性质。
上图涉及的相关绘图代码以供参考(可忽略并折叠):
python
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn')
mpl.rcParams.update({'mathtext.fontset': 'stix'})
x_1 = np.arange(1, 2, 0.01)
x_2 = np.arange(0.01, 1, 0.01)
plt.figure(figsize=(6,4))
plt.plot(x_1, -np.log(x_1), color='blue', alpha=0.6, linestyle='--')
plt.plot(x_2, -np.log(x_2), color='blue', alpha=0.6)
plt.text(1.9, -0.220, '→', fontsize=33, color='red', alpha=1)
plt.text(-0.06, 4.4, '↑', fontsize=36, color='red', alpha=1)
plt.axvline(0, color='red', alpha=1)
plt.axhline(0, color='red', alpha=1)
plt.axvline(1, color='red', alpha=0.6, linestyle=':')
plt.xlabel('$x$')
plt.ylabel('$-log(x)$')
plt.xticks([*range(0,3)])
plt.yticks([*range(0, 5, 1)])
plt.show()
概率在0-1之内,由该函数的性质可得,当输出概率越小的时候,损失成指数级别增加,当概率趋于1时,损失趋于0,因此当输出概率偏离真实值越大时,损失增加地非常快,这也会在一定程度上增加模型迭代速率。
以数值0、1分别表示二分类中的两类,当真实标签为1时,模型预测某特征向量的标签为1的概率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p,对应损失就是模型预测正确产生的信息量,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l o s s = { − l o g ( p ) , l a b e l = 1 − l o g ( 1 − p ) , l a b e l = 0 loss= \begin{cases} -log(p), \quad label=1\\ -log(1-p), \quad label=0 \\ \end{cases} </math>loss={−log(p),label=1−log(1−p),label=0
转换为一个公式,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l o s s = − ( y ∗ l o g ( p ) + ( 1 − y ) ∗ l o g ( 1 − p ) ) loss= -(y*log(p) + (1-y)*log(1-p)) </math>loss=−(y∗log(p)+(1−y)∗log(1−p))
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y:当前特征向量对应的真实标签
观察得知,若真实标签为1,则对应loss为 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g ( p ) -log(p) </math>−log(p),若真实标签为0,则对应loss为 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g ( 1 − p ) -log(1-p) </math>−log(1−p);对于整个数据集,设某数据集中含有 n 个样本,即 n 个对应特征向量,因此有如下损失函数:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L O S S = − ∑ i = 1 n ( y i ∗ l o g ( p i ) + ( 1 − y i ) ∗ l o g ( 1 − p i ) ) LOSS = -\sum^n_{i=1}(y_i*log(p_i) + (1-y_i)*log(1-p_i)) </math>LOSS=−i=1∑n(yi∗log(pi)+(1−yi)∗log(1−pi))
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:某数据集下的样本个数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:数据集中第 i 个样本对应的标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi:数据集中第 i 个样本模型预测为标签 1 的概率
上方函数就是交叉熵损失函数;即模型每次迭代中的每个样本计算对应 loss 后进行累加得到每次迭代的损失。
基于极大似然估计法推导交叉熵损失
在直观理解中,我们通过拆分交叉熵损失的计算公式可以看出其实可以解释为不同概率事件发生时产生的信息量,并通过观察函数图像可以了解到该损失的一些性质,例如随着预测值与真实值的偏差增大,损失呈指数增加等,但是上方对损失函数本身推导的解释是相对模糊的,因此在接下来我们基于极大似然估计法来对交叉熵损失函数进行推导。
二元逻辑回归的标签服从伯努利分布(即0-1分布),因此我们可以将一个特征向量为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x i \bold{x_i} </math>xi 的样本 i,模型参数为 <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w 的预测情况表现为如下形式:
- 样本 i 被预测为 1 的概率为: <math xmlns="http://www.w3.org/1998/Math/MathML"> P 1 = P ( y i ^ = 1 ∣ x i , w ) = y w ( x i ) P_1=P(\hat{y_i}=1|\bold{x_i}, \bold{w})=y_{\bold{w}}(\bold{x_i}) </math>P1=P(yi^=1∣xi,w)=yw(xi)
- 样本 i 被预测为 0 的概率为: <math xmlns="http://www.w3.org/1998/Math/MathML"> P 0 = P ( y i ^ = 0 ∣ x i , w ) = 1 − y w ( x i ) P_0=P(\hat{y_i}=0|\bold{x_i}, \bold{w})=1-y_{\bold{w}}(\bold{x_i}) </math>P0=P(yi^=0∣xi,w)=1−yw(xi)
将这两个概率整合,我们可以定义如下等式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> P ( y i ^ ∣ x i , w ) = P 1 y i ∗ P 0 1 − y i P(\hat{y_i}|\bold{x_i}, \bold{w}) = P_1^{y_i} * P_0^{1-y_i} </math>P(yi^∣xi,w)=P1yi∗P01−yi
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:样本 i 的真实标签
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i ^ \hat{y_i} </math>yi^:模型对于样本 i 的预测标签
整合之后,我们可以用上述式子来表示原来的两种情况:
- 当真实标签为 0 时, <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( y i ^ ∣ x i , w ) = P 1 0 ∗ P 0 1 − 0 = P 0 P(\hat{y_i}|\bold{x_i}, \bold{w}) = P_1^{0} * P_0^{1-0}=P_0 </math>P(yi^∣xi,w)=P10∗P01−0=P0
- 当真实标签为 1 时, <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( y i ^ ∣ x i , w ) = P 1 1 ∗ P 0 1 − 1 = P 1 P(\hat{y_i}|\bold{x_i}, \bold{w}) = P_1^{1} * P_0^{1-1}=P_1 </math>P(yi^∣xi,w)=P11∗P01−1=P1
对于函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( y i ^ ∣ x i , w ) P(\hat{y_i}|\bold{x_i},\bold{w}) </math>P(yi^∣xi,w),无论真实标签为什么,我们都希望该函数的取值最大化,这也就将最小化损失的问题转换为了对该函数求极值的问题。
对于某训练集的 n 个样本,我们可以得到以下似然函数,我们可以定义如下等式来表达所有样本在模型预测函数中输出的所有可能的 <math xmlns="http://www.w3.org/1998/Math/MathML"> y ^ \hat{y} </math>y^ 对应的概率:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> P = ∏ i = 0 n P ( y i ^ ∣ x i , w ) = ∏ i = 1 n ( P 1 y i ∗ P 0 1 − y i ) = ∏ i = 1 n ( y w ( x i ) y i ∗ ( 1 − y w ( x i ) ) 1 − y i ) \begin{align} P &= \prod^n_{i=0}P(\hat{y_i}|\bold{x_i}, \bold{w}) \\ &= \prod^n_{i=1}(P_1^{y_i} * P_0^{1-y_i}) \\ &= \prod^n_{i=1}(y_{\bold{w}}(\bold{x_i})^{y_i} * (1-y_{\bold{w}}(\bold{x_i}))^{1-y_i}) \end{align} </math>P=i=0∏nP(yi^∣xi,w)=i=1∏n(P1yi∗P01−yi)=i=1∏n(yw(xi)yi∗(1−yw(xi))1−yi)
这就得到了在某数据集下所有样本预测都正确的概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P,我们的目标是最大化这个概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P,但现在如上方公式所示,该公式是将每个样本的特征向量进行累乘,若将 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( y w ( x i ) y i ∗ ( 1 − y w ( x i ) ) 1 − y i ) (y_{\bold{w}}(\bold{x_i})^{y_i} * (1-y_{\bold{w}}(\bold{x_i}))^{1-y_i}) </math>(yw(xi)yi∗(1−yw(xi))1−yi) 作为每个样本的损失的话,则需要对每个样本的损失进行累乘来计算某组样本下的总损失,但实际上总损失应该等于各样本特征向量对应损失的累加,因此我们在等式两边分别取对数,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l o g P = l o g ∏ i = 1 n ( y w ( x i ) y i ∗ ( 1 − y w ( x i ) ) 1 − y i ) = ∑ i = 1 n l o g ( y w ( x i ) y i ∗ ( 1 − y w ( x i ) ) 1 − y i ) = ∑ i = 1 n ( l o g ( y w ( x i ) y i ) + l o g ( 1 − y w ( x i ) ) 1 − y i ) = ∑ i = 1 n ( y i ∗ l o g ( y w ( x i ) ) + ( 1 − y i ) ∗ l o g ( 1 − y w ( x i ) ) ) \begin{align} logP &= log \prod^n_{i=1}(y_{\bold{w}}(\bold{x_i})^{y_i} * (1-y_{\bold{w}}(\bold{x_i}))^{1-y_i}) \\ &= \sum^{n}{i=1}log(y{\bold{w}}(\bold{x_i})^{y_i} * (1-y_{\bold{w}}(\bold{x_i}))^{1-y_i}) \\ &= \sum^{n}{i=1}(log(y{\bold{w}}(\bold{x_i})^{y_i}) + log(1-y_{\bold{w}}(\bold{x_i}))^{1-y_i}) \\ &= \sum^{n}{i=1}(y_i*log(y{\bold{w}}(\bold{x_i})) + (1-y_i)*log(1-y_{\bold{w}}(\bold{x_i}))) \end{align} </math>logP=logi=1∏n(yw(xi)yi∗(1−yw(xi))1−yi)=i=1∑nlog(yw(xi)yi∗(1−yw(xi))1−yi)=i=1∑n(log(yw(xi)yi)+log(1−yw(xi))1−yi)=i=1∑n(yi∗log(yw(xi))+(1−yi)∗log(1−yw(xi)))
由于取对数不改变原函数的单调性,因此之前我们需要最大化 <math xmlns="http://www.w3.org/1998/Math/MathML"> P P </math>P,取对数后则为最大化 <math xmlns="http://www.w3.org/1998/Math/MathML"> l o g P logP </math>logP,但为了更好地定义"损失"的含义,我们希望将极大值问题转换为极小值问题,因此取 <math xmlns="http://www.w3.org/1998/Math/MathML"> − l o g P -logP </math>−logP,得到我们的交叉熵损失函数:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C r o s s E n t r o p y L o s s = − ∑ i = 1 n ( y i ∗ l o g ( y w ( x i ) ) + ( 1 − y i ) ∗ l o g ( 1 − y w ( x i ) ) ) Cross\space Entropy \space Loss = -\sum^{n}{i=1}(y_i*log(y{\bold{w}}(\bold{x_i})) + (1-y_i)*log(1-y_{\bold{w}}(\bold{x_i}))) </math>Cross Entropy Loss=−i=1∑n(yi∗log(yw(xi))+(1−yi)∗log(1−yw(xi)))
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:模型的参数总数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:样本 i 对应的真实标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y w ( x 1 ) y_{\bold{w}}(\bold{x_1}) </math>yw(x1):模型预测样本为标签1的概率
到此为止,就得到了交叉熵损失函数,同时也可以看出基于极大似然估计法的推导过程还是相对比较浅显易懂的;此外,我们一般会取均值,也就是在上面的公式基础上再乘以 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 n \frac{1}{n} </math>n1。
梯度下降法求解逻辑回归
为了让模型最优化,得到使得损失函数最小的参数值,对于二元逻辑回归来说,有多种方法可以用来求解参数,最常见的有梯度下降法(Gradient Descent)、坐标下降法(Coordinate Descent)、牛顿法(Newton-Raphson method)等,其中以梯度下降法最为著名,每种方法都涉及较为复杂的数学原理,但这些计算在执行的任务其实是类似的,本文主要对梯度下降的求解来进行主要说明。
梯度下降:梯度下降法也相对很容易理解,当只有一个参数时,所谓的梯度不过就是损失函数图像中某一点的斜率,当该点在最优解右侧时,斜率为正值,当该点在最优解左侧时,斜率为负值,同时由于损失函数为凸函数,因此当前位置离最优值越远,相应的斜率也就越大;我们将斜率乘以一个我们自己定义的超参数,将其称为步长,每次迭代中让参数值减去步长就能达到逐步逼近最优解的效果;对于多个参数也同理,我们对每个参数分别求损失函数的偏导数再将各个参数进行分别更新即可。
梯度下降求解逻辑回归过程
易得有如下变换:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> l o g ( y w ( x i ) ) = l o g ( 1 1 + e − ( w T x i + w 0 ) ) = − l o g ( 1 + e − ( w T x i + w 0 ) ) l o g ( 1 − y w ( x i ) ) = l o g ( 1 − 1 1 + e − ( w T x i + w 0 ) ) = l o g ( e − ( w T x i + w 0 ) 1 + e − ( w T x i + w 0 ) ) = l o g ( e − ( w T x i + w 0 ) ) − l o g ( 1 + e − ( w T x i + w 0 ) ) = − ( w T x i + w 0 ) − l o g ( 1 + e − ( w T x i + w 0 ) ) \begin{align} log(y_{\bold{w}(\bold{x_i})}) &= log(\frac{1}{1+e^{-{(\bold{w}^T\bold{x_i}+w_0)}}}) = -log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}) \\ log(1-y_{\bold{w}}(\bold{x_i})) &= log (1-\frac{1}{1+e^{-{(\bold{w}^T\bold{x_i}+w_0)}}}) = log (\frac{e^{-(\bold{w}^T\bold{x_i}+w_0)}}{1+e^{-{(\bold{w}^T\bold{x_i}+w_0)}}}) \\ &= log(e^{-(\bold{w}^T\bold{x_i}+w_0)}) -log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}) \\ &= -(\bold{w}^T\bold{x_i}+w_0) - log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}) \end{align} </math>log(yw(xi))log(1−yw(xi))=log(1+e−(wTxi+w0)1)=−log(1+e−(wTxi+w0))=log(1−1+e−(wTxi+w0)1)=log(1+e−(wTxi+w0)e−(wTxi+w0))=log(e−(wTxi+w0))−log(1+e−(wTxi+w0))=−(wTxi+w0)−log(1+e−(wTxi+w0))
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y w ( x i ) y_{\bold{w}}(\bold{x_i}) </math>yw(xi):模型对于第 i 个样本输出为对应真实标签的概率
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:第 i 个样本对应的真实标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w:参数向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i \bold{x_i} </math>xi:第 i 个样本对应的特征向量
对损失函数进行变换以便于求导,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> J ( w ) = − 1 n ∑ i = 1 n ( y i ∗ l o g ( y w ( x i ) ) + ( 1 − y i ) ∗ l o g ( 1 − y w ( x i ) ) ) = − 1 n ∑ i = 1 n ( − y i ∗ l o g ( 1 + e − ( w T x i + w 0 ) ) + ( 1 − y i ) ∗ ( − ( w T x i + w 0 ) − l o g ( 1 + e − ( w T x i + w 0 ) ) ) ) = − 1 n ∑ i = 1 n ( − y i ∗ l o g ( 1 + e − ( w T x i + w 0 ) − ( 1 − y i ) ∗ l o g ( 1 + e − ( w T x i + w 0 ) ) − ( 1 − y i ) ( w T x i + w 0 ) ) = 1 n ∑ i = 1 n ( ( 1 − y i ) ( w T x i + w 0 ) − l o g ( 1 + e − ( w T x i + w 0 ) ) ) \begin{align} J(\bold{w}) &= -\frac{1}{n}\sum^{n}{i=1}(y_i*log(y{\bold{w}}(\bold{x_i})) + (1-y_i)*log(1-y_{\bold{w}}(\bold{x_i}))) \\ &= -\frac{1}{n}\sum^n_{i=1}(-y_i * log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}) + (1-y_i) * (-(\bold{w}^T\bold{x_i}+w_0) - log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}))) \\ &= -\frac{1}{n}\sum^n_{i=1}(-y_i*log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)} - (1-y_i)*log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)}) - (1-y_i)(\bold{w}^T\bold{x_i}+w_0)) \\ &= \frac{1}{n}\sum^n_{i=1}((1-y_i)(\bold{w}^T\bold{x_i}+w_0) - log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)})) \end{align} </math>J(w)=−n1i=1∑n(yi∗log(yw(xi))+(1−yi)∗log(1−yw(xi)))=−n1i=1∑n(−yi∗log(1+e−(wTxi+w0))+(1−yi)∗(−(wTxi+w0)−log(1+e−(wTxi+w0))))=−n1i=1∑n(−yi∗log(1+e−(wTxi+w0)−(1−yi)∗log(1+e−(wTxi+w0))−(1−yi)(wTxi+w0))=n1i=1∑n((1−yi)(wTxi+w0)−log(1+e−(wTxi+w0)))
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y w ( x i ) y_{\bold{w}}(\bold{x_i}) </math>yw(xi):模型对于第 i 个样本输出为对应真实标签的概率
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:第 i 个样本对应的真实标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w:参数向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i \bold{x_i} </math>xi:第 i 个样本对应的特征向量
以某数据集中第 j 个参数为例,模型在某次迭代时计算得到损失函数后,该函数对第 j 个参数求偏导,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∂ J ( w ) ∂ w j = ∂ ∂ w j 1 n ∑ i = 1 n ( ( 1 − y i ) ( w T x i + w 0 ) − l o g ( 1 + e − ( w T x i + w 0 ) ) ) = 1 n ∑ i = 1 n ( ( 1 − y i ) ∂ ∂ w j ( w T x i + w 0 ) − ∂ ∂ w j l o g ( 1 + e − ( w T x i + w 0 ) ) ) = 1 n ∑ i = 1 n ( x i j ( 1 − y i ) − x i j ∗ e − ( w T x i + w 0 ) 1 + e − ( w T x i + w 0 ) ) = 1 n ∑ i = 1 n ( x i j − x i j ∗ e − ( w T x i + w 0 ) 1 + e − ( w T x i + w 0 ) − y i ∗ x i j ) = 1 n ∑ i = 1 n x i j ( 1 1 + e − ( w T x i + w 0 ) − y i ) = 1 n ∑ i = 1 n x i j ( y w ( x i ) − y i ) \begin{align} \frac{\partial J(\bold{w})}{\partial w_j} &= \frac{\partial}{\partial w_j} \frac{1}{n}\sum^n_{i=1}((1-y_i)(\bold{w}^T\bold{x_i}+w_0) - log(1+e^{-(\bold{w}^T\bold{x_i}+w_0)})) \\ &= \frac{1}{n}\sum^n_{i=1}((1-y_i)\frac{\partial}{\partial w_j}(\bold{w}^T\bold{x_i}+w_0) - \frac{\partial}{\partial w_j}log(1+e^{-(\bold{w}^T\bold{x_{i}}+w_0)})) \\ &= \frac{1}{n}\sum^n_{i=1}(x_{ij}(1-y_i) - \frac{x_{ij}*e^{-(\bold{w}^T\bold{x_{i}}+w_0)}}{1+e^{-(\bold{w}^T\bold{x_{i}}+w_0)}}) \\ &= \frac{1}{n}\sum^n_{i=1}(x_{ij} - \frac{x_{ij} * e^{-(\bold{w}^T\bold{x_{i}}+w_0)}}{1+e^{-(\bold{w}^T\bold{x_{i}}+w_0)}} - y_i*x_{ij}) \\ &= \frac{1}{n}\sum^n_{i=1}x_{ij}(\frac{1}{1+e^{-(\bold{w}^T\bold{x_{i}}+w_0)}} - y_i) \\ &= \frac{1}{n}\sum^n_{i=1}x_{ij}(y_{\bold{w}}(\bold{x_i}) - y_i) \end{align} </math>∂wj∂J(w)=∂wj∂n1i=1∑n((1−yi)(wTxi+w0)−log(1+e−(wTxi+w0)))=n1i=1∑n((1−yi)∂wj∂(wTxi+w0)−∂wj∂log(1+e−(wTxi+w0)))=n1i=1∑n(xij(1−yi)−1+e−(wTxi+w0)xij∗e−(wTxi+w0))=n1i=1∑n(xij−1+e−(wTxi+w0)xij∗e−(wTxi+w0)−yi∗xij)=n1i=1∑nxij(1+e−(wTxi+w0)1−yi)=n1i=1∑nxij(yw(xi)−yi)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y w ( x i ) y_{\bold{w}}(\bold{x_i}) </math>yw(xi):模型对于第 i 个样本输出为对应真实标签的概率
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:第 i 个样本对应的真实标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w:参数向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i \bold{x_i} </math>xi:第 i 个样本对应的特征向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i j x_{ij} </math>xij:第 i 个样本中第 j 个特征的值
即某次迭代中,对于第 j 个参数求偏导,得到的对应梯度为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∂ J ( w ) ∂ w j = 1 n ∑ i = 1 n x i j ( y w ( x i ) − y i ) \frac{\partial J(\bold{w})}{\partial w_j} = \frac{1}{n}\sum^n_{i=1}x_{ij}(y_{\bold{w}}(\bold{x_i}) - y_i) </math>∂wj∂J(w)=n1i=1∑nxij(yw(xi)−yi)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y w ( x i ) y_{\bold{w}}(\bold{x_i}) </math>yw(xi):模型对于第 i 个样本输出为对应真实标签的概率
- <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi:第 i 个样本对应的真实标签(0 or 1)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w:参数向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i \bold{x_i} </math>xi:第 i 个样本对应的特征向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> x i j x_{ij} </math>xij:第 i 个样本中第 j 个特征的值
对于数据集中某次迭代中所有参数组成的参数向量对应的梯度向量,使用如下方式表示:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ▽ J ( w ) T = [ ∂ J ( w ) ∂ w 1 ∂ J ( w ) ∂ w 2 ⋯ ∂ J ( w ) ∂ w m ] \triangledown J(\bold{w})^T = \begin{bmatrix} \frac{\partial J(\bold{w})}{\partial w_1} & \frac{\partial J(\bold{w})}{\partial w_2} & \cdots & \frac{\partial J(\bold{w})}{\partial w_m} \end{bmatrix} </math>▽J(w)T=[∂w1∂J(w)∂w2∂J(w)⋯∂wm∂J(w)]
在计算得到对应梯度后,对于参数向量的第 i+1 次迭代,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> w i + 1 = w i − α ∗ ▽ J ( w i ) \begin{align} \bold{w_{i+1}} &= \bold{w_i} - \alpha * \triangledown J(\bold{w_i}) \end{align} </math>wi+1=wi−α∗▽J(wi)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α:超参数,用来控制每次迭代中步长的大小
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w i \bold{w_i} </math>wi:迭代 i 次后的参数向量
- <math xmlns="http://www.w3.org/1998/Math/MathML"> ▽ J ( w i ) \triangledown J(\bold{w_i}) </math>▽J(wi):迭代 i 次后的梯度向量
当超参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α 设置过大时,步长过大,容易越过最优解,且由于凸函数中离最优解越远,梯度越大的性质,可能会发生损失随着迭代次数的增加逐步增大的效果;同理,当步长过小时,则可能需要更长的时间才能达到最优解。
分批计算梯度:对于用于计算梯度的损失函数的计算,我们也一般不会在每次迭代中让数据集中的所有样本都参与计算,折回浪费很多的算力资源和时间,我们更常将数据集中的样本分为几组(bath),每次迭代中仅采用部分数据(某个bath)进行计算和迭代。
梯度下降的理解还是相对容易的,无非就是求出每个参数对应的梯度,然后对参数进行更新,主要就是这两步,对于判断是否收敛,我们可以设置最大迭代次数,也可以对梯度或步长设置阈值等操作。
逻辑回归基本原理总结
逻辑回归模型核心内容在于其基本形式、损失函数以及模型求解,已知这三个过程的原理后,其拟合过程和其它模型思路基本相同;对于二分类任务,基于梯度下降来求解逻辑回归的一般思路:
- 准备数据集,随机初始化参数
- 对于每次迭代,基于交叉熵损失函数计算全部(或部分)样本的损失和每个参数对应的梯度
- 更新参数
- 若模型收敛或达到最大迭代数(或其它判定方法),则模型训练结束
逻辑回归原理拓展
除了逻辑回归模型的基本原理外,包括但也不限于逻辑回归等很多模型也常引入正则化项来调整模型拟合程度;此外,逻辑回归也不仅只能应用于二分类任务,我们也可以通过其他常见方法将其拓展到多分类任务,这里主要介绍常见的 OvR 和 MvM 两种常见方法。
正则化
正则化与正则项 :正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> w \bold{w} </math>w 的L1范式和L2范式的倍数来实现。这个增加的范式,被称为"正则项",也被称为"惩罚项"。随着损失函数改变,基于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范式表现为参数向量中的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值,如下所示:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> L 1 = ∑ i = 1 n ∣ w i ∣ L 2 = ∑ i = 1 n ( w i 2 ) \begin{align} L1 &= \sum^{n}{i=1}|w_i| \\ L2 &= \sqrt{\sum^n{i=1}(w_i^2)} \end{align} </math>L1L2=i=1∑n∣wi∣=i=1∑n(wi2)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:某数据集下的样本数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi 第 i 个参数(权重系数),注意这里 i 是从1开始取值的,不包括截距 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 0 w_0 </math>w0
设原来的损失函数为 <math xmlns="http://www.w3.org/1998/Math/MathML"> J ( w ) J(\bold{w}) </math>J(w),则加上正则项之后的损失函数则为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> J ( w ) L 1 = C ∗ J ( w ) + ∑ i = 1 n ∣ w i ∣ J ( w ) L 2 = C ∗ J ( w ) + ∑ i = 1 n ( w i 2 ) \begin{align} J(\bold{w}){L1} &= C * J(\bold{w}) + \sum^{n}{i=1}|w_i| \\ J(\bold{w}){L2} &= C * J(\bold{w}) + \sqrt{\sum^n{i=1}(w_i^2)} \end{align} </math>J(w)L1J(w)L2=C∗J(w)+i=1∑n∣wi∣=C∗J(w)+i=1∑n(wi2)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C:超参数,用来调整正则化程度(模型拟合程度)
- <math xmlns="http://www.w3.org/1998/Math/MathML"> J ( w ) J(\bold{w}) </math>J(w):交叉熵损失函数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:模型的参数总数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi 第 i 个参数(权重系数),注意这里 i 是从1开始取值的,不包括截距 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 0 w_0 </math>w0
超参数C控制原来交叉熵损失的大小,本质上是调整正则项的相对大小,直接从公式上进行理解,不难看出所谓的正则项不过就是将各参数(权重系数)以某种形式进行累加得到的一个范式,该范式随着各权重参数整体取值的增大而增大。
上图涉及的相关绘图代码以供参考(可忽略并折叠):
python
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('seaborn')
mpl.rcParams.update({
'font.family': 'Microsoft YaHei',
'mathtext.fontset': 'stix',
})
# 过拟合图像为手动绘制,仅为左侧图像绘制代码
x = np.arange(0.05, 5, 0.05)
y = np.log(x)
plt.figure(figsize=(6,4))
plt.plot(x, y, color='blue', alpha=0.6)
plt.scatter(x + rng.normal(0, 0.5, len(x)), y, s=30, c='red',alpha=0.6, edgecolor='white', linewidth=1)
plt.show()
对于不包含正则项的损失函数,只需要将交叉熵损失最优化即可,但这样很容易造成模型过拟合,我们想要降低模型拟合程度,因此加入正则项,模型在拟合时不仅要考虑原来的交叉熵损失,还要考虑各权重系数的大小所造成的损失,需要在这两个损失之间进行权衡,以达到总体损失最小。
从权重系数方面来看:在一次函数中就是斜率,其实在拥有多个权重系数、多个自变量的线性回归中也是一样的,当权重系数增大时,拟合函数的 "斜率" 也会相应增大,模型过拟合时拟合的效果本质上也就是因为这种 "斜率" 过大,我们通过限定各权重参数的大小来防止 "斜率" 过大,从而达到防止过拟合的效果。
从损失函数方面来看:通过引入正则项,本质上是改变了模型优化目标的最优点,使得真正的优化目标(权衡欠拟合和过拟合后的最佳效果)作为模型优化目标。
当然不是带正则化的损失函数都可以将目标效果设置为我们的优化目标,这取决于超参数的选择,当正则项对损失贡献占比过大时,可能会越过真正的目标点,造成模型欠拟合,同理,当过小时,则可能会造成模型仍然过拟合。
在网络上也常能看到基于L1范式和L2范式的其它形式的正则项,例如:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> J ( w ) L 1 = J ( w ) + λ n ∑ i = 1 n ∣ w i ∣ J ( w ) L 2 = J ( w ) + λ 2 n ∑ i = 1 n w i 2 \begin{align} J(\bold{w}){L1} &= J(\bold{w}) + \frac{\lambda}{n}\sum^{n}{i=1}|w_i| \\ J(\bold{w}){L2} &= J(\bold{w}) + \frac{\lambda}{2n}\sum^n{i=1}w_i^2 \end{align} </math>J(w)L1J(w)L2=J(w)+nλi=1∑n∣wi∣=J(w)+2nλi=1∑nwi2
- <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ:超参数,用来调整正则化强度
- <math xmlns="http://www.w3.org/1998/Math/MathML"> J ( w ) J(\bold{w}) </math>J(w):交叉熵损失函数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:模型的参数总数
- <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi 第 i 个参数(权重系数),注意这里 i 是从1开始取值的,不包括截距 <math xmlns="http://www.w3.org/1998/Math/MathML"> w 0 w_0 </math>w0
这里通过超参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 来直接调整正则项对损失的贡献占比,此外这里L2范数的正则化项分母为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 n 2n </math>2n 是为了便于求导(有平方项,求导后正好把常数2约去,便于计算)。
无论正则项的形式如何变化,引入的目的都是为了防止模型过拟合,将目标效果作为模型本身优化的方向,以达到更低的泛化误差。
L1正则化和L2正则化的选择 :L1正则化和L2正则化虽然都可以控制过拟合,但效果并不相同;当正则化强度逐渐增大(即 <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C 逐渐变小或 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 逐渐增大), 参数(各权重系数)的取值会逐渐变小,但L1正则化会更趋于将参数压缩为0,L2正则化则趋于让参数尽量小,但不会取到0。
相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但 是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。
特征选择:由于L1正则化和L2正则化在效果上的不同,在L1正则化在逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带大量信息的、对模型有巨大贡献的特征的参数更快地变成0,因此L1正则化本质就是一个特征选择的过程,一定程度上影响了参数的"稀疏性"。L1正则化越强,参数向量中就含有越多的0,参数就越稀疏,选出来的特征就越少,以此来防止过拟合。因此,若特征量很大,数据维度很高,我们会倾向于使用L1正则化,反之则一般选用L2正则化;由于L1正则化的这个性质,在对逻辑回归基于嵌入法进行特征选择时,一般使用引入L1正则项的逻辑回归。
多分类的逻辑回归
OvR:One vs Rest
基本思想:One(一个)-Vs-Rest(其余部分)的思想是把一个多分类的问题变成一个二分类问题;转变的思路就如同方法名称描述的那样,选择其中一个类别为正类(Positive),使其他所有类别为负类(Negative);例如我们可以将三角形所代表的类别视为正类,其他类别全部视为负类。
由于我们将其中一个类别作为正类,其它所有类别作为负类,因此要想解决多分类问题的话,假设有 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个类别,那就需要有 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个以不同类别作为正类的分类器,训练结束后对模型输入某样本对应特征向量,这 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个分类器分别输出各自对应正类的概率,最后选择概率最大的作为我们的分类结果输出。
基于OvR这种思想很容易可以把我们的逻辑回归从二分类拓展到多分类问题上,但缺点也较为明显,对于每个分类器,我们选择数据集中其中一个类别作为正类,其它所有的类别都作为负类,当类别较多时,这很容易造成样本不均衡的问题,即很容易出现负类样本远高于正样本数量的问题,我们当然也可以采取一些例如上采样的方法来解决这个问题,但效果肯定没有相同分布下的均衡数据集的效果要好,一次你使用这种方法时可以事先检查一下样本不均衡是否严重,然后再决定是否选择该方法。
MvM:Multinomial
回顾上边sigmoid函数推导过程中,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> y = l n ( z 1 − z ) = l n ( p ( y i = 1 ) p ( y i = 0 ) ) = w T x \begin{align} y=ln(\frac{z}{1-z}) = ln(\frac{p(y_i=1)}{p(y_i=0)}) = \bold{w}^T\bold{x} \end{align} </math>y=ln(1−zz)=ln(p(yi=0)p(yi=1))=wTx
对于所有 K 个可能的分类结果,我们运行 K−1 个独立二元逻辑回归模型,在运行过程中把其中一个类别看成是主类别,然后将其它K−1个类别和我们所选择的主类别分别进行回归;通过这样的方式,例如这里选择结果 K 作为主类别,对于第 i 个样本对应的特征向量,我们可以得到如下公式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> { l o g p ( y i = 1 ) p ( y i = K ) = w 1 T x i l o g p ( y i = 2 ) p ( y i = K ) = w 2 T x i ⋮ l o g p ( y i = K − 1 ) p ( y i = K ) = w K − 1 T x i ⟶ { p ( y i = 1 ) = p ( y i = K ) e w 1 T x i p ( y i = 2 ) = p ( y i = K ) e w 2 T x i ⋮ p ( y i = K − 1 ) = p ( y i = K ) e w K − 1 T x i \begin{cases} log\frac{p(y_i=1)}{p(y_i=K)} = \bold{w_1}^T\bold{x_i} \\ log\frac{p(y_i=2)}{p(y_i=K)} = \bold{w_2}^T\bold{x_i} \\ \quad \quad \vdots \\ log\frac{p(y_i=K-1)}{p(y_i=K)} = \bold{w_{K-1}}^T\bold{x_i} \\ \end{cases} \longrightarrow \begin{cases} p(y_i=1) = p(y_i=K)e^{\bold{w_1}^T\bold{x_i}} \\ p(y_i=2) = p(y_i=K)e^{\bold{w_2}^T\bold{x_i}} \\ \quad \quad \vdots \\ p(y_i=K-1) = p(y_i=K)e^{\bold{w_{K-1}}^T\bold{x_i}} \\ \end{cases} </math>⎩ ⎨ ⎧logp(yi=K)p(yi=1)=w1Txilogp(yi=K)p(yi=2)=w2Txi⋮logp(yi=K)p(yi=K−1)=wK−1Txi⟶⎩ ⎨ ⎧p(yi=1)=p(yi=K)ew1Txip(yi=2)=p(yi=K)ew2Txi⋮p(yi=K−1)=p(yi=K)ewK−1Txi
由于所有可能的结果对应的概率相加为1,则有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∑ i = 1 K p ( y i = i ) = p ( y i = K ) + ∑ i = 1 K − 1 p ( y i = i ) = p ( y i = K ) + ∑ i = 1 K − 1 p ( y i = K ) e w i T x i \begin{align} \sum^{K}{i=1} p(y_i=i) &= p(y_i=K) + \sum^{K-1}{i=1}p(y_i=i) \\ &= p(y_i=K) + \sum^{K-1}_{i=1}p(y_i=K)e^{\bold{w_i}^T\bold{x_i}} \\ \end{align} </math>i=1∑Kp(yi=i)=p(yi=K)+i=1∑K−1p(yi=i)=p(yi=K)+i=1∑K−1p(yi=K)ewiTxi
概率全部相加为1,我们可以利用该等式解出 <math xmlns="http://www.w3.org/1998/Math/MathML"> p ( y i = k ) p(y_i=k) </math>p(yi=k),即:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( y i = K ) + ∑ i = 1 K − 1 p ( y i = K ) e w i T x i = 1 p ( y i = K ) + p ( y i = K ) ∑ i = 1 K − 1 e w i T x i = 1 ( 1 + ∑ i = 1 K − 1 e w i T x i ) p ( y i = L ) = 1 p ( y i = K ) = ( 1 + ∑ i = 1 K − 1 e w i T x i ) − 1 \begin{align} p(y_i=K) + \sum^{K-1}{i=1}p(y_i=K)e^{\bold{w_i}^T\bold{x_i}} &= 1 \\ p(y_i=K) + p(y_i=K)\sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}} &= 1 \\ (1 + \sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}})p(y_i=L) &= 1 \\ p(y_i = K) &= (1 + \sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}})^{-1} \end{align} </math>p(yi=K)+i=1∑K−1p(yi=K)ewiTxip(yi=K)+p(yi=K)i=1∑K−1ewiTxi(1+i=1∑K−1ewiTxi)p(yi=L)p(yi=K)=1=1=1=(1+i=1∑K−1ewiTxi)−1
我们再把该式子代入到原来的 K-1 个式子中得到:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( y i = K ) = ( 1 + ∑ i = 1 K − 1 e w i T x i ) − 1 ⟶ { p ( y i = 1 ) = e w 1 T x i 1 + ∑ i = 1 K − 1 e w i T x i p ( y i = 2 ) = e w 2 T x i 1 + ∑ i = 1 K − 1 e w i T x i ⋮ p ( y i = K − 1 ) = e w K − 1 T x i 1 + ∑ i = K − 1 K − 1 e w i T x i p(y_i = K) = (1 + \sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}})^{-1} \longrightarrow \begin{cases} p(y_i=1) = \frac{e^{\bold{w_1}^T\bold{x_i}}}{1 + \sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}}} \\ p(y_i=2) = \frac{e^{\bold{w_2}^T\bold{x_i}}}{1 + \sum^{K-1}{i=1}e^{\bold{w_i}^T\bold{x_i}}} \\ \quad \quad \vdots \\ p(y_i=K-1) = \frac{e^{\bold{w{K-1}}^T\bold{x_i}}}{1 + \sum^{K-1}_{i=K-1}e^{\bold{w_i}^T\bold{x_i}}} \\ \end{cases} </math>p(yi=K)=(1+i=1∑K−1ewiTxi)−1⟶⎩ ⎨ ⎧p(yi=1)=1+∑i=1K−1ewiTxiew1Txip(yi=2)=1+∑i=1K−1ewiTxiew2Txi⋮p(yi=K−1)=1+∑i=K−1K−1ewiTxiewK−1Txi
至此,我们就有了基于K-1个独立的二元逻辑回归模型下对于每一个类别的预测概率,接下来的步骤就和sigmoid函数推导部分中介绍的一样了,也就是对每一个类别所对应的式子分别求其反函数后可以得到每一类别与各个 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i T x \bold{w_i}^T\bold{x} </math>wiTx 的关系,也就是可以基于这K-1个独立的模型推出每一类别的概率,之后对于每个独立模型分别计算损失和进行梯度下降即可。
总结
对于本文在最开始提出的问题,基于本文内容在此做简要总结:
- 为什么需要掌握逻辑回归?
- 逻辑回归如今在金融领域使用的仍然很多,此外,它也是后续学习中必不可少的基础。
- sigmoid函数是怎么来的?
- 基于概率知识进行推导,此外,sigmoid在很大程度上解决了线性判别函数所存在的问题。
- 交叉熵损失函数是怎么来的?
- 基于极大似然估计法进行推导,当然也不仅限于这一个推导或解释方法。
- 怎么使用梯度下降对逻辑回归进行求解?
- 对于每次迭代,基于损失函数求每个参数的偏导数,通过多次迭代来更新参数以寻找全局最优解。
- 逻辑回归通过什么方法减少过拟合程度?
- 正则化,可以引入l1、l2正则化来调整模型拟合程度,此外,由于l1正则化本身的性质,其也可以用来进行特征选择。
- 逻辑回归怎么完成多分类任务?
- 常用的包括但不限于OvR和MvM这两种方法,这两种方法都通过建立多个模型将原来的二元逻辑回归拓展到了多分类任务上,但一般情况下MvM有着更严谨的理论推导和模型效果。