- 主要参考资料为《小象学院-机器学习IV》
打个广告,这套视频真的非常赞,建议大家看三遍以上,每一遍都有新的收获,BiliBili上有免费资源,感谢邹博!!! - 李航的统计学习方法
- 台湾大学李宏毅老师的机器学习视频(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)
x2−kx1−b=0(k,b>0)。这样的话,最终的分类模型就是:
{
x
2
−
k
x
1
−
b
>
0
(
x
1
,
x
2
)
   
属
于
正
样
本
x
2
−
k
x
1
−
b
<
0
(
x
1
,
x
2
)
   
属
于
负
样
本
\left\{\begin{matrix} x_2-kx_1-b>0(x_1,x_2)\:\:\:属于正样本\\ x_2-kx_1-b<0(x_1,x_2)\:\:\:属于负样本 \end{matrix}\right.
{x2−kx1−b>0(x1,x2)属于正样本x2−kx1−b<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 > 0 ) x_2-kx_1-b=0(k,b>0) x2−kx1−b=0(k,b>0)的距离非常远,即| x 2 i − k x 1 i − b x^i_2-kx^i_1-b x2i−kx1i−b|非常大,这对于分类来说,是一件好事,因为离得越远说明该样本点属于某一类的置信度越高,从而越接近于标签,损失也就会越小。但这件事情对于线性回归来说却恰恰相反,由于图(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−(x2i−kx1i−b))2,它希望寻找一条直线,能让所有的点都能紧密的团结在该直线周围,这样的话,整体的损失才会小。当一个样本点距离直线很远的时候,| x 2 i − k x 1 i − b x^i_2-kx^i_1-b x2i−kx1i−b|的值是非常大的,损失就会很大,在训练的过程中,线性回归会调整参数让直线努力靠近那行偏远点以求得更小损失,这样的做法对于分类任务来说,无疑是南辕北辙。图(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{}'(z)=h(z)*(1-h(z))
h′(z)=h(z)∗(1−h(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=1∑m(θ⋅xi−yi)2
将
z
=
θ
T
⋅
x
i
z=\theta^T\cdot x^i
z=θT⋅xi带入
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=1∑m(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}
∂θk∂J(θ)
。
∂
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
∂θk∂J(θ)
=(h(θ⋅xi)−yi)∗∂z∂h(z)∗∂θi∂z=(h(θ⋅xi)−yi)∗h(θ⋅xi)∗(1−h(θ⋅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
∂θk∂J(θ)
≈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
∂θk∂J(θ)
≈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
∂θk∂J(θ)
≈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) 1−h(θ⋅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) 1−h(θ⋅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(y∣x;θ)=h(θ⋅x)y∗(1−h(θ⋅x))1−y
接下来的问题就是如何估计
θ
\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=1∏mP(yi∣xi;θ)=i=1∏mh(θ⋅xi)yi∗(1−h(θ⋅xi))1−yi
取对数似然之后,得到:
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=1∑mlog(P(yi∣xi;θ))⇒i=1∑mlog(h(θ⋅xi)yi)+log((1−h(θ⋅xi))1−yi)⇒i=1∑myilog(hθ(xi))+(1−yi)log((1−hθ(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=1∑m−yilog(h(θ⋅xi))−(1−yi)log((1−h(θ⋅xi)))
损失函数比较复杂,不容易直接求解,可以使用梯度下降法得到,
θ
j
\theta_j
θj更新式为:
θ
j
′
=
θ
j
−
λ
∑
i
=
1
m
−
(
y
i
−
h
(
θ
⃗
⋅
x
i
)
)
x
j
i
\theta_j{}'=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-h(\vec\theta\cdot x^i))x_j^i
θj′=θj−λi=1∑m−(yi−h(θ⋅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)=−i∑p(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=1 | 10 | 1 | 0 |
y = 0 y=0 y=0 | 01 | 0 | 1 |
这样,我们就可以用交叉熵度量这两种分布之间的差异,从而构造损失函数,再通过优化参数减小损失让模型输出的分布,去逼近标签的概率分布,最终达到准确分类。
∑
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=1∑m−j=1∑kyji∗log(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=1∑m−yilog(hθ(xi))−(1−yi)log((1−hθ(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{}'=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-\vec\theta\cdot x^i)x_j^i θj′=θj−λi=1∑m−(yi−θ⋅xi)xji | θ j ′ = θ j − λ ∑ i = 1 m − ( y i − h ( θ ⃗ ⋅ x i ) ) x j i \theta_j{}'=\theta_j-\lambda\sum_{i=1}^{m}-(y^i-h(\vec\theta\cdot x^i))x_j^i θj′=θj−λi=1∑m−(yi−h(θ⋅xi))xji |
相同点:
1.逻辑回归也属于线性模型,这个线性我认为有两层含义。第一层含义,逻辑回归里面的
θ
⃗
\vec\theta
θ依然是都是一次,所以整个模型也是线性的。第二层含义,对数几率线性的。几率的定义为
p
1
−
p
\frac{p}{1-p}
1−pp,说白了就是发生于不发的概率比值,抛银币时”1“字朝上与”菊花“朝上的概率比。对数就是
l
o
g
(
p
1
−
p
)
log(\frac{p}{1-p})
log(1−pp)。我们推导出逻辑回归的对数几率是什么:
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=0∣x;θ)P(y=1∣x;θ)⇒(exp(−θT⋅x))/(1+exp(−θT⋅x))1/(1+exp(−θT⋅x))⇒θTx
在上文中已经说过, ∣ θ T x ∣ |\theta^Tx| ∣θTx∣ ∣ θ T x ∣ |\theta^Tx| ∣θTx∣代表点离分类直线的距离。在逻辑回归中,样本的对数几率与样本到分类直线的距离是呈线性关系的。所以,逻辑回归在有些书上也被称为对数几率回归。