逻辑回归的应用背景
主要解决问题:分类问题—二分类问题
如果需要解决多分类问题—softmax回归
什么是分类?
分类是监督学习的一个核心问题,在监督学习中,当输出变量Y取有限个离散值时,预测问题便成为分类问题。这时,输入变量X可以是离散的,也可以是连续的。监督学习从数据中学习一个分类模型或分类决策函数,称为分类器。分类器对新的输入进行输出的预测,称为分类。
与线性回归的区别:线性回归预测输出的是
(
−
∞
,
+
∞
)
(−∞,+∞)
(−∞,+∞)
而逻辑回归输出的是
{
0
,
1
}
{\{0,1}\}
{0,1},这里面0我们称之为负例,1称之为正例。
如果分类器用的是回归模型,并且已经训练好了一个模型,可以设置一个阈值
如果
h
θ
(
x
)
≥
0.5
ℎ_\theta (x)≥0.5
hθ(x)≥0.5,则预测
y
=
1
y=1
y=1,既y属于正例
如果
h
θ
(
x
)
<
0.5
ℎ_\theta (x)<0.5
hθ(x)<0.5,则预测
y
=
0
y=0
y=0,既y属于负例
但是对于二分类问题来说,线性回归模型的输出值
h
θ
(
x
)
ℎ_\theta (x)
hθ(x)可以大于1也可以小于0,所以我们需要一个函数,将输出转换到0和1之间。这里我们引入一个函数,sigmoid函数
h
θ
(
x
)
=
g
(
θ
T
x
)
ℎ_\theta (x)=g(\theta^Τ x)
hθ(x)=g(θTx)
这里的
g
g
g代表的就是这个函数:
g
(
z
)
=
1
1
+
e
−
z
g(z)=\frac{1}{1+e^{-z}}
g(z)=1+e−z1
图像如下:
这个函数的导数:
g
′
(
z
)
=
g
(
z
)
(
1
−
g
(
z
)
)
g'(z)=g(z)(1-g(z))
g′(z)=g(z)(1−g(z))
为什么要用sigmoid函数
我们可以从熵的角度,来理解一下这个问题。熵原本是信息熵中的概念,用在概率分布上可以表示这个分布中所包含的不确定度,熵越大不确定度越大。所以大家可以想象到,均匀分布熵最大,因为基本新数据是任何值的概率都均等。
而我们现在关心的是,给定某些假设之后,熵最大的分布。也就是说这个分布应该在满足我假设的前提下越均匀越好。比如大家熟知的正态分布,正是假设已知均值和方差后熵最大的分布。
回过来看逻辑回归,这里假设了什么呢?首先,我们在建模预测
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X) ,并认为
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)服从伯努利二项分布,所以我们只需要知道
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X);其次我们需要一个线性模型,所以
P
(
Y
∣
X
)
=
f
(
w
x
)
P(Y|X) = f(wx)
P(Y∣X)=f(wx)。接下来我们就只需要知道
f
f
f是什么就行了。而我们可以通过最大熵原则推出的这个
f
f
f,就是sigmoid函数。其实还有一种解释可以看成伯努利二项分布的指数族形式,也就是sigmoid函数。
逻辑回归
逻辑回归的数学表达模型:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
ℎ_\theta (x)=g(\theta^{T}x)=\frac{1}{1+e^{-\theta^{T}x}}
hθ(x)=g(θTx)=1+e−θTx1
其中
θ
\theta
θ是参数,输出的直观解释:
h
θ
(
x
)
ℎ_\theta (x)
hθ(x)=对于给定的输入
x
x
x,
y
=
1
y=1
y=1时估计的概率
例如:对于肿瘤问题(恶性/良性),输入变量为肿瘤的大小
h
θ
(
x
)
=
0.7
ℎ_\theta (x)=0.7
hθ(x)=0.7,表示的是病人的肿瘤有70%的可能是恶性的。
较正式的说法可以如下表示:
给定输入
x
x
x,参数化的
θ
\theta
θ(参数空间) ,
y
=
1
y=1
y=1时的概率。数学上可以如下表示:
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
ℎ_\theta (x)=P(y=1|x;\theta )
hθ(x)=P(y=1∣x;θ)
损失函数
这里我们选择对数似然损失函数作为逻辑回归的损失函数
损失函数为:
j
(
θ
)
=
−
1
m
∑
i
=
1
m
(
y
(
i
)
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
)
)
)
j(\theta)=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}log(ℎ_\theta (x))+(1-y^{(i)})log(1-ℎ_\theta (x)))
j(θ)=−m1i=1∑m(y(i)log(hθ(x))+(1−y(i))log(1−hθ(x)))
前面的
1
m
\frac{1}{m}
m1可以去掉,化简为:
j
(
θ
)
=
−
∑
i
=
1
m
(
y
(
i
)
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
)
)
)
j(\theta)=-\sum_{i=1}^{m}(y^{(i)}log(ℎ_\theta (x))+(1-y^{(i)})log(1-ℎ_\theta (x)))
j(θ)=−i=1∑m(y(i)log(hθ(x))+(1−y(i))log(1−hθ(x)))
注意中括号中的公式正是对逻辑回归进行最大似然估计中的最大似然函数
P
(
y
=
1
∣
x
;
θ
)
=
h
θ
(
x
)
P(y=1|x;\theta)=ℎ_\theta (x)
P(y=1∣x;θ)=hθ(x)
P
(
y
=
1
∣
x
;
θ
)
=
1
−
h
θ
(
x
)
P(y=1|x;\theta)=1-ℎ_\theta (x)
P(y=1∣x;θ)=1−hθ(x)
将两个合在一起
P
(
y
∣
x
;
θ
)
=
(
h
θ
(
x
)
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
P(y|x;\theta)=(ℎ_\theta (x))^y(1-ℎ_\theta (x))^{1-y}
P(y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
有了这个我们可以求出逻辑回归的最大似然函数
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}(ℎ_\theta (x^{(i)}))^{y^{(i)}}(1-ℎ_\theta (x^{(i)}))^{1-y^{(i)}}
L(θ)=i=1∏mP(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
对数似然函数为:
l
(
θ
)
=
l
o
g
L
(
θ
)
=
∑
i
=
1
m
(
y
(
i
)
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
)
)
)
l(\theta)=logL(\theta)=\sum_{i=1}^{m}(y^{(i)}log(ℎ_\theta (x))+(1-y^{(i)})log(1-ℎ_\theta (x)))
l(θ)=logL(θ)=i=1∑m(y(i)log(hθ(x))+(1−y(i))log(1−hθ(x)))
对数似然取最大值等价于损失函数取最小值
梯度下降法
算法流程:
(1)、初始化
θ
θ
θ(随机初始化)
(2)、进行迭代,新的
θ
θ
θ能够使得
j
(
θ
)
j(θ)
j(θ)更小
(3)、如果
j
(
θ
)
j(θ)
j(θ)能够继续减小,返回(2)
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
j
(
θ
)
\theta_{j}:=\theta_{j}-\alpha \frac{\partial}{\partial\theta_{j}}j(θ)
θj:=θj−α∂θj∂j(θ)
其中,
α
\alpha
α称为学习率或步长
这其中最主要的就是求解
j
(
θ
)
j(θ)
j(θ)的梯度,即梯度方向
∂
∂
θ
j
j
(
θ
)
=
−
(
y
1
g
(
θ
T
x
)
−
(
1
−
y
)
1
1
−
g
(
θ
T
x
)
)
∂
∂
θ
j
g
(
θ
T
x
)
\frac{\partial}{\partial\theta_{j}}j(θ)=-(y\frac{1}{g(\theta^{T}x)}-(1-y)\frac{1}{1-g(\theta^{T}x)})\frac{\partial}{\partial\theta_{j}}g(\theta^{T}x)
∂θj∂j(θ)=−(yg(θTx)1−(1−y)1−g(θTx)1)∂θj∂g(θTx)
=
−
(
y
1
g
(
θ
T
x
)
−
(
1
−
y
)
1
1
−
g
(
θ
T
x
)
)
g
(
θ
T
x
)
(
1
−
g
(
θ
T
x
)
)
∂
∂
θ
j
(
θ
T
x
)
=-(y\frac{1}{g(\theta^{T}x)}-(1-y)\frac{1}{1-g(\theta^{T}x)})g(\theta^{T}x)(1-g(\theta^{T}x))\frac{\partial}{\partial\theta_{j}}(\theta^{T}x)
=−(yg(θTx)1−(1−y)1−g(θTx)1)g(θTx)(1−g(θTx))∂θj∂(θTx)
=
−
(
y
(
1
−
g
(
θ
T
x
)
)
−
(
1
−
y
)
g
(
θ
T
x
)
)
x
j
=-(y(1-g(\theta^{T}x))-(1-y)g(\theta^{T}x))x_{j}
=−(y(1−g(θTx))−(1−y)g(θTx))xj
=
−
(
y
−
h
θ
(
x
)
)
x
j
=-(y-ℎ_\theta (x))x_{j}
=−(y−hθ(x))xj
=
(
h
θ
(
x
)
−
y
)
x
j
=(ℎ_\theta (x)-y)x_{j}
=(hθ(x)−y)xj
注意,这个算法和线性回归里的梯度下降算法几乎是一致的,除了
h
θ
(
x
)
ℎ_\theta (x)
hθ(x)的表示不同
为什么损失函数不用最小二乘
也就是损失函数为什么不应平方损失而是选择用交叉熵。原因是平方损失在训练的时候会出现一定的问题。当预测值与真实值之间的差距过大时,这时候参数的调整就需要变大,但是如果使用平方损失,训练的时候可能看到的情况是预测值和真实值之间的差距越大,参数调整的越小,训练的越慢。
如果使用平方损失作为损失函数,损失函数如下
j
(
θ
)
=
1
2
∑
i
=
1
n
(
z
(
x
(
i
)
)
−
y
(
i
)
)
2
j(\theta) = \frac{1}{2}\sum_{i=1}^{n}{(z(x^{(i)}) - y^{(i)})^{2}}
j(θ)=21i=1∑n(z(x(i))−y(i))2
其中
y
y
y表示真实值,
z
(
x
)
z(x)
z(x)表示预测值。
对参数求梯度
∂
∂
θ
j
j
(
θ
)
=
(
z
(
x
)
−
y
)
⋅
z
′
(
x
)
⋅
x
j
\frac{\partial}{\partial\theta_{j}}j(θ) = (z(x) - y) \cdot\ z'(x) \cdot\ x_{j}
∂θj∂j(θ)=(z(x)−y)⋅ z′(x)⋅ xj
由此可以看出,参数
θ
\theta
θ除了跟真实值与预测值之间的差距有关外,还和激活函数的该点的导数有关,跟激活函数的梯度成正比,常见的激活函数是
s
i
g
m
o
d
sigmod
sigmod函数,当这个点越靠近上边或者下边的时候梯度会变得非常小,这样会导致当真实值与预测值差距很大时,参数变化的非常缓慢,与我们的期望不符合。
而使用交叉熵损失在更新参数的时候,当误差越大时,梯度也就越大,参数调整也能更大更快。
参考文献:
1、李航,统计学习方法,清华大学出版社,2012
2、https://blog.csdn.net/qikaihuting/article/details/78518263