逻辑回归1_殊途同归的推导——极大似然概率和最小损失函数,以及正则化简介

博客是我个人学习的心得记录——以及挑战,不见得对,欢迎指正。如果有疑问,欢迎留言探讨,我基本都会回复。

逻辑回归系列如下:

序号 内容 完成时间
1 殊途同归的推导——极大似然概率和最小损失函数,以及正则化简介 2018.12.04
2 不要只是掉包侠——手把手实现logistics算法
3 善用现有轮子——sklearn中的logistics如何调参
4 连续特征离散化——改善模型的非线性表达能力
5 WOE转化——变量筛选以及变量转化的其他思路

1. 算法推导

介绍算法比较无聊(敲公式也比较累),但是为了完整性,我们快速过下核心推导过程。

逻辑回归试图找到一个分离间隔来区分0类和1类(一般定义我们关心的类别为1类),分离间隔的表达式如下:
z = w_1x_1+w_2x_2+w_3x_3+……+w_nx_n+b
一般用向量表示,即:
z=W^TX+b
判别时将其作为sigmoid函数的输入,得到1类的概率 a
a =\frac{1}{1+e^{-z}}
求解逻辑回归的过程,就是求解W^Tb的过程。我们通过最小化损失函数或极大似然概率来求解,先说第一种。

1.1 最小化损失函数

损失函数用来衡量预测值和真实值之间的差异,差异越大,损失函数越大。我们关注损失函数的这种特性,反而不关注具体损失是多少。

逻辑回归输出类别的概率,真实的概率是1,则对该类的预测概率越低,损失函数越大。可用 $-log(p)$ 表示,$-log(p)$的曲线如下:(注意此时$p$与 $a$不是同个概念,$a$指1类的概率,$p$代表任何一类)
逻辑回归的损失只跟真实类的-log(p)有关

可见:

  • p越小,预测得越不准,损失越大。当p趋于0,损失趋于无穷大
  • p越大,预测得越准,损失越小。当p趋于1,损失趋于0

具体对逻辑回归来说

  • 当样本属于1类,即 y=1时,预测结果p=a,损失函数为-log(a);
  • 当样本属于0类,即 y=0时,预测结果p=1-a,损失函数为 -log(1-a)

统一起来,单样本的损失函数可表示为:
L(y,a) =-ylog(a)-(1-y)log(1-a)
分别把y=1y=0 代进去,会发现这个公式的巧妙之处。

这个损失函数被成为交叉熵损失函数。(关于信息熵,交叉熵,联合熵,条件熵等等各种熵,关系千丝万缕,我们会另外开贴聊)

插句题外话,你如果见过其他资料,可能觉得我说得有点复杂,怎么又是a又是p的。这样的好处是,当以后你遇到多分类,即sofmax回归的损失函数时,会发现其损失也是通过真实类别的预测概率 -log(p) 来表示的,那时候你就会发现这样理解更统一了。

现在我们的目的是最小化损失函数,采用的方法是梯度下降。简单来说就是:我们要求得一组合适的$W$向量和$b$,使得损失函数$L(y,a)$ 最小。但是没办法直接求得答案,我们通过以下方法求解:(取 $W$ 向量中一个 $w$为例)
  1. 随机初始化 wb,比如说0
  2. 计算 wb 的梯度 \frac{\partial{L}}{\partial{w}}\frac{\partial{L}}{\partial{b}}
  3. 设定一个学习率 \alpha ,更新 wb 的值: w = w-\alpha \frac{\partial{L}}{\partial{w}} , b = b-\alpha\frac{\partial{L}}{\partial{b}}
  4. 迭代执行2-3步骤
  5. 当满足两个条件之一停止迭代:1)前后两次的值变化小于某个很小的阈值 2)迭代轮次达到某个指定次数。

\alpha是一个超参数,需要多次尝试取得最佳值。现在的问题是梯度 \frac{\partial{L}}{\partial{w}}\frac{\partial{L}}{\partial{b}} 怎么计算。推导过程如下。

整理一下,现在有如下算式
\left\{ \begin{array}{c} L(y,a) =-ylog(a)-(1-y)log(1-a) \\ a =\frac{1}{1+e^{-z}} \\ z=W^TX+b\end{array} \right.
根据高中学过的复合函数的求导方式(深度学习DNN里称作链式法则——换了个名字我差点认不出你赵二蛋了)
\left\{ \begin{array}{c} \frac{\partial{L}}{\partial{w}} = \frac{\partial{L}}{\partial{a}} \frac{\partial{a}}{\partial{z}} \frac{\partial{z}}{\partial{w}} \\ \frac{\partial{L}}{\partial{b}} = \frac{\partial{L}}{\partial{a}} \frac{\partial{a}}{\partial{z}} \frac{\partial{z}}{\partial{b}} \\ \end{array} \right.
两个等式中都有 \frac{\partial{L}}{\partial{a}}\frac{\partial{a}}{\partial{z}}, 先求导得:
\begin{align} \frac{\partial L}{\partial a} & =-\frac{y} {a} - \frac{1-y} {1-a} *(-1)\\ & = -\frac{y} {a} + \frac{1-y} {1-a} \\ \end{align}

\begin{align} \frac{\partial a}{\partial z} & =(-1)*\frac{1}{(1+e^{-z})^2}*e^{-z}*(-1) \\ & = \frac{1}{1+e^{-z}}*\frac{e^{-z}-1+1}{1+e^{-z}} \\ & = \frac{1}{1+e^{-z}}*( 1-\frac{1}{1+e^{-z}}) \\ & = a(1-a) \end{align}

则两个相乘,计算得:
\begin{align} \frac{\partial L}{\partial z} &=\frac{\partial L}{\partial a} \frac{\partial a}{\partial z}\\ & =( -\frac{y} {a} + \frac{1-y} {1-a}) * a(1-a) \\ & = -y(1-a) + (1-y)a \\ & =-y+ay+a-ay \\ & = a-y \end{align}
求导到这里,算式又变简单了,舒服了。。。接着来,对于一组W向量来说,当对某个具体的w求偏导,其余w可以看做常量,则求导结果为所求w对应的x。对b来说,系数固定为1,则求导结果为1。如下:
\left\{ \begin{array}{c} \frac{\partial z}{\partial w} = x \\ \frac{\partial z}{\partial b} = 1\\ \end{array} \right.
综上,最终梯度计算结果如下:
\left\{ \begin{array}{c} \frac{\partial L}{\partial w} =\frac{\partial L}{\partial z}\frac{\partial z}{\partial w}=(a-y)x \\ \frac{\partial L}{\partial b} =\frac{\partial L}{\partial z}\frac{\partial z}{\partial b}=a-y \\ \end{array} \right.
这样, wb 就可以求解了。

最后总结一下逻辑回归的运行过程——用深度神经网络来说,分为前向过程和后向过程。

  1. 随机初始化 wb,代入式子计算出得到 a (前向过程)
  2. 根据 a 计算出 wb 的梯度,利用 梯度跟新 w$$和和b$ 的值(后向过程)
  3. 根据新的 wb ,继续计算 a,如此重复迭代前向和后向过程,直到满足停止迭代的条件。

多样本的情况

为了便于阐述,上述假设只有单样本。多样本的情况是类似的,假设针对 m 样本,则平均损失函数为:
L(y,a) =\frac{1}{m}\sum_{i=1}^m[-y_ilog(a_i)-(1-y_i)log(1-a_i)]
求和项的导数,等于各项加数分别求导后再相加。所以基于m 个样本的损失函数求得的平均梯度,实际等于分别基于各个样本求得梯度再求平均。即:
\left\{ \begin{array}{c} \frac{\partial L}{\partial w} (avg)=\frac{1}{m}\sum_{i=1}^m(a_i-y_i)x_i \\ \frac{\partial L}{\partial b}(avg) =\frac{1}{m}\sum_{i=1}^m(a_i-y_i) \\ \end{array} \right.

  • m= 全部样本时,这种方法叫梯度下降,每次迭代采用全部样本,收敛速度较快,但运算速度慢。
  • m= 1 时,这种方法叫随机梯度下降,每次迭代随机抽取一条样本,收敛速度较慢,但运算速度快。
  • 1<m< 全部样本时,这种方法叫batch梯度下降,一个batch取若干个样本,是上述两种方式的折衷。

1.2 用最大似然估计推导

如上所述,逻辑回归可以输出各个类别的概率,即对于当前给定的样本来说(其实就是给你一堆已知的 $x$ ),代入不同 $W$ 和 $b$ ,可以计算得到同一样本的不同概率,把所有样本的概率连乘起来,就是整体样本的概率。那么哪一组 $W$ 、 $b$  是最逼近真实值的最佳估计值呢?最大似然估计内涵在于:以使当前整体样本出现的概率为最大值的那一组 $W$ 和 $b$ 作为最佳估计值。

极大似然估计的求解一般分为三个步骤:

  1. 写出似然函数,一般为一个概率连乘的表达形式。
  2. 将概率相乘转化为 log 相加(增减趋势一致)
  3. log 相加的最大值

首先假设 Wb 已知,计算每个样本出现的概率:

  • 对于正样本,p=\frac{1}{1+e^{-(W^TX+b)}} = a
  • 对于负样本,由于是二分类,所以 p=1-a

则不论是正样本( y=1 ),还是负样本( y=0 ),一个样本的概率可以统一表示为:
p = a^y(1-a)^{1-y}
整个样本出现的概率,即似然函数,可以表达为:
L=\prod_mp_i=\prod_ma_i^{y_i}(1-a_i)^{1-y_i}
求解 L 的最大值等于求解 log(L) 的最大值,注意这里 log 底数必须大于1。当 log 底数大于1时, log函数是严格单调递增的, 随着 L 的增大,log(L) 也跟着增加。也就是说,我们并不在乎最大具体是多少,我们只在乎在哪个点取得最大值。

所以转化如下:
\begin{align} log (L) &=log(\prod_ma_i^{y_i}(1-a_i)^{1-y_i})\\ & = \sum_mlog(a_i^{y_i}(1-a_i)^{1-y_i}) \\ & = \sum_m(loga_i^{y_i}+log(1-a_i)^{1-y_i}) \\ & = \sum_m[y_iloga_i+(1-y_i)log(1-a_i)] \end{align}
进一步的,求 log(L) 的最大值,等于求 -log(L) 的最小值,所以求解目标转化为最小化下式:
-log (L) = \sum_m[-y_iloga_i-(1-y_i)log(1-a_i)]
有没有惊奇的发现,这个式子不就是上面的损失函数么。于是最终,两种方法,殊途同归。接下来用梯度下降进行求解,剩下的步骤就和上述一致了。

1.3 正则项——修正过拟合

啥叫过拟合:模型过于复杂,以至于把数据噪声也记下来了。

怎么判断过拟合:来自同一数据分布的训练集和测试集效果差异很大,如训练集准确率很高,但测试集没那么高,有显著差异。训练集准确率高,是因为把数据噪声也学习进去了。

怎么解决过拟合:主要有:从算法层面有逻辑回归增加正则处理、决策树减枝、神经网络dropout等,都是为了降低模型的复杂度;从数据层面有增加数据量,使训练数据尽量接近真实数据。

过拟合作为机器学习共有的知识点,并不是逻辑回归专属,所以不过多介绍了,主要简单说说逻辑回归怎么解决。

逻辑回归通过增加$L1$或$L2$正则项,来降低模型的复杂度,进而减少过拟合。

增加 L1 正则项损失函数如下:
\left\{ \begin{array}{c} L(y,a) =\frac{1}{m}\sum_{i=1}^m[-y_ilog(a_i)-(1-y_i)log(1-a_i)] + \lambda||W||^1 \\ \lambda||W||^1 = \lambda(w_1+w_2+w_3+\dots+w_n) \\ \end{array} \right.
增加 L1 正则项损失函数如下:
\left\{ \begin{array}{c} L(y,a) =\frac{1}{m}\sum_{i=1}^m[-y_ilog(a_i)-(1-y_i)log(1-a_i)] + \frac{\lambda}{2}||W||^2 \\ \frac{\lambda}{2}||W||^2 = \frac{\lambda}{2}(w_1^2+w_2^2+w_3^2+\dots+w_n^2) \\ \end{array} \right.
也就是说,在计算损失的时候,不仅关注预测值和真实值之间的差距,也关注系数项 W 的大小。通过控制系数来降低模型复杂度,从而减少过拟合,增加泛华能力。

众所周知,关于 L1L2 正则话的区别如下:

  • L1 正则项能够使相关系较低的特征,对应的系数等于0,得到稀疏的W 向量
  • L2 正则项倾向将特征的系数缩小趋于0

关于个中原理,我见过很多解释,比较出名的从”损失函数等高线“几何图进行解释的。我自己的理解比较简单,如果有错烦请不吝指出。

不管那种正则项,用梯度下降计算梯度时,前面那部分求导是一致,差别在于后半部分。$L1$ 的 $\lambda||W||^1 $ 求导出来是 $\pm\lambda$ ,意味着在多次迭代中,不管系数 $w$ 大小如何,$w$ 会比较恒定的加减某个值——即便是$w$ 已经很小了,因此比较容易减小为0。而$L2$ 的 $ \frac{\lambda}{2}||W||^2 $ 求导出来是 $\lambda w$ , 当$w$ 比较小的时候, $\lambda w$ 也比较小,所以$w$会减去一个较小的值,不断区域0但不会等于0。

逻辑回归(1)到此结束,本来打算理论只写1500,结果现在3000+了,我还是太啰嗦了……

下一篇是不掉包,手动实现逻辑回归。(终于不用敲公式了 ……)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容