逻辑回归和线性回归模型的联系
一看到回归这个名字,第一反应肯定认为这是个回归算法,但事实是它确实是个分类算法。有人表示怀疑,明明它的输出是连续值,怎么就是分类了?其实在分类问题中,预测属于某类的概率,可以看成回归问题,也就是说“可以使用回归方法来做分类”。继续往下看。
首先考虑一个问题,普通的线性回归可以用来做分类吗?答案其实是可以的,但这样做不好!不好在哪里?我们来看一个例子(盗图自Ng课件):对于分类问题, x x x对应的 y y y值只可能是0或1,我们可以轻松地训练出一个线性归回模型,如下图所示,然后选0.5作为阈值,也可以达到分类的目的。


逻辑回归是如何做分类的
如上文所说,回归模型做分类看起来困难重重,有没有什么办法克服一下?我不确定发明这个算法的人是怎么一步步思考的,我现在只能从我的角度揣测一下。前文说用线性回归不好,究其原因还是线性回归模型“太线性”,试想,对上面那个带异常点的数据,如果我们使用一个曲线来拟合,效果是不是好很多?答案显然是的。这就引导我们一步步思考,广义线性模型相当于一个线性模型和一个函数
g
g
g的复合,表达的函数将不再仅限于直线,可以是任意曲线,那为何干嘛非要死脑筋选个直线当假设函数呢?如果使用广义线性模型,函数
g
g
g又该怎么选呢?既然分类输出就只有0,1,使用单位阶跃函数构看起来最适合,但阶跃函数不连续,所以找了个相近的logistic函数(sigmoid函数)代替,而且sigmoid函数还可以将输出转化为0-1,可以看成概率,变成概率后就有一堆工具等着我们用,真是非常合适不过了。sigmoid函数的表达式如下:
g
(
x
)
=
1
(
1
+
e
−
z
)
g(x) = \frac{1}{(1+e^{-z})}
g(x)=(1+e−z)1
按照广义线性模型来看,逻辑回归的假设函数,其实就是普通线性回归的假设函数与sigmoid函数的复合,可以看成是将线性函数的输出再次送入sigmoid函数。这样就得到了逻辑回归的假设函数,如下所示:
h
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
θ
T
x
h(x)= g(\theta ^Tx) = \frac{1}{1+e^{\theta^{T}x}}
h(x)=g(θTx)=1+eθTx1
在总结怎么训练优化之前,我们再从原理上分析一遍逻辑回归相比于线性回归是怎么更好地完成分类任务的。logistic函数的图像如下图所示(盗图自西瓜书),我们可以发现,只要保证线性部分的输出大于0,sigmoid的输出就能大于0.5,即被分为正例类;反之,线性部分小于0时,sigmoid的输出就小于0.5,即被分为负例类。

这样一来,其实问题就落到了线性函数那部分了,也就是 θ T x \theta^{T}x θTx。假设 x x x是二维的,举个例子,如下图所示(盗图自Ng课件),为两类样本, θ T x \theta^{T}x θTx为中间那条直线,我们会发现,当 θ \theta θ选取足够合适时,将任意一个正例样本代入直线方程左边,都将得到一个大于零的结果;反之,将负例样本代入,将得到小于零的结果。这条直线就叫做决策边界!所以,其实逻辑回归的训练或者说优化,其实都是在学习 θ \theta θ,或者说决策边界,使之满足上述条件罢了!

手撕逻辑归回的优化
这可是面试的高频题,背也得背下来,哎,记性不好的人心里苦啊!逻辑回归一般使用的是梯度下降法来优化,那首先要做的就是构建损失函数,常见的有两种构建方法,最终得到的形式都是一样的!一种是通过极大似然估计的方式构建似然函数作为损失函数,另一种是使用交叉熵函数直接构建。
通过极大似然估计构建损失函数
好,我们已知
h
(
x
)
h(x)
h(x)表达的是
x
x
x属于正例(label为1)的概率,故可以写成概率形式:
p
(
y
=
1
∣
θ
;
x
)
=
h
(
x
;
θ
)
p(y=1|\theta;x)=h(x;\theta)
p(y=1∣θ;x)=h(x;θ)
那自然,
x
x
x属于负例(label为0)的概率就是:
p
(
y
=
0
∣
θ
;
x
)
=
1
−
h
(
x
;
θ
)
p(y=0|\theta;x)=1-h(x;\theta)
p(y=0∣θ;x)=1−h(x;θ)
为了方便起见,我们可以将上述条件概率函数合二为一,即:
p
(
y
∣
θ
;
x
)
=
[
h
(
x
;
θ
)
]
y
[
1
−
h
(
x
;
θ
)
]
1
−
y
p(y|\theta;x)=[h(x;\theta)]^y[1-h(x;\theta)]^{1-y}
p(y∣θ;x)=[h(x;θ)]y[1−h(x;θ)]1−y
到这里,我们的概率函数就构建好了,但是参数
θ
\theta
θ还未知,可以使用极大似然估计来做参数估计,理解之后就是套路了。首先,计算所有样本同时发生的概率(假设独立同分布):
L
(
θ
)
=
∏
i
=
1
i
=
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}^{i=m}p(y^i|\theta,x^i) = \prod_{i=1}^m[h(x^i;\theta)]^{y^i}[1-h(x^i;\theta)]^{1-y^i}
L(θ)=i=1∏i=mp(yi∣θ,xi)=i=1∏m[h(xi;θ)]yi[1−h(xi;θ)]1−yi
然后对两边取对数,便得到似然函数
l
(
θ
)
l(\theta)
l(θ):
l
(
θ
)
=
l
n
(
L
(
θ
)
)
=
∑
i
=
1
m
y
i
l
n
(
h
(
x
i
;
θ
)
)
+
(
1
−
y
i
)
l
n
(
1
−
h
(
x
i
;
θ
)
)
l(\theta) = ln(L(\theta)) = \sum_{i=1}^m y^iln(h(x^i;\theta)) + (1-y^i)ln(1-h(x^i;\theta))
l(θ)=ln(L(θ))=i=1∑myiln(h(xi;θ))+(1−yi)ln(1−h(xi;θ))
一般损失函数都是需要minimize来优化,而我们这里是个maximize的形式,所以取倒数再除以
m
m
m就可以得到我们的损失函数啦,即:
J
(
θ
)
=
−
1
m
l
(
θ
)
=
−
1
m
∑
i
=
1
m
y
i
l
n
(
h
(
x
i
;
θ
)
)
+
(
1
−
y
i
)
l
n
(
1
−
h
(
x
i
;
θ
)
)
J(\theta) = - \frac{1}{m} l(\theta) = - \frac{1}{m} \sum_{i=1}^m y^iln(h(x^i;\theta)) + (1-y^i)ln(1-h(x^i;\theta))
J(θ)=−m1l(θ)=−m1i=1∑myiln(h(xi;θ))+(1−yi)ln(1−h(xi;θ))
直接构建交叉熵损失函数
上面是通过极大似然估计的方式构建的损失函数,你仔细看看,是不是和交叉熵损失函数特别像?没错,正是!我们也可以按照平时在深度学习中惯用伎俩,无脑交叉熵。模型的输出是
h
(
x
i
;
θ
)
h(x^i;\theta)
h(xi;θ),其实可以理解成输出一个二维向量
(
h
(
x
i
;
θ
)
,
1
−
h
(
x
i
;
θ
)
)
(h(x^i;\theta), 1-h(x^i;\theta))
(h(xi;θ),1−h(xi;θ)),而groundtruth就是
(
y
i
,
1
−
y
i
)
(y^i, 1-y^i)
(yi,1−yi),所以交叉熵损失函数就是:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
y
i
l
n
(
h
(
x
i
;
θ
)
)
+
(
1
−
y
i
)
(
1
−
l
n
(
x
i
;
θ
)
)
J(\theta) = - \frac{1}{m} \sum_{i=1}^m y^i ln(h(x^i;\theta)) + (1-y^i)(1-ln(x^i;\theta))
J(θ)=−m1i=1∑myiln(h(xi;θ))+(1−yi)(1−ln(xi;θ))
和用极大似然得到的一样,所以极大似然函数法构建的损失函数其实就是我们常说的交叉熵损失函数。
使用梯度下降法优化
最后一步,对损失函数求梯度,这个地方只要细心就好,感受一下,已经没耐心继续敲公式了,手写一下吧,鉴于字太丑,同时也是方便自己看,所以大家可以参考别的博客。

进一步讨论
后续根据面经慢慢补充。
结束语
哎,炼丹练多了,忽略了机器学习本身的很多东西,太菜了,只能从逻辑回归一步步来了,现在还在第0重境界艰难前行!希望大家多多指正文中的错误,以免面试时候丢人…感激不尽!
