个人博客原文:链接
笔记与代码仓库:https://github.com/yunsaijc/LearnMachineLearning.git
- 分类:目标是离散变量
- 回归:目标是连续变量
Logistic回归与Softmax回归虽然称为“回归”,但是目标是分类。即通过回归的过程来得到连续值,最后再处理一下变成分类
线性回归
其实高中就有学过,在高中的题目形式大概是:用一条直线来拟合散点数据,通过平方差损失来确定最优的直线
一元线性回归的形式:
y
=
β
0
+
β
1
x
y=\beta_0+\beta_1x
y=β0+β1x
用数据点
{
(
x
i
,
y
i
)
}
\{(x_i, y_i)\}
{(xi,yi)}来确定参数
[
β
0
,
β
1
]
[\beta_0, \beta_1]
[β0,β1]的值即可。其中用来度量损失的函数称为“残差平方和”。残差即真实值与预测值之间的差:
e
=
y
−
y
^
e=y-\hat{y}
e=y−y^
那么损失定义为:
L
=
∑
1
n
e
i
2
=
∑
1
n
(
y
i
−
(
β
0
^
+
β
1
^
x
)
)
2
L=\sum_1^n e_i^2=\sum_1^n(y_i-(\hat{\beta_0}+\hat{\beta_1}x))^2
L=1∑nei2=1∑n(yi−(β0^+β1^x))2
用最小二乘法来最小化
L
L
L:求对于
[
β
0
,
β
1
]
[\beta_0, \beta_1]
[β0,β1]的偏导,使其为零即可
Logistic 回归(逻辑回归)
回归形式的确定
在二分类问题中因变量只取 0 , 1 0,1 0,1两个值,用线性回归不合适
可以用阶跃函数来拟合:
y
=
{
0
,
z
<
0
0.5
,
z
=
0
1
,
z
>
0
y=\begin{cases}&0,z<0\\&0.5,z=0\\&1,z>0&\end{cases}
y=⎩
⎨
⎧0,z<00.5,z=01,z>0
但是阶跃函数不连续不可导,因此改用单调可导的sigmoid函数,将正负无限的值映射到
(
0
,
1
)
(0,1)
(0,1):
f
(
z
)
=
1
1
+
e
−
z
f(z)=\frac1{1+e^{-z}}
f(z)=1+e−z1
可以发现该函数中除了
z
z
z都是常数,也就是说参数和自变量的位置应该是
z
z
z所在的位置。那么,把因变量、自变量、参数分别记为:
Y
=
[
y
1
y
2
⋮
y
n
]
,
X
=
[
1
x
11
⋯
x
1
p
1
x
21
⋯
x
2
p
⋮
⋮
⋮
1
x
n
1
⋯
x
n
p
]
,
β
=
[
β
0
β
1
⋮
⋮
]
\left.\boldsymbol{Y}=\left[\begin{array}{c}y_1\\y_2\\\vdots\\y_n\end{array}\right.\right],\boldsymbol{X}=\left[\begin{array}{cccc}1&x_{11}&\cdots&x_{1p}\\1&x_{21}&\cdots&x_{2p}\\\vdots&\vdots&&\vdots\\1&x_{n1}&\cdots&x_{np}\end{array}\right],\boldsymbol{\beta}=\left[\begin{array}{c}\beta_0\\\beta_1\\\vdots\\\vdots\end{array}\right]
Y=
y1y2⋮yn
,X=
11⋮1x11x21⋮xn1⋯⋯⋯x1px2p⋮xnp
,β=
β0β1⋮⋮
在线性回归中有
Y
=
X
β
Y=X\beta
Y=Xβ,在Logistic中形式改变了,相当于:
Y
′
=
f
(
X
β
)
=
s
i
g
m
o
i
d
(
X
β
)
=
1
1
+
e
−
X
β
Y'=f(X\beta)=sigmoid(X\beta)=\frac1{1+e^{-X\beta}}
Y′=f(Xβ)=sigmoid(Xβ)=1+e−Xβ1
注意,这里记为
Y
′
Y'
Y′是考虑到:实际上的
Y
Y
Y是离散的,但这里的函数值是连续的,两者不能直接划等号
考虑到上述的
Y
′
Y'
Y′值是连续的,但我们要解决的是离散的分类问题,而概率又是连续的值,所以可以令
Y
′
Y'
Y′为预测为正例的概率
P
(
Y
=
1
)
P(Y=1)
P(Y=1),也就是说越靠图像的右边,
Y
=
1
Y=1
Y=1的概率就越大。那么逻辑回归的形式就可以写为:
Y
′
=
P
(
Y
=
1
∣
X
,
β
)
=
1
1
+
e
−
X
β
Y'=P(Y=1|X,\beta)=\frac1{1+e^{-X\beta}}
Y′=P(Y=1∣X,β)=1+e−Xβ1
余下的工作是确定 β \beta β的值,即目标为似然(不明白似然可以参考https://www.zhihu.com/question/24261751),采用极大似然估计(https://zhuanlan.zhihu.com/p/89074979)。
这里可能会有一个问题:为什么不像线性回归一样使用最小二乘法来得到
β
\beta
β的值?
如果使用残差平方和,那么损失函数为:
Q
=
∑
1
n
(
y
i
−
1
1
+
e
−
x
i
β
)
2
Q=\sum_1^n\left(y_i-\frac1{1+e^{-x_i\beta}}\right)^2
Q=1∑n(yi−1+e−xiβ1)2
- 与线性回归的形式不同,这个不是凸函数,难优化!!!
- 并且采用梯度下降法进行学习时,会出现学习速率非常慢的情况(可以看到在除了输入=0附近的地方导数非常小)
所以还是用极大似然法来估计
极大似然估计
对于函数 p ( x ∣ θ ) p(x|\theta) p(x∣θ):如果 θ \theta θ是确定的, x x x是变量,这个函数叫做概率函数;如果 x x x是已知确定的, θ \theta θ是变量,这个函数叫做似然函数
也就是说,当参数确定时该函数表示 x x x出现的概率(probability);当 x x x确定时,该函数表示参数 θ \theta θ是真实参数的可能性(likelihood)
在这里,两个类别的数据点的似然:
P
(
y
=
1
∣
x
,
β
)
P
(
y
=
0
∣
x
,
β
)
=
1
−
P
(
y
=
1
∣
x
,
β
)
\begin{aligned}&P(y=1|x,\beta)\\&P(y=0|x,\beta)=1-P(y=1|x,\beta)\end{aligned}
P(y=1∣x,β)P(y=0∣x,β)=1−P(y=1∣x,β)
可以统一地写为:
P
(
y
∣
x
,
β
)
=
P
(
y
=
1
∣
x
,
β
)
y
[
1
−
P
(
y
=
1
∣
x
,
β
)
]
1
−
y
P(y|x,\beta)=P(y=1|x,\beta)^y[1-P(y=1|x,\beta)]^{1-y}
P(y∣x,β)=P(y=1∣x,β)y[1−P(y=1∣x,β)]1−y
那么总体的似然函数:只需将所有数据点的似然函数相乘即可(当然,这里的假设是每个采样的数据点是相互独立的):
L
(
β
)
=
∏
i
=
1
n
P
(
y
i
∣
x
i
,
β
)
=
∏
i
=
1
n
(
1
1
+
e
−
x
i
β
)
y
i
(
1
−
1
1
+
e
−
x
i
β
)
1
−
y
i
\begin{aligned}\mathcal{L}(\beta)&=\prod_{i=1}^nP(y_i|x_i,\beta)\\&=\prod_{i=1}^n\left(\frac1{1+e^{-xi\beta}}\right)^{yi}\left(1-\frac1{1+e^{-x_i\beta}}\right)^{1-y_i}\end{aligned}
L(β)=i=1∏nP(yi∣xi,β)=i=1∏n(1+e−xiβ1)yi(1−1+e−xiβ1)1−yi
想要取该函数的最大值不好算,观察到可以取个对数:
l
o
g
L
(
β
)
=
∑
i
=
1
n
(
[
y
i
⋅
l
o
g
(
1
1
+
e
−
x
i
β
)
]
+
[
(
1
−
y
i
)
⋅
l
o
g
(
1
−
1
1
+
e
−
x
i
β
)
]
)
=
∑
i
=
1
n
(
[
y
i
⋅
l
o
g
(
f
(
x
i
β
)
)
]
+
[
(
1
−
y
i
)
⋅
l
o
g
(
1
−
f
(
x
i
β
)
)
]
)
\begin{aligned}log\mathcal{L}(\beta) &=\sum_{i=1}^n\left([y_i\cdot log(\frac1{1+e^{-x_i\beta}})]+[(1-y_i)\cdot log(1-\frac1{1+e^{-x_i\beta}})]\right)\\ &=\sum_{i=1}^n\left([y_i\cdot log(f(x_i\beta))]+[(1-y_i)\cdot log(1-f(x_i\beta))]\right) \end{aligned}
logL(β)=i=1∑n([yi⋅log(1+e−xiβ1)]+[(1−yi)⋅log(1−1+e−xiβ1)])=i=1∑n([yi⋅log(f(xiβ))]+[(1−yi)⋅log(1−f(xiβ))])
接下来的工作是求使该式取最大值的 β \beta β
损失函数
既然这里不用残差平方和作为损失,目标又是最大化上述的对数似然函数,那么直接将对数似然取个符号即可,即最小化:
J
(
β
)
=
−
l
o
g
L
(
β
)
J(\beta)=-log\mathcal{L}(\beta)
J(β)=−logL(β)
这称为负对数似然。随后使用梯度下降法求解即可
梯度下降法求解
对于sigmoid,其导数:
f
′
(
x
)
=
(
1
1
+
e
−
x
)
′
=
−
(
e
−
x
)
′
(
1
+
e
−
x
)
2
=
e
−
x
(
1
+
e
−
x
)
2
f^{\prime}(x)=(\frac1{1+e^{-x}})^{\prime}=-\frac{(e^{-x})^{\prime}}{\left(1+e^{-x}\right)^2}=\frac{e^{-x}}{\left(1+e^{-x}\right)^2}
f′(x)=(1+e−x1)′=−(1+e−x)2(e−x)′=(1+e−x)2e−x
并且:
f
′
(
x
)
=
f
(
x
)
⋅
(
1
−
f
(
x
)
)
f^{\prime}(x)=f(x)\cdot(1-f(x))
f′(x)=f(x)⋅(1−f(x))
那么对于
f
(
x
i
β
)
f(x_i\beta)
f(xiβ),其对于
β
\beta
β中一个分量的偏导为:
∂
f
(
x
i
β
)
∂
β
j
=
f
(
x
i
β
)
⋅
(
1
−
f
(
x
i
β
)
)
⋅
x
i
j
\frac{\partial f(x_i\beta)}{\partial\beta_j}=f(x_i\beta)\cdot(1-f(x_i\beta))\cdot x_{ij}
∂βj∂f(xiβ)=f(xiβ)⋅(1−f(xiβ))⋅xij
注意,此处的最后本来应该乘的是
x
i
x_i
xi,即第
i
i
i个样本的特征向量。但是其中的分量只有
x
i
j
x_{ij}
xij会和
β
j
\beta_j
βj相乘,因此只剩
x
i
j
x_{ij}
xij了
代入损失函数的求导过程可以得到(具体推导参考https://zhuanlan.zhihu.com/p/139122386):
∂
J
(
β
)
∂
β
j
=
−
∑
i
=
1
n
(
y
i
−
f
(
x
i
β
)
)
⋅
x
i
j
=
∑
i
=
1
n
(
1
1
+
e
−
x
i
β
−
y
i
)
⋅
x
i
j
\begin{aligned}\frac{\partial J(\beta)}{\partial\beta_j} &=-\sum_{i=1}^n\left(y_i-f(x_i\beta)\right)\cdot x_{ij}\\ &=\sum_{i=1}^n\left(\frac1{1+e^{-x_i\beta}}-y_i\right)\cdot x_{ij}\end{aligned}
∂βj∂J(β)=−i=1∑n(yi−f(xiβ))⋅xij=i=1∑n(1+e−xiβ1−yi)⋅xij
最后更新参数:
β
i
+
1
=
β
i
−
α
⋅
g
\beta_{i+1}=\beta_{i}-\alpha\cdot g
βi+1=βi−α⋅g
其中
α
\alpha
α为学习率/ 步长;
g
g
g为梯度
Softmax回归
从Logistic到Softmax
上述Logistic解决的是二分类问题,Softmax回归则解决多分类问题,是 logistic 回归的一般形式
使用Logistic回归预测二分类问题时,输出层可以只设置一个节点,表示某个事件A发生的概率为
P
(
A
∣
x
)
P(A|x)
P(A∣x),其中
x
x
x为输入。
例如,在预测某病人是否有肿瘤时,
A
A
A可以表示为有肿瘤,那么无肿瘤就自然地表示为
A
ˉ
\bar{A}
Aˉ并且
P
(
A
ˉ
∣
x
)
=
1
−
P
(
A
∣
x
)
P(\bar{A}|x)=1-P(A|x)
P(Aˉ∣x)=1−P(A∣x)
但是,对于二分类问题,除了可以使用单个输出节点表示事件 A A A发生的概率,还可以分别预测 P ( A ∣ x ) P(A|x) P(A∣x)和 P ( A ˉ ∣ x ) P(\bar{A}|x) P(Aˉ∣x),并满足约束 P ( A ∣ x ) + P ( A ˉ ∣ x ) = 1 P(A|x)+P(\bar{A}|x)=1 P(A∣x)+P(Aˉ∣x)=1
也就是说,输出层为多个节点,并添加了一个约束(这在二分类问题中可能没有必要,但是多分类问题中有必要,因为只有一个节点无法进行多分类)
转换成数学表达即:将各个输出节点的值范围映射到 [ 0 , 1 ] [0,1] [0,1],且各个节点输出之和为 1 1 1
Softmax函数就是这样的函数
Softmax函数
Softmax的soft是相对于hard来说的。hardmax也就是直接从所有元素中找出最大值,其他的丢弃;也就是非黑即白的
但对于多分类问题,有时我们更希望得到对于每一个类别的置信度:例如在对文本进行分类时,得到文章对于每个可能的文本类别的概率值,表示属于每个类别的可能性
Softmax定义为:
S
o
f
t
m
a
x
(
z
i
)
=
e
z
i
∑
c
=
1
C
e
z
c
Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}
Softmax(zi)=∑c=1Cezcezi
其中
z
i
z_i
zi为第
i
i
i个节点的输出值,
C
C
C为节点个数/ 类别数
- 引入指数的优点:
- x x x的少许差距会快速拉开函数值的差距(个人理解:使得辨识度更高)
- 指数求导还是指数,求导方便
- 缺点:
- 指数的数值大,可能会溢出
注意:当使用Softmax函数作为输出节点的激活函数的时候,一般使用交叉熵作为损失函数。由于Softmax函数的溢出现象,在计算交叉熵时也可能会出现数值溢出的问题。为了数值计算的稳定性,Torch/ TensorFlow提供了统一的接口,将Softmax与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常
Softmax求导
Softmax的求导需要分两类情况讨论。比如:
y
1
=
e
z
1
e
z
1
+
e
z
2
+
e
z
3
y_1=\frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}}
y1=ez1+ez2+ez3ez1
这时对于
z
1
z_1
z1和
z
2
,
z
3
z_2,z_3
z2,z3的求导就是不一样的
将
S
o
f
t
m
a
x
(
z
i
)
=
e
z
i
∑
c
=
1
C
e
z
c
Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}
Softmax(zi)=∑c=1Cezcezi记为
p
i
p_i
pi。进行基本的导数计算后得到:
∂
y
i
∂
z
j
=
{
p
i
(
1
−
p
j
)
=
p
i
(
1
−
p
i
)
j
=
i
−
p
j
⋅
p
i
j
≠
i
\frac{\partial y_i}{\partial z_j} =\left\{\begin{array}{ll} p_i(1-p_j)=p_i(1-p_i)&j=i\\ -p_j\cdot p_i&j\neq i \end{array}\right.
∂zj∂yi={pi(1−pj)=pi(1−pi)−pj⋅pij=ij=i
Softmax回归的损失函数与求导
从Softmax的定义引出损失函数:对于单个数据样本来说,假设此时第
i
i
i个输出节点为正确类别对应的输出节点,则
p
i
p_i
pi是正确类别对应输出节点的概率值:
p
i
=
S
o
f
t
m
a
x
(
z
i
)
=
e
z
i
∑
c
=
1
C
e
z
c
p_i=Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}
pi=Softmax(zi)=∑c=1Cezcezi
那么优化的目标显然是
p
i
p_i
pi越大越好
与Logistic回归类似地,取负对数:
l
o
s
s
=
−
l
o
g
e
z
i
∑
c
=
1
C
e
z
c
=
−
(
z
i
−
l
o
g
∑
c
=
1
C
e
z
c
)
loss=-log\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}=-(z_i-log\sum_{c=1}^Ce^{z_c})
loss=−log∑c=1Cezcezi=−(zi−logc=1∑Cezc)
前面提到,Softmax一般使用交叉熵作为损失函数:
l
o
s
s
′
=
−
∑
c
=
1
C
y
c
l
o
g
(
p
c
)
loss'=-\sum_{c=1}^Cy_c\left.log(p_c)\right.
loss′=−c=1∑Cyclog(pc)
其实上述损失与交叉熵是一样的:
- 上述损失只针对正确类别的对应的输出节点,将该节点的Softmax值最大化
- 交叉熵则是直接衡量真实分布和实际输出的分布之间的距离
对于多分类一般使用ont-hot编码,也就是标签值
y
i
y_i
yi的取值只有
0
,
1
0,1
0,1。
那么除了
i
i
i之外,其余的类别都被
0
0
0消掉了,实际上交叉熵在这种情况下就是:
l
o
s
s
′
=
−
l
o
g
(
p
i
)
loss'=-\left.log(p_i)\right.
loss′=−log(pi)
偏导数很简洁(具体推导参考https://zhuanlan.zhihu.com/p/105722023):
∂
l
o
s
s
∂
z
i
=
p
i
−
y
i
\frac{\partial loss}{\partial z_i}=p_i-y_i
∂zi∂loss=pi−yi
总结和延伸
-
Logistic回归是Softmax回归在二分类时的特殊形式(公式推导参考https://zhuanlan.zhihu.com/p/98061179)
-
Logistic和Softmax都不是线性回归,但都属于线性模型(https://zhuanlan.zhihu.com/p/147599207,https://www.zhihu.com/question/362676570)
-
可以发现负对数似然与交叉熵相通
参考
线性回归:
https://blog.csdn.net/simplification/article/details/95238464
逻辑回归:
https://zhuanlan.zhihu.com/p/139122386
https://zhuanlan.zhihu.com/p/74874291
Softmax回归: