【打破砂锅问到底】你说的那个逻辑回归,它有逻辑吗

找着找着工做就发现算法这东西日常只学了个皮毛,面试官问的深一点就啥都不会了,因此在这里把看过的学过的所有仔细打磨一遍,刨根问底,由于总有一些东西是日常书上或者博客上没有仔细写一笔带过的,而亲爱的面试官就喜欢问这些一笔带过的,反正就是得先会从头至尾造个火箭,你才能进来拧螺丝。html

这里写的东西基本上是给本身作个总结,由于我记性很差过一阵不用确定就忘,因此不会上来就罗列公式,那样我本身都看不下去。可是也不会不涉及公式,由于面试官就是要你手推公式啊喂!因此我会尽可能用相互融合的方式把算法的道理讲清楚,也把公式弄明白。面试

*引言

假设咱们拿到了一家大厂的offer,而后为了看看真实的工资状况咱们找神奇的海螺获取到了公司的不少员工的工资,但是光看也看不出什么,这时咱们听到HR说工资和工龄以及绩效有关,刚好神奇的海螺又给了咱们这些员工的工龄和绩效。这下咱们可就开心了,咱们隐约以为好像能够用个什么科学的方法把咱们将来的工资算出来,而后就升职加薪排队出如今咱们面前了……等等,这只有工资,升职又是靠什么呢?神奇的海螺感受到了咱们的疑问,又给了咱们这些员工的升职状况。嗯,拿着手里沉甸甸的数据,看着海螺远去的背影,咱们知道升职和加薪的秘密就在咱们手中了。算法

*线性回归

咱们先从线性回归提及,由于这个逻辑回归是线性模型,不管如何也是绕不过线性回归的。咱们拿到手的数据显然应该是这样数组

工资 工龄 绩效
5k 2 3.5
10k 5 3.5
15k 6 3.75
…… …… ……

咱们把工资视为y,工龄和绩效视为{x}_{1}x_2,若是使用线性方程表示的话有函数

y=f(x)=\omega_1x_1+\omega_2x_2+b

写的更通常一点学习

y=f(x)=\omega^Tx_i+b

这里的\omegax就都是向量形式了。那么咱们有了这样的一个方程(其实就是模型),咱们须要知道的是里面的参数\omegab该如何求出。等等,都已是向量了,咱们为何不把b写进参数\omega中呢?咱们人为的对数据增长一列,即优化

工资 工龄 绩效 无实义
5k 2 3.5 1
10k 5 3.5 1
15k 6 3.75 1
…… …… …… 1

而后把b收入\omega中,就有.net

\omega=(\omega_1,\omega_2,\omega_3,…,\omega_n)^T 这里的\omega_n=b设计

而后对于x就是cdn

X=(X_1,X_2,X_3,…,X_n)

那么模型就能够表示为

\hat{y}=X\cdot\omega

如今考虑如何求呢\omega?咱们假设咱们已知了一个参数向量\omega,那么咱们起码知道如何评价它————也就是看他算的准不许。咱们用咱们真实的工资y来和模型的输出\hat{y}作一个对比,要是差的很少就说明他好,差的多就说明很差。那么咱们选均方根偏差做为这个评价函数(也就是损失函数),有

L=\sum_{i=1}^{m} (y_i-\hat{y})^2

咱们发现选MSE做为损失函数的话就能够把预测值与真值之间的差转换到[0,+\infty),那显然这个结果越接近0就越好。因此不妨咱们把损失函数展开,就有

(ps,这里不知道会不会有面试官怼人问为何MSE不用MAE,这应该和MAE不到处可导有关,延申下去可能还有L1和L2范数,以及为何L1有稀疏做用……可以牵出太多了,标记一下下次解释)

L(y,X)=(y-X\omega)^T(y-X\omega)

再展开有

L(y,X)=\omega^TX^TX\omega-2(X\omega)^Ty+y^Ty

求个导数

\frac{\partial L}{\partial \omega}=2X^TX\omega-2X^Ty

令他们等于零获得

\omega^*=(X^TX)^{-1}X^Ty

因而咱们知道了参数\omega如何计算,有了参数,也就有了模型,咱们的线性模型就这样出来啦。
咱们小小总结一下线性回归的这一套流程。①咱们先定了模型的样式(线性的),②而后就知道了咱们须要求出的参数是什么(\omega),③接下来咱们找了一个评价函数用于评价咱们的模型到底好很差(MSE),④把咱们的模型带入MSE里面,经过数学的方式解出了咱们的参数,从而完成了咱们的模型。

是否是感受有点轻松哈,这么容易一个模型就被咱们算出来了,总算知道那些专攻数学的人的快感在哪里了。都不用作实验,经过证实就直接宣告告终论的正确

*逻辑回归

该开始上硬菜了,如今咱们知道咱们的薪资了,那咱们何时升职呢?假设咱们拿到的数据是这样的

一年内是否升职 工龄 绩效
2 3.5
5 3.5
6 3.75
…… …… ……

那咱们怎么去算咱们一年以内升职的几率呢?不如照葫芦画瓢先来一套线性回归,那么咱们先上一个线性方程吧。等等,不太对,咱们若是要用线性方程去拟合咱们一年以内是否升职的几率,那么咱们的数据的第一列应该是一年内升职的几率,而不是一个肯定的结果。那咋办呢?而咱们的模型要输出几率,咱们获得的最终结果倒是结果,那又要怎么将这两个结合从而评价咱们的模型呢?咱们这里用一个sigmoid函数来帮助咱们。

Sigmoid=\theta(z)=\frac{1}{1+e^{-z}}

这个函数你们确定都熟悉了,图像就不展现了,它有两个性质是重要且会用到的这里提一下

  • \theta(-z)=1-\theta(z)
  • \theta'(z)=\theta(z)(1-\theta(z))

这个函数的好处是能够把实数域的值映射到(0,1),那么这个输出就能够看做是一个几率,而输入是什么呢,就是咱们最原始的线性模型的输出。光说可能很差理解,咱们整个公式吧,假设咱们有个线性模型

z=f(x)=\omega_1x_1+\omega_2x_2+b

写成向量形式

\hat{z}=X\cdot\omega

诶有点熟悉啊,这不就是前面刚提过的线性回归嘛。行了别讲了,这题我会,接下来要找损失函数,MSE,而后带入,求解,齐活

然而并非这样的,假设咱们是一维的数据,好比说咱们不知道每一个人的绩效,只知道工龄,而后把他们的升职与否画在图上,有

这样的数据如何优美的用一条直线拟合呢?很明显不合适的

这里也是我曾经疑惑的一个点,为何非要用sigmoid,直接的线性回归为何不能作,其实有时候本身动手作一步,答案就摆在眼前了。后期我会把这里的图片更详细的画一下,这里先这样

那么咱们仍是乖乖的求助sigmoid吧,咱们把上面的输出z整合到sigmoid中,有

h(X)=\theta(X\omega)= \frac{1}{1+e^{-X\omega}}

这里面z=X\cdot\omega是逻辑回归里面的线性部分,而后将这个线性部分经过一个sigmoid函数以后,咱们就获得了最后的几率,表明预测类别为1类的几率。那接下来要作第二步,找出咱们要求的模型参数————仍是\omega,多好。那么第三步,咱们该评价咱们的模型了,得找出一个损失函数才行,那么这个函数用什么呢?用咱们的老朋友MSE?这里咱们先顺序往下推,而后再回头看咱们的讨论MSE在这里是否合适

**几率分布推导

因为咱们预测的是类别,好比1类和0类,那咱们就能够定义一个样本属于1类或0类的几率,这是分类问题下才可以有的假设,在回归问题下,不存在回归结果为某一值的几率,这一点想来各位看到这里的都清楚哈。咱们假设类别为1的几率是\hat p,则

P(y|X)=\hat p
P(y=0|X)=1-\hat p

这个等式表明当咱们获得一个数据特征向量X的时候,其属于正类(1)的几率是\hat p,属于负类(0)的几率是1-\hat p。经过相乘咱们能够将这个几率整合到一个等式中,即

P(y|X)=\hat p^y \ast (1-\hat p)^{(1-y)}

能够发现当y取1和0的时候正好就是分开的两个等式。这个时候,在别的Blog里面就会说须要使这个P(y|X)取最大值,那么为何呢?

想象目前咱们拿到一个数据特征向量X,咱们这个时候偷偷看了一眼答案,发现这个X其实是正样本,也就是标签为1,那么咱们这个时候是否是就要祈祷咱们的模型预测其为1的几率越靠近1越好,若是等于1就最好了!而这个时候的几率是\hat p,也就是\hat p越大越好。OK,那么反过来,假设咱们偷看了答案,发现X其实是负样本,标签为0,那么咱们须要咱们的模型预测它为0的几率越大越好,此时几率是(1-\hat p),因此\hat p越小越好。

这个时候有点晕,一会须要\hat p越大越好,一会须要越小越好,那咱们如何衡量呢?实际上这就是把两个式子合二为一的优势。当咱们的样本标签为1的时候,咱们的P(y|X)会变成P(y=1|X),此时咱们但愿P(y=1|X)越大越好,于是P(y|X)越大越好;
当咱们的样本标签为0,咱们的P(y|X)会变成P(y=0|X),此时咱们但愿P(y=0|X)越大越好,一样P(y|X)越大越好,那么咱们就发现了不管什么状况下,P(y|X)越大越好。

这里这么多废话就是想说清楚一句:令每一个样本属于其真实标签的几率越大越好

这样咱们就有了目标,而后就能先把损失函数写出来,对几率P(y|X)取对数而且取反,有

L(y,X)=-[y\ln(\hat p)+(1-y)\ln(1-\hat p)]

在这里咱们进行了取对数的操做,这样不改变原函数的单调性,另外对原函数进行了取反(加负号)的操做,这样咱们的目标就从让原函数最大变为了新函数的最小,毕竟“最小”更符合“损失”,因此咱们的损失函数就如上式所示,由两部分的对数组成,这个式子同时也称做交叉熵函数。还有要注意的一点是,损失函数的写法中没有显式写出的参数\omega,这其实是由于\omega是存在于几率p中的,这里的几率p实际上就是sigmoid函数的预测几率输出。

这里的损失函数形式是针对单个样本的,对总体样本前面加上求和符号便可

此时有了损失函数,咱们就能够求使得损失函数最小的那个参数\omega。那么在此咱们先暂停一下,其实损失函数还有另一种推导方式。

刚才咱们是从几率的角度,从二分类问题的几率分布(实际上就是伯努利分布)不断的推导,而后找到了优化目标,也就定义了损失函数。如今咱们从另外的角度,最大似然的角度来推导一遍损失函数。

这里的这个推导结果可能并非常见的逻辑回归的损失函数的形式,但我以为理解了多少有帮助,万一面试官就问了呢

**最大似然推导

此次咱们从数据的角度分析,假设已有的数据是:

D=(x_1,1),(x_2,1),(x_3,1),……,(x_n,-1)

这里每一个括号的第一项x_i表明了特征数据向量,第二项表明了对应的标签,注意这里的正样本仍然是1,可是负样本咱们此处定义为了-1

负样本的标签再也不是0,这一点很重要

这些数据的产生是相互独立的,因此得到D这笔数据的几率就是

P(x_1,1)\ast P(x_2,1)\ast P(x_31,1)\ast …… \ast P(x_n,-1)

改写为条件几率的形式

P(x_1)P(1|x_1)\ast P(x_2)P(1|x_2)\ast P(x_3)P(1|x_3)\ast …… \ast P(x_n)P(-1|x_n)

这里面的P(y_i|x_i)能够理解为是模型在输入特征数据x_i以后获得其属于y_i的几率,而P(x_i)可能没法找到一个实际的物理含义的释义,由于咱们这里是经过数学的方法直接拆分的,可是咱们继续推下去能够发现这个P(x_i)其实并不影响咱们的推导。咱们这里假设每笔数据的几率分布为

P(y_i|x_i)=
\begin{cases}
f(x_i)& {y=+1}\\
1-f(x_i)& {y=-1}
\end{cases}

改写咱们上面的条件几率

P(x_1)f(x_1)\ast P(x_2)f(x_2)\ast P(x_3)f(x_3)\ast …… \ast P(x_n)(1-f(x_n))

此时咱们就能够理解为咱们获得的数据的几率是上面这个表达式,那么应用最大似然的思想,我既然获得了这笔数据,就必定程度上说明这笔数据可能就是这样的;真实的“特征数据”与其对应的“标签”之间的关系就是这样的;在真实的数据中,我获得这样的一个数据D的几率就是最大的。那么咱们如今就是要求这样的一个f(x),去使得上面这个几率结果最大。而在这个几率中,P(x_i)是与标签无关的,也就意味着咱们使得这个几率结果最大主要要求的仍是f(x),因为连乘的关系,咱们只需将f(x)的乘积最大即达到了总体的最大,也就是说使得

f(x_1)\ast f(x_2)\ast f(x_3)\ast …… \ast (1-f(x_n))

最大。这时咱们能够带入咱们的模型,也就是

h(x)=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{-X\omega}}

获得

h(x_1)\ast h(x_2)\ast h(x_3)\ast …… \ast (1-h(x_n))

结合sigmoid函数性质,有

h(x_1)\ast h(x_2)\ast h(x_3)\ast …… \ast h(-x_n)

则优化目标为

\min_{\omega} -\prod_{i=1}^n h(y_ix_i)

这里把y_i放进sigmoid函数中,正好能够表达出全部的状况,要注意这里的y的正负类的标志是+1-1。对上式取对数,得

\min_{ \omega} - \sum_{i=1}^{n} \ln h(y_ix_i)

这样咱们就化连乘为相加,经过展开h(x)的表达式便可获得咱们的损失函数,即

L(y,\boldsymbol{X}) = \sum_{i=1}^{n} \ln (1+e^{-y_i\boldsymbol{X} \omega})

这样咱们就推导出来了逻辑回归的另外一个损失函数的表达形式,能够看出两个表达式并不同,那么它们都是逻辑回归的损失函数吗?他们其实是一个等式仍是说他们确实是两种损失函数?

这里其实我也不知道,感受论文原文中应该有描述,可是还没来的看论文,先按照本身的推导猜一猜吧,若是有大神看到了知道他们之间关系的不妨给我也点拨一下…

把两种形式的损失函数通通罗列于此,分别都取一个样本的状况下,有

L_1(y,X)=-[y_1\ln(\hat p)+(1-y_1)\ln(1-\hat p)] \tag{1}
L_2(y,X) = \ln (1+e^{-y_2X \omega})=-\ln (\theta(y_2X\omega)) \tag{2}

\hat p展开,则有\hat p=\frac{1}{1+e^{-X\omega}}=\theta(X\omega), 对\omega求导,有

\frac{\partial L_1}{\partial \omega}=(\hat p-y_1)X =(\theta(X\omega)-y_1)X
\frac{\partial L_2}{\partial \omega}=(\theta(y_2Xw)-1)y_2X

这里能看出二者的求导结果好像并不一致,这其实和两种状况下的标签y的取值不一样有关,第一种的标签取值为\{1,0\},而第二种的标签取值为\{+1,-1\},咱们发现,当标签为正,即在两种状况下都取y=1时,二者的求导结果是同样的,那么咱们关注一下标签为负的时候,此时y_1=0,对L_1的导数有

\frac{\partial L_1}{\partial \omega}=(\theta(X\omega)-y_1)X=\theta(X\omega)X

对于L_2,其标签取y_2=-1,有

\frac{\partial L_2}{\partial \omega}=-(\theta(-Xw)-1)X=(1-\theta(-Xw))X= \theta(X\omega)X

以上的设计公式推导的部分会常常的使用到sigmoid函数的两个性质,这两个性质在上文中已经说起

至此咱们发现两种形式的损失函数的导数(梯度)是一致的,因此我认为这两种形式的损失函数是同一实质的两种形式,这个结论的得出并不严谨,由于导数相同并不表明原函数相同,可是我也没看论文,因此就这么猜想了,另外,常见的梯度降低法计算时不就是要梯度么,他们梯度同样应该就是一个东西XD

***损失函数的小总结

在继续以前,先小总结一下逻辑回归的损失函数,以一个样本为例,咱们依次获得了

由于两种形式的损失函数是同样的,这里就以第一种为例

\hat{z}=X\cdot\omega \tag*{线性回归部分}
\hat p = h(X)=\theta(X\omega) \tag*{经过sigmoid函数输出几率}
P(y|X)=\hat p^y \ast (1-\hat p)^{(1-y)}  \tag*{针对不一样类别样本的预测几率}
L(y,X)=-[y\ln(\hat p)+(1-y)\ln(1-\hat p)] \tag*{损失函数}

至此咱们就从头至尾推导了一遍逻辑回归,哦不,还没到尾,咱们到这里只是推导到了损失函数,而知道了损失函数咱们还须要求解,找到可以使损失函数达到最小的取值,这样才算完成了所有的逻辑回归。

**优化求解

咱们想到求最小值,默认的想法都是求一阶导数,而后令其等于零从而求解,那么这个方法在这里是否适用呢?咱们发现参数\omega是包含在sigmoid函数中的e的指数项的,这致使在多维特征的状况下,涉及复杂的矩阵运算,这显然是不方便求解的。所以咱们选择另一种思路,经过随机一个函数上的初始点,而后不断迭代,令其每次迭代时都尽量使损失函数的结果变小,这样在屡次的迭代以后,咱们就能够获得令损失函数最小的那一组参数\omega

这里的关于优化的描述并不严谨,只是表达一个优化迭代的意思

常见的优化算法有不少,梯度降低法,牛顿法等,而且近年来在这些传统优化算法上有着不少的优化改进,这里不详细介绍优化算法(由于工程量太大了),仅简单说起一下梯度降低法的基本思路。

梯度降低法首先对参数\omega随机选取一个初始点,而后计算损失函数在该点的梯度(也就是导数),而后沿着梯度方向前进一个增量,从而获得新的\omega,不断循环这个过程,直到梯度为零(到达极值),或者梯度达到了阈值为止。用公式表示即

\omega=\omega - \alpha \frac{\partial{L(y,X)}}{\partial{\omega}}

这里的\alpha表明学习率,也就是当咱们求出了梯度方向后,以为咱们沿着这个方向走多远的一个参数,这个参数不属于模型自己,须要人工设定。经过这样的思路,咱们就能最终求得逻辑回归中的参数\omega的最优解,从而完成整个模型。
一样的,咱们小小总结一下逻辑回归的这一套流程。①咱们先定了模型的样式(线性的内核套一个sigmoid的外壳),②而后就知道了咱们须要求出的参数是什么(\omega),③接下来咱们分别用两种思路找到了可以评估模型的损失函数(交叉熵),④结合相关的优化算法,找到最优的参数\omega,从而完成了整个模型。

在咱们完成了模型以后,咱们想起来还有一个MSE被咱们遗忘了,那么咱们为何在损失函数阶段不直接选择MSE呢?首先咱们从结尾处看,若是咱们选择MSE做为损失函数,那么对单个样本有

L=\frac{1}{2}(y-\hat p)^2

则梯度为

\frac{\partial{L}}{\partial{\omega}}=- |(y-\hat p)| h'(x)X

而交叉熵的梯度为

\frac{\partial L}{\partial \omega}=(\hat p-y)X

对比之下发现MSE的梯度相对于交叉熵的梯度多乘了一个系数h'(x),而这个系数就是sigmoid函数的导数,咱们不妨画出sigmoid的导数图像,有

能够看到sigmoid的导数的最大值只有0.25,而在输入值较大或较小时都趋近于0。可是咱们的优化目标就是在样本为正时输出趋近于+1,那么就要输入足够大,所以若是使用MSE做为损失函数的话,当接近优化目标时极可能出现梯度消失,没法继续逼近损失函数最小值。

此外,使用MSE做为损失函数会致使引入模型sigmoid后非凸,此时会有不少局部最优,影响优化算法寻找全局最优势。

*总结

至此算是把逻辑回归从头至尾过了一遍,用关键要点简单总结一下吧。

线性回归

  • 线性回归旨在用线性模型拟合数据点,能够用做回归问题中
  • 使用线性方程做为模型
  • 使用MSE做为损失函数
  • 将模型带入损失函数求解获得参数表达式

逻辑回归

  • 逻辑回归旨在训练一个分类模型,用于分类问题
  • 使用sigmoid做为外层。线性模型做为内层的模型
  • 使用交叉熵做为损失函数
  • 将模型带入损失函数后使用优化算法获得参数表达式
  • 交叉熵存在两种表达形式,但其实是统一的,差异在于标签的设定值
  • 损失函数不使用MSE的缘由有两点:①梯度消失,②局部最优



嗯,写到这里发现这个逻辑回归其实还挺有逻辑的XD

各位看官有什么问题或者发现我哪里写错了都欢迎讨论指出啊,毕竟我也是个菜鸡,不免有错的地方,能够多多讨论加深理解

参考博客

www.jianshu.com/p/b07f4cd32…
blog.csdn.net/weixin_4153…
www.cnblogs.com/shayue/p/10… 这个写的真的很好
www.cnblogs.com/shayue/p/10…
blog.csdn.net/weiweixiao3…
www.cnblogs.com/maybe2030/p…
blog.csdn.net/mzpmzk/arti…
blog.csdn.net/dpengwang/a…
blog.csdn.net/huwenxing08…
yq.aliyun.com/articles/66…
blog.csdn.net/alw_123/art…

*END

相关文章
相关标签/搜索