文章目录
逻辑回归 (logistic regression)逻辑回归如何解决分类问题回忆一下普通的回归问题逻辑回归要解决的问题解决之道:sigmoid对数几率优化目标损失函数 loss-function代价函数 cost-function梯度下降 gradient-descent
建议参考资料: https://blog.csdn.net/hellozhxy/article/details/80885899 https://blog.csdn.net/qq_43116030/article/details/104344904 https://zhuanlan.zhihu.com/p/65349652
逻辑回归 (logistic regression)
在线性回归问题中,我们使用的 features 来得到的预测 output 是连续的值在分类任务中,我们得到的 output 是离散的值逻辑回归虽然叫 “回归” 但其实解决的是分类问题
逻辑回归如何解决分类问题
将本来连续的标签进行离散化。例如:
原本通过 10 个 features 来预测一个人的年龄,这时候标签的分布是连续的,从 0-100 岁之间的任意一个数字但是现在对他们进行离散化,我们只预测这个标签为 0 或 1, 0 代表这个人是年轻人(<50岁),1 代表这个人是老年人(>50)岁通过这样的方式,就可以把一个回归问题转换为一个二分类问题。 逻辑回归除了可以解决上述的二分类问题,理论上还可以解决多分类问题。 在这一个章节我们重点讨论二分类问题。
回忆一下普通的回归问题
当我们解决普通的回归问题的时候,假设我们一共使用了 10 个特征(features)
x
=
{
x
1
,
x
2
,
.
.
.
x
10
}
x=\{x_1,x_2,...x_{10}\}
x={x1,x2,...x10} 来完成预测,那么我们最后要得到:
w
1
,
w
2
,
.
.
.
,
w
10
w_1,w_2,...,w_{10}
w1,w2,...,w10 使得
f
(
x
)
=
w
1
∗
x
1
+
w
2
∗
x
2
+
.
.
.
+
w
10
∗
x
10
+
b
f(x) = w_1*x_1 + w_2 * x_2 +... + w_{10} * x_{10}+b
f(x)=w1∗x1+w2∗x2+...+w10∗x10+b 然后使用这个
f
(
x
)
f(x)
f(x) 再去不断地根据给出的样本得到预测值 上述这个过程如果使用线性代数的形式表示,可以表述为
y
=
w
T
x
+
b
y=w^Tx+b
y=wTx+b,其中
w
T
w^T
wT 是一个要求解的向量,
x
x
x 是输入的样本的所有的特征的向量
逻辑回归要解决的问题
在逻辑回归中,我们不能只是简单地通过
y
=
w
T
x
+
b
y=w^Tx+b
y=wTx+b 来得到
y
y
y 因为 y 是连续的,这个时候我们要把 y 当做一个分类问题,求得应该是概率值,因此我们写成如下形式:
P
(
c
=
Y
∣
x
)
=
w
T
x
+
b
P(c=Y|x)=w^Tx+b
P(c=Y∣x)=wTx+b,那么问题来了,虽然我写的方式改变了,但是
P
(
c
=
Y
∣
x
)
P(c=Y|x)
P(c=Y∣x) 还是相当于之前的 y 是个连续的值,而且分布的范围不受控制,而我们的最终目的是求概率,是希望
P
(
c
=
Y
∣
x
)
P(c=Y|x)
P(c=Y∣x) 的值在 [0-1] 之间 图中红色的虚线代表如果我们只使用回归的公式,我们得到的值的真实范围,而黑色的线代表的是我预期的情况:结果坐落在 [0-1] 之间
解决之道:sigmoid
对于上面的问题,当我们得到预测的结果不在 [0-1] 之间,我们可以通过一个非线性函数 sigmoid 来完成映射, 这个函数的特点就是:将原本分布在
−
∞
,
+
∞
-∞,+∞
−∞,+∞ 的数值映射到 [0-1] 之间 这个函数的表达式是:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e−z1 在上面的问题中,可以看到
P
(
c
∣
x
)
P(c|x)
P(c∣x) 的取值范围是 [-1,1.5] 因此我们使用 sigmoid 函数对其进行处理:
P
(
c
∣
x
)
=
σ
(
P
(
c
∣
x
)
)
=
σ
(
w
T
x
+
b
)
=
1
1
+
e
−
(
w
T
x
+
b
)
P(c|x) = \sigma(P(c|x)) = \sigma(w^Tx+b)=\frac{1}{1+e^{-(w^Tx+b)}}
P(c∣x)=σ(P(c∣x))=σ(wTx+b)=1+e−(wTx+b)1 这时候函数的图像变成下图所示: 图像的横轴表示的依然还是 x 的情况 纵轴表示的就是概率值了,也就是说这个时候从回归问题变成二分类问题就初步成功了
对数几率
虽然我们上面直接写出了
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e−z1 但是我们有必要知道这个东西是怎么来的,以及为什么逻辑回归又被称为对数几率回归 几率(odds)的定义是:
z
=
P
(
c
∣
x
)
1
−
P
(
c
∣
x
)
z = \frac{P(c|x)}{1-P(c|x)}
z=1−P(c∣x)P(c∣x) 这个式子可以表示当前样本是正向样本的相对可能性:
P
(
c
∣
x
)
P(c|x)
P(c∣x) 表示当前样本是正向样本的概率(可能性)
1
−
P
(
c
∣
x
)
1-P(c|x)
1−P(c∣x) 表示当前样本是负向样本的概率所以他们的比值就是一种相对的可能性对这个结果
z
z
z 取对数:
l
o
g
i
t
=
l
o
g
(
P
(
c
∣
x
)
1
−
P
(
c
∣
x
)
)
logit=log(\frac{P(c|x)}{1-P(c|x)})
logit=log(1−P(c∣x)P(c∣x)) 现在得到的这个 logit 就是对数几率 而我们现在回归的任务就是去逼近这个对数几率,即:
l
o
g
i
t
=
l
o
g
(
P
(
c
∣
x
)
1
−
P
(
c
∣
x
)
)
=
w
T
+
b
logit = log(\frac{P(c|x)}{1-P(c|x)}) = w^T+b
logit=log(1−P(c∣x)P(c∣x))=wT+b 因此可以得到
P
(
c
∣
x
)
=
1
1
+
e
−
(
w
T
x
+
b
)
P(c|x)=\frac{1}{1+e^{-(w^Tx+b)}}
P(c∣x)=1+e−(wTx+b)1 我们通常把回归的过程可以看成是一个逼近的过程,在一般的回归任务中我们认为是通过逼近所有的样本点来得到那条直线 而在这个逻辑回归的任务中,我们将这个过程看成是逼近对数几率的过程。
优化目标
对于普通的回归任务,我们采用的是均方误差
M
S
E
MSE
MSE 来得到回归损失,从而不断迭代得到最优解。因为
M
S
E
MSE
MSE 是一个凸函数,因此我们优化得到最小值的过程是比较直观和容易的 对于逻辑回归,我们如何优化我们的模型来得到最优的
w
T
,
b
w^T,b
wT,b 呢? 对于整个训练集中的样本
{
X
,
Y
}
\{X,Y\}
{X,Y}, 其中
X
=
{
x
0
,
x
1
,
.
.
.
,
x
N
}
,
Y
=
{
y
0
,
y
1
,
.
.
.
,
y
N
}
X=\{x_0,x_1,...,x_N\}, Y=\{y_0,y_1,...,y_N\}
X={x0,x1,...,xN},Y={y0,y1,...,yN}我们的目标是选择一个
w
T
w^T
wT 来最大化几率:
m
a
x
i
m
i
z
e
(
L
(
w
)
)
=
m
a
x
i
m
i
z
e
(
Π
i
=
1
N
P
(
y
i
∣
x
i
,
w
T
)
)
maximize(L(w))=maximize(\Pi_{i=1}^{N} P(y_i|x_i,w^T))
maximize(L(w))=maximize(Πi=1NP(yi∣xi,wT))
求极大值的问题,在机器学习中我们通常转换为求极小值问题,因此我们把这个问题转换成:
m
i
n
i
m
i
z
e
(
−
Π
i
=
1
N
P
(
y
i
∣
x
i
,
w
T
)
)
minimize(-\Pi_{i=1}^{N}P(y_i|x_i,w^T))
minimize(−Πi=1NP(yi∣xi,wT))
再强调一遍,你看这里面的符号表示,这里表示的是对整个训练的数据集包含了
N
N
N 个样本,每个样本的 features 可以用
x
i
x_i
xi 来表示,每个样本的标签用
y
i
y_i
yi 来表示,整个数据集对每一个样本要求一个
w
w
w 即
w
T
=
{
w
1
,
w
2
,
.
.
.
,
w
N
}
w^T=\{w_1,w_2,...,w_N\}
wT={w1,w2,...,wN},之所以用转置符号
T
T
T 是因为我们在线性代数里面一般表示向量使用的是 列向量 (如果这个点不明白也可以直接在下面留言,我会给你们推荐合适的学习材料)
另外,如果你疑惑,为什么我们说要求最优化的
w
T
w^T
wT 和
b
b
b 但是后面的式子里面都没有
b
b
b了?
这是因为,我们可以把
b
b
b 放到
w
T
w^T
wT 这个向量里面,一起进行求算,具体的细节,我会在后面的部分详细说明。
损失函数 loss-function
你可以认为损失函数是针对一个样本衡量损失的表达式; 而代价函数则指的是针对一个数据集,对每一个样本进行损失计算并将他们结合起来得到的代表整个数据集在训练过程中代价的式子。
针对每一个样本的时候我们希望
P
(
y
i
∣
x
i
,
w
)
P(y_i|x_i,w)
P(yi∣xi,w) 能够取到最大值,由于
y
i
y_i
yi 的取值有两种:
P
(
y
i
=
1
∣
x
;
w
)
=
σ
(
w
⋅
x
i
)
=
y
^
i
P({y}_i=1| x; w) = \sigma(w \cdot x_i)= \hat{y}_i
P(yi=1∣x;w)=σ(w⋅xi)=y^i
P
(
y
i
=
0
∣
x
;
w
)
=
1
−
y
^
i
P({y}_i=0| x; w) = 1-\hat{y}_i
P(yi=0∣x;w)=1−y^i
这里使用
y
^
i
\hat{y}_i
y^i 来表示
σ
(
w
⋅
x
i
)
\sigma(w\cdot x_i)
σ(w⋅xi),代表这个样本的预测值。
因此我们使用一种方法可以直接把这两种情况结合到一个式子里面,这个式子构成了单个样本的损失函数:
L
(
y
i
,
y
^
i
)
=
σ
(
w
⋅
x
i
)
y
i
(
1
−
σ
(
w
⋅
x
i
)
)
1
−
y
i
=
y
^
i
y
i
(
1
−
y
^
i
)
1
−
y
i
L(y_i,\hat{y}_i)=\sigma(w\cdot x_i)^{y_i}(1-\sigma(w\cdot x_i))^{1-y_i}=\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}
L(yi,y^i)=σ(w⋅xi)yi(1−σ(w⋅xi))1−yi=y^iyi(1−y^i)1−yi
在这个式子里面,当
y
i
=
1
y_i=1
yi=1 时,
P
(
y
i
∣
x
i
,
w
)
=
y
^
i
1
(
1
−
y
^
i
)
0
=
y
^
i
P(y_i|x_i,w)=\hat{y}_i^1(1-\hat{y}_i)^0 = \hat{y}_i
P(yi∣xi,w)=y^i1(1−y^i)0=y^i 同理,当
y
i
=
0
y_i=0
yi=0 时,
P
(
y
i
∣
x
i
,
w
)
=
y
^
i
0
(
1
−
y
^
i
)
1
=
1
−
y
^
i
P(y_i|x_i,w)=\hat{y}_i^0(1-\hat{y}_i)^1 = 1-\hat{y}_i
P(yi∣xi,w)=y^i0(1−y^i)1=1−y^i 就非常巧妙地把每一个样本
y
i
y_i
yi 的情况都放入了代价函数中,这样我们在优化模型的时候,模型就可以根据样本标签的不同从而在 最大化
1
−
σ
(
y
^
i
)
1-\sigma(\hat{y}_i)
1−σ(y^i) 和 最大化
σ
(
y
^
i
)
\sigma(\hat{y}_i)
σ(y^i) 之间跳来跳去,最终到模型优化到最优。
当
y
i
=
1
y_i=1
yi=1 的时候可以看出要最大化
y
^
i
\hat{y}_i
y^i;当
y
i
=
0
y_i=0
yi=0 的时候可以看出要最大化
1
−
y
^
i
1-\hat{y}_i
1−y^i 即最小化
y
^
i
\hat{y}_i
y^i;
代价函数 cost-function
因此逻辑回归的目标函数也可以写成:
J
(
w
,
b
)
=
−
Π
i
=
1
N
P
(
y
i
∣
x
i
,
w
T
)
=
−
Π
i
=
1
N
y
^
i
y
i
(
1
−
y
^
i
)
1
−
y
i
J(w,b)=-\Pi_{i=1}^{N}P(y_i|x_i,w^T) = -\Pi_{i=1}^{N}\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}
J(w,b)=−Πi=1NP(yi∣xi,wT)=−Πi=1Ny^iyi(1−y^i)1−yi
在求算过程中,我们对上述的结果采用对数函数进行处理:
l
o
g
(
J
(
w
,
b
)
)
=
1
N
Σ
i
=
1
N
L
(
y
i
,
y
^
i
)
=
−
1
N
y
i
l
o
g
(
y
^
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
y
^
i
)
log(J(w,b))=\frac{1}{N}\Sigma_{i=1}^NL(y_i,\hat{y}_i)=-\frac{1}{N}{y_i} log(\hat{y}_i) + (1-y_i)log(1-\hat{y}_i)
log(J(w,b))=N1Σi=1NL(yi,y^i)=−N1yilog(y^i)+(1−yi)log(1−y^i)
现在我们的目标变成了最小化这个代价函数
J
(
w
,
b
)
J(w,b)
J(w,b)
梯度下降 gradient-descent
假设我们现在使用的数据集中的每个样本都只有两个特征
x
1
,
x
2
x_1,x_2
x1,x2 当前样本的真实标签为
y
y
y 那么我们根据前面的知识,我们可以知道,我们要拟合的公式为:
z
=
w
1
x
1
+
w
2
x
2
+
b
z=w_1x_1+w_2x_2+b
z=w1x1+w2x2+b
a
=
y
^
=
σ
(
z
)
a=\hat{y}=\sigma(z)
a=y^=σ(z)
根据偏导数的求算规则可以分别得到:
∂
L
∂
z
=
d
z
=
a
−
y
\frac{\partial L}{\partial z}=dz=a-y
∂z∂L=dz=a−y
∂
L
∂
w
1
=
d
w
1
=
x
1
⋅
d
z
\frac{\partial L}{\partial w_1}=dw_1=x_1\cdot dz
∂w1∂L=dw1=x1⋅dz
∂
L
∂
w
2
=
d
w
2
=
x
2
⋅
d
z
\frac{\partial L}{\partial w_2}=dw_2=x_2\cdot dz
∂w2∂L=dw2=x2⋅dz
d
b
=
d
z
db=dz
db=dz 所以梯度下降作用在要求算的变量
w
1
,
w
2
,
b
w_1,w_2,b
w1,w2,b 上就可以分别通过下面公式来表示梯度下降的过程:
w
1
:
=
w
1
−
α
d
w
1
w_1:=w_1-\alpha dw_1
w1:=w1−αdw1
w
2
:
=
w
2
−
α
d
w
2
w_2:=w_2-\alpha dw_2
w2:=w2−αdw2
b
:
=
b
−
α
d
b
b:=b-\alpha db
b:=b−αdb
α
\alpha
α 是学习率,也就是梯度下降一次所迈出的步长上面表示的过程也就是一个样本进行梯度下降一个 step 的过程
而如果将整个训练集进行梯度下降我们以
w
1
w_1
w1 变量为例,我们需要对全局的代价函数对于
w
1
w_1
w1 求偏导,公式表示如下:
∂
J
(
w
,
b
)
∂
w
1
=
1
m
Σ
i
=
1
m
∂
L
(
a
(
i
)
,
y
(
i
)
)
∂
w
1
=
1
m
Σ
i
=
1
m
d
w
1
(
i
)
\frac{\partial J(w,b)}{\partial w_1}=\frac{1}{m} \Sigma_{i=1}^{m}\frac{\partial L(a^{(i)}, y^{(i)})}{\partial w_1}=\frac{1}{m} \Sigma_{i=1}^{m}dw_1^{(i)}
∂w1∂J(w,b)=m1Σi=1m∂w1∂L(a(i),y(i))=m1Σi=1mdw1(i) 对应的,如果关注所有的需要求算的变量
w
1
,
.
.
.
,
w
N
w_1,...,w_N
w1,...,wN 对于数据集中的
m
m
m 个样本来说;需要根据每个样本得到的损失函数来求出各个
w
,
b
w,b
w,b 分别的偏导数,然后对于所有
m
m
m 个样本分别的
w
,
b
w,b
w,b 上进行取平均操作,从而得到这一个 step 的所有偏导数的值 在这个 step 的最后,根据梯度下降的公式
w
1
:
=
w
1
−
α
d
w
1
w_1:=w_1-\alpha dw_1
w1:=w1−αdw1
w
2
:
=
w
2
−
α
d
w
2
w_2:=w_2-\alpha dw_2
w2:=w2−αdw2
b
:
=
b
−
α
d
b
b:=b-\alpha db
b:=b−αdb 更新每一个
w
,
b
w,b
w,b
参考文章
发表评论