杠精的机器学习(二):逻辑斯谛回归

  1. 主要参考资料为《小象学院-机器学习IV》
    打个广告,这套视频真的非常赞,建议大家看三遍以上,每一遍都有新的收获,BiliBili上有免费资源,感谢邹博!!!
  2. 李航的统计学习方法
  3. 台湾大学李宏毅老师的机器学习视频(BiliBili有免费资源)

1.线性回归能否做分类

  这次的内容要从线性回归如何解决分类问题说起,在上一篇关于线性回归博客中,只介绍了回归问题,但是在现实任务中,有大量的问题并不是回归问题,而是分类问题。那么普通的线性回归能不能解决分类问题?如果能,该怎么解决,如果不能,为什么不能?
  我的回答是:能又不能。首先,解释一下为什么能?假设当前有一个问题二分类任务,数据点 ( x 1 , x 2 , y ) (x_1,x_2,y) (x1,x2,y)分布情况如图(a),“X”表示正样本,标签 y = + 1 y=+1 y=+1,“O”表示负样本。 y = − 1 y=-1 y=1。如果线性回归去解决,做法也很简单,把这个分类问题直接看成回归问题, y y y就是拟合目标, ( x 1 , x 2 ) (x_1,x_2) (x1,x2)是特征,由于线性回归的目标是让平方损失最小,针对(a)这样的样本分布,最优解的结果肯定是得到一条位于在“X”与“O”中间的一条直线,直线记为 x 2 − k x 1 − b = 0 ( k , b > 0 ) x_2-kx_1-b=0(k,b>0) x2kx1b=0(k,b>0)。这样的话,最终的分类模型就是:
{ x 2 − k x 1 − b &gt; 0 ( x 1 , x 2 ) &MediumSpace;&MediumSpace;&MediumSpace; 属 于 正 样 本 x 2 − k x 1 − b &lt; 0 ( x 1 , x 2 ) &MediumSpace;&MediumSpace;&MediumSpace; 属 于 负 样 本 \left\{\begin{matrix} x_2-kx_1-b&gt;0(x_1,x_2)\:\:\:属于正样本\\ x_2-kx_1-b&lt;0(x_1,x_2)\:\:\:属于负样本 \end{matrix}\right. {x2kx1b>0(x1,x2)x2kx1b<0(x1,x2)

2.一个失败的损失函数

  通过图(a),说明线性回归做分类也是可以的。但这里面越有一个比较有趣的矛盾。我们用图(a)作为继续说明,点到直线的距离在初中的时候都已经学过了,计算公式为:
d = ∣ a x + b y + c ∣ a 2 + b 2 d=\frac{|ax+by+c|}{\sqrt{a^2+b^2}} d=a2+b2 ax+by+c

由于 a 2 + b 2 \sqrt{a^2+b^2} a2+b2 是一个定值,为了方便起见,我们忽略它,直接用 ∣ a x + b y + c ∣ |ax+by+c| ax+by+c表示距离。假如有一个正样本 ( x i , y i ) (x^i,y^i) (xi,yi),它离直线 x 2 − k x 1 − b = 0 ( k , b &gt; 0 ) x_2-kx_1-b=0(k,b&gt;0) x2kx1b=0(k,b>0)的距离非常远,即| x 2 i − k x 1 i − b x^i_2-kx^i_1-b x2ikx1ib|非常大,这对于分类来说,是一件好事,因为离得越远说明该样本点属于某一类的置信度越高,从而越接近于标签,损失也就会越小。但这件事情对于线性回归来说却恰恰相反,由于图(a)中直线的损失函数为 ∑ i = 1 m ( y i − ( x 2 i − k x 1 i − b ) ) 2 \sum_{i=1}^{m}(y^i-(x^i_2-kx^i_1-b))^2 i=1m(yi(x2ikx1ib))2,它希望寻找一条直线,能让所有的点都能紧密的团结在该直线周围,这样的话,整体的损失才会小。当一个样本点距离直线很远的时候,| x 2 i − k x 1 i − b x^i_2-kx^i_1-b x2ikx1ib|的值是非常大的,损失就会很大,在训练的过程中,线性回归会调整参数让直线努力靠近那行偏远点以求得更小损失,这样的做法对于分类任务来说,无疑是南辕北辙。图(a)中的例子,看上去效果还不错,这纯粹是瞎猫碰上死耗子。这个例子成功的原因仅仅在于正负样本分布是均匀的,数量差不多,也没有什么极端值出现,因此,损失最小的时候,恰恰是直线在正负样本中间的时候,但损失最小,并不等于损失小,如果把(a)中训练完成后的损失输出出来,其值依然是比较大的。所以,当正负样本呈图(b)分布时,线性回归就得不到好的结果了,直线也靠向了较远点。

  总的来说,线性回归不能很自然的运用于分类任务,主要原因为线性回归的损失函数直接把 y y y θ ⃗ ⋅ x \vec\theta\cdot x θ x做了计算,但是这两者的量纲是不一致的,一个表示距离( − ∞ , + ∞ -\infty,+\infty ,+),一个表示类别标签(非0即1)。既然发现了问题所在,自然就能找到解决办法,如果能把样本点离直线的距离转化为该样本属于某个类别的概率,距离越远,概率越大,那这个问题不就解决了吗?感谢伟大的数学先驱们,已经为我们找到了很多这样的函数。比如 t a n h ( ⋅ ) tanh(\cdot) tanh(), s i g m o i d ( ⋅ ) sigmoid(\cdot) sigmoid()。在逻辑回归中,主要用到了 s i g m o i d ( ⋅ ) sigmoid(\cdot) sigmoid()。Sigmoid的英文意思就是“S”形,记Sigmoid函数为 h ( z ) h(z) h(z),数学公式和图像如下:
h ( z ) = 1 1 + e x p ( − z ) h(z)=\frac{1}{1+exp(-z)} h(z)=1+exp(z)1

只要另 θ ⃗ ⋅ x = z \vec\theta\cdot x=z θ x=z,就可以把点偏离直线的程度非线性的转化概率。另外Sigmoid函数的导数也十分的简洁:
h ′ ( z ) = h ( z ) ∗ ( 1 − h ( z ) ) h{}&#x27;(z)=h(z)*(1-h(z)) h(z)=h(z)(1h(z))

既然找到了问题所在,有找到了解决问题的方法,那剩下的就是去解决问题了。说干就干!原本的线性回归的损失函数为:
J ( θ ) = min ⁡ θ 1 2 ∑ i = 1 m ( θ ⃗ ⋅ x i − y i ) 2 J(\theta)=\min_{\theta}\frac{1}{2}\sum_{i=1}^{m}(\vec{\theta}\cdot x_{ }^{i}-y^{i})^{2} J(θ)=θmin21i=1m(θ xiyi)2

z = θ T ⋅ x i z=\theta^T\cdot x^i z=θTxi带入 h ( z ) h(z) h(z),把样本点偏离直线的程度转化为概率,就得到了用于分类的损失函数:
J ( θ ) ~ = min ⁡ θ 1 2 ∑ i = 1 m ( h ( θ ⃗ ⋅ x i ) − y i ) 2 \widetilde{J(\theta)}=\min_{\theta}\frac{1}{2}\sum_{i=1}^{m}(h(\vec{\theta}\cdot x_{ }^{i})-y^{i})^{2} J(θ) =θmin21i=1m(h(θ xi)yi)2

  我们把这个损失函数称为Sigmoid+Square Loss。从直觉上来说,它是很正确的,因为当所有的样本都分对的时候,它的损失确实是0,如果能把它优化好,能得到很不错的解。但是,如果你对机器学习了解的比较多的话,就会知道在你看过的书籍,视频,代码等等资料中几乎没人拿这玩样做为分类任务的损失函数。这是为什么呢?虽然这个函数一点都不重要,但是了解它为什么不重要却很重要。
  评价一个损失函数的好坏,应该从两方面入手,第一方面,它的损失降为0时,是否满足任务的切实需求。第二方面,它是否容易优化。在刚才,我们已经从第一方面分析了 J ( θ ) ~ \widetilde{J(\theta)} J(θ) ,是符合的。那问题是否出在第二部分呢?
  在机器学习中,最常用的优化手段就是梯度下降,要用到梯度下降,就需要求微分。我们先求一下 J ( θ ) ~ \widetilde{J(\theta)} J(θ) θ k \theta_k θk的微分, ∂ J ( θ ⃗ ) ~ ∂ θ k \frac{\partial \widetilde{J(\vec\theta)}}{\partial \theta_k} θkJ(θ )
∂ J ( θ ⃗ ) ~ ∂ θ k = ( h ( θ ⃗ ⋅ x i ) − y i ) ∗ ∂ h ( z ) ∂ z ∗ ∂ z ∂ θ i = ( h ( θ ⃗ ⋅ x i ) − y i ) ∗ h ( θ ⃗ ⋅ x i ) ∗ ( 1 − h ( θ ⃗ ⋅ x i ) ) ∗ x k i \frac{\partial \widetilde{J(\vec\theta)}}{\partial \theta_k}= (h(\vec{\theta}\cdot x_{ }^{i})-y^{i})* \frac{\partial h(z)}{\partial z}*\frac{\partial z}{\partial \theta_i} \newline=(h(\vec{\theta}\cdot x_{ }^{i})-y^{i})*h(\vec{\theta}\cdot x_{ }^{i})*(1-h(\vec{\theta}\cdot x_{ }^{i}))*x^i_k θkJ(θ ) =(h(θ xi)yi)zh(z)θiz=(h(θ xi)yi)h(θ xi)(1h(θ xi))xki

  对于一个正样本, y = 1 y=1 y=1,当 h ( θ ⃗ ⋅ x ) ≈ 1 h(\vec{\theta}\cdot x)\approx 1 h(θ x)1时,预测结果很接近标签,此时 ∂ J ( θ ⃗ ) ~ ∂ θ k ≈ 0 \frac{\partial \widetilde{J(\vec\theta)}}{\partial \theta_k}\approx0 θkJ(θ ) 0,不需要做什么调整。当 h ( θ ⃗ ⋅ x ) ≈ 0 h(\vec{\theta}\cdot x)\approx 0 h(θ x)0时,预测结果与标签严重不符,需要对模型参数做较大的调整,但是 ∂ J ( θ ⃗ ) ~ ∂ θ k ≈ 0 \frac{\partial \widetilde{J(\vec\theta)}}{\partial \theta_k}\approx0 θkJ(θ ) 0,微分等于0,根本无法对参数做调整。
  对于一个负样本, y = 0 y=0 y=0,当 h ( θ ⃗ ⋅ x ) ≈ 0 h(\vec{\theta}\cdot x)\approx 0 h(θ x)0时,预测结果很接近标签,不需要做什么调整。当 h ( θ ⃗ ⋅ x ) ≈ 1 h(\vec{\theta}\cdot x)\approx 1 h(θ x)1时,预测结果与标签严重不符,需要对模型参数做较大的调整,但是 ∂ J ( θ ⃗ ) ~ ∂ θ k ≈ 0 \frac{\partial \widetilde{J(\vec\theta)}}{\partial \theta_k}\approx0 θkJ(θ ) 0,微分等于0,根本无法对参数做调整。通过上述两个例子分析,可以得知Sigmoid+Square Loss在模型分类误差非常大时,微分却很小,无法调整模型参数。模型参数一般都是随机初始化的,所以在训练初始,误差都会比较大,但如果使用Sigmoid+Square Loss,训练速度会异常缓慢,这就是Sigmoid+Square Loss没人用的原因。
  为了更加直观的说明,我截取了台大李宏毅机器学习课件上的图片。下图中,黑色的是交叉熵损失(CrossEntropy Loss,我在下文中会讲),是逻辑斯谛回归的函数,而红色的就是我刚刚讲过的Sigmoid+Square Loss,你从图中可以发现,它在损失最大的地方却十分平坦,对梯度下降是非常不利的。

3.用MLE推导损失函数

  在上文中,我们通过微分的角度解释 了为什么Sigmoid+Square Loss不适合作为损失函数,从统计学的角度,也能解释为什么Sigmoid+Square Loss不合适。在线性回归部分,我们假设误差服从高斯分布,从而推导出了线性回归的损失函数,误差服从高斯分布等价于样本服从高斯分布(因为直线上的点是服从均匀分布的,样本数据==直线上的点+误差,所以误差服从高斯分布等价于样本数据服从高斯分布)。如果我们使用Sigmoid+Square Loss作为损失函数,就默认了样本服从高斯分布,但高斯分布明显是不符合分类场景的。在二分类任务中,样本非0即1,属于二项分布(如果是多分类任务,样本属于多项分布)。在刚才设计Sigmoid+Square Loss时,我们仅仅考虑了要把 θ ⃗ ⋅ x \vec\theta\cdot x θ x转化为概率 h ( θ ⃗ ⋅ x ) h(\vec\theta\cdot x) h(θ x),没有考虑样本的分布,因此,我们认为样本服从二项分布,并假定样本属于1的概率为 h ( θ ⃗ ⋅ x ) h(\vec\theta\cdot x) h(θ x),属于0的概率为 1 − h ( θ ⃗ ⋅ x ) 1-h(\vec\theta\cdot x) 1h(θ x),重新推导损失函数。

P ( y = 1 ) P(y=1) P(y=1) P ( y = 0 ) P(y=0) P(y=0)
概率值 h ( θ ⃗ ⋅ x ) h(\vec\theta\cdot x) h(θ x) 1 − h ( θ ⃗ ⋅ x ) 1-h(\vec\theta\cdot x) 1h(θ x)

根据表格,样本 ( x , y ) (x,y) (x,y)概率分布函数可以写为:
P ( y ∣ x ; θ ) = h ( θ ⃗ ⋅ x ) y ∗ ( 1 − h ( θ ⃗ ⋅ x ) ) 1 − y P(y|x;\theta)=h(\vec\theta\cdot x)^y*(1-h(\vec\theta\cdot x))^{1-y} P(yx;θ)=h(θ x)y(1h(θ x))1y

接下来的问题就是如何估计 θ \theta θ。在机器学习中,只要碰到给你很多数据点,再假设一个分布,那么,估计 θ \theta θ的方法,八九不离十就是MLE(极大似然估计)。似然函数为:
L ( θ ) = ∏ i = 1 m P ( y i ∣ x i ; θ ) = ∏ i = 1 m h ( θ ⃗ ⋅ x i ) y i ∗ ( 1 − h ( θ ⃗ ⋅ x i ) ) 1 − y i L(\theta)=\prod_{i=1}^{m}P(y^i|x^i;\theta)=\prod_{i=1}^{m}h(\vec\theta\cdot x^i)^{y^i}*(1-h(\vec\theta\cdot x^i))^{1-y^i} L(θ)=i=1mP(yixi;θ)=i=1mh(θ xi)yi(1h(θ xi))1yi

取对数似然之后,得到:
l ( θ ) = ∑ i = 1 m l o g ( P ( y i ∣ x i ; θ ) ) ⇒ ∑ i = 1 m l o g ( h ( θ ⃗ ⋅ x i ) y i ) + l o g ( ( 1 − h ( θ ⃗ ⋅ x i ) ) 1 − y i ) ⇒ ∑ i = 1 m y i l o g ( h θ ( x i ) ) + ( 1 − y i ) l o g ( ( 1 − h θ ( x i ) ) ) l(\theta)=\sum_{i=1}^{m}log(P(y^i|x^i;\theta))\newline\Rightarrow \sum_{i=1}^{m}log(h(\vec\theta\cdot x^i)^{y^i})+log((1-h(\vec\theta\cdot x^i))^{1-y^i})\newline\Rightarrow \sum_{i=1}^{m}{y^i}log(h_\theta(x^i))+(1-y^i)log((1-h_\theta(x^i))) l(θ)=i=1mlog(P(yixi;θ))i=1mlog(h(θ xi)yi)+log((1h(θ xi))1yi)i=1myilog(hθ(xi))+(1yi)log((1hθ(xi)))

因 为 m a x θ ( l ( θ ) ) ⇔ m i n θ − ( l ( θ ) ) 因为\underset{\theta}{max}(l(\theta))\Leftrightarrow \underset{\theta}{min}-(l(\theta)) θmax(l(θ))θmin(l(θ)),所以最终的损失函数为:

∑ i = 1 m − y i l o g ( h ( θ ⃗ ⋅ x i ) ) − ( 1 − y i ) l o g ( ( 1 − h ( θ ⃗ ⋅ x i ) ) ) \sum_{i=1}^{m}-{y^i}log(h(\vec\theta\cdot x^i))-(1-y^i)log((1-h(\vec\theta\cdot x^i))) i=1myilog(h(θ xi))(1yi)log((1h(θ xi)))

损失函数比较复杂,不容易直接求解,可以使用梯度下降法得到, θ j \theta_j θj更新式为:
θ j ′ = θ j − λ ∑ i = 1 m − ( y i − h ( θ ⃗ ⋅ x i ) ) x j i \theta_j{}&#x27;=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-h(\vec\theta\cdot x^i))x_j^i θj=θjλi=1m(yih(θ xi))xji

4.用交叉熵推导损失函数

逻辑回归的损失函数也可以由交叉熵得到,因此,也被称为交叉熵损失。
交叉熵(CrossEntropy)的定义:

交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。----摘自百度百科

交叉熵的数学公式:
H ( p , q ) = − ∑ i p ( i ) l o g q ( i ) H(p,q)=-\sum_{i}p(i)logq(i) H(p,q)=ip(i)logq(i)

交叉熵用于度量两个概率的差异性,根据上文中的表格,逻辑回归的输出其实就是二项分布的概率分布律,一个概率已经找到了,那剩下一个概率是什么呢?将标签做One_Hot处理之后,也可以看作是一种分布率,只是这种分布律太绝对了,只有0和1,详见下表。

One_hot编码 P ( y = 1 ) P(y=1) P(y=1) P ( y = 0 ) P(y=0) P(y=0)
y = 1 y=1 y=11010
y = 0 y=0 y=00101

这样,我们就可以用交叉熵度量这两种分布之间的差异,从而构造损失函数,再通过优化参数减小损失让模型输出的分布,去逼近标签的概率分布,最终达到准确分类。
∑ i = 1 m − ∑ j = 1 k y j i ∗ l o g ( y ^ j i ) \sum_{i=1}^{m}-\sum_{j=1}^{k}y_j^i*log(\hat{y}^i_j) i=1mj=1kyjilog(y^ji)

在上式中, m m m表示样本数量, i i i表示第几个样本, j j j表示第几个类, k k k表示类别数,在逻辑回归中,逻辑回归只有两类,因此 k = 2 k=2 k=2 y ^ j i \hat{y}^i_j y^ji表示,模型预测第 i i i个样本属于第 j j j类的概率, y j i y_j^i yji表示第 i i i个样本的标签属于第 j j j类的概率。把上文中,两个表格表示的分布率带入上式,再把 ∑ j = 1 k \sum_{j=1}^{k} j=1k展开,就得到了交叉熵损失。
∑ i = 1 m − y i l o g ( h θ ( x i ) ) − ( 1 − y i ) l o g ( ( 1 − h θ ( x i ) ) ) \sum_{i=1}^{m}-{y^i}log(h_\theta(x^i))-(1-y^i)log((1-h_\theta(x^i))) i=1myilog(hθ(xi))(1yi)log((1hθ(xi)))

5.逻辑回归中的正则化

  逻辑回归当然也会存在过拟合,过拟合的情况如下图,左图代表欠拟合,中图代表刚刚好,右图代表过拟合。想要避免过拟合或者缓解过拟合,办法自然是使用正则项,正则项的使用方式和线下回归一致,在线性回归的博客中, 我已经做了较多的陈述,这里不再重复。

6.线性回归与逻辑回归的异同点

不同点:
1线性回归输出的是连续值,逻辑回归用于分类。
2.参数 θ \theta θ的更新方式不一样,但是非常像。是不是很神奇。原因:线性回归假设样本服从高斯分布(误差服从高斯分布,等价于样本服从高斯分布),逻辑回归假设样本服从二项分布,这两种分布都是指数族分布。直观上也很解释,线性回归是希望 θ ⃗ ⋅ x i \vec\theta\cdot x^i θ xi去接近 y i y^i yi,而逻辑回归是希望概率值 h ( θ ⃗ ⋅ x i ) h(\vec\theta\cdot x^i) h(θ xi)去接近 y i y^i yi

线性回归逻辑回归
更新方式 θ j ′ = θ j − λ ∑ i = 1 m − ( y i − θ ⃗ ⋅ x i ) x j i \theta_j{}&#x27;=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-\vec\theta\cdot x^i)x_j^i θj=θjλi=1m(yiθ xi)xji θ j ′ = θ j − λ ∑ i = 1 m − ( y i − h ( θ ⃗ ⋅ x i ) ) x j i \theta_j{}&#x27;=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-h(\vec\theta\cdot x^i))x_j^i θj=θjλi=1m(yih(θ xi))xji

相同点:
1.逻辑回归也属于线性模型,这个线性我认为有两层含义。第一层含义,逻辑回归里面的 θ ⃗ \vec\theta θ 依然是都是一次,所以整个模型也是线性的。第二层含义,对数几率线性的。几率的定义为 p 1 − p \frac{p}{1-p} 1pp,说白了就是发生于不发的概率比值,抛银币时”1“字朝上与”菊花“朝上的概率比。对数就是 l o g ( p 1 − p ) log(\frac{p}{1-p}) log(1pp)。我们推导出逻辑回归的对数几率是什么:
l o g P ( y = 1 ∣ x ; θ ) P ( y = 0 ∣ x ; θ ) ⇒ 1 / ( 1 + e x p ( − θ T ⋅ x ) ) ( e x p ( − θ T ⋅ x ) ) / ( 1 + e x p ( − θ T ⋅ x ) ) ⇒ θ T x log\frac{P(y=1|x;\theta)}{P(y=0|x;\theta)}\newline\Rightarrow \frac{1/(1+exp(-\theta^T\cdot x))}{(exp(-\theta^T\cdot x))/(1+exp(-\theta^T\cdot x))}\newline\Rightarrow \theta^Tx logP(y=0x;θ)P(y=1x;θ)(exp(θTx))/(1+exp(θTx))1/(1+exp(θTx))θTx

在上文中已经说过, ∣ θ T x ∣ |\theta^Tx| θTx ∣ θ T x ∣ |\theta^Tx| θTx代表点离分类直线的距离。在逻辑回归中,样本的对数几率与样本到分类直线的距离是呈线性关系的。所以,逻辑回归在有些书上也被称为对数几率回归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值