<ML笔记> 线性回归、Logistic回归与Softmax回归

个人博客原文:链接

笔记与代码仓库: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=yy^
那么损失定义为:
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=1nei2=1n(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+ez1

可以发现该函数中除了 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= y1y2yn ,X= 111x11x21xn1x1px2pxnp ,β= β0β1
在线性回归中有 Y = X β Y=X\beta Y=,在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()=sigmoid()=1+e1
注意,这里记为 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+e1

余下的工作是确定 β \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=1n(yi1+exiβ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)

https://zhuanlan.zhihu.com/p/26614750

在这里,两个类别的数据点的似然:
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,β)=1P(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(yx,β)=P(y=1∣x,β)y[1P(y=1∣x,β)]1y

那么总体的似然函数:只需将所有数据点的似然函数相乘即可(当然,这里的假设是每个采样的数据点是相互独立的):
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=1nP(yixi,β)=i=1n(1+exiβ1)yi(11+exiβ1)1yi
想要取该函数的最大值不好算,观察到可以取个对数:
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=1n([yilog(1+exiβ1)]+[(1yi)log(11+exiβ1)])=i=1n([yilog(f(xiβ))]+[(1yi)log(1f(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+ex1)=(1+ex)2(ex)=(1+ex)2ex
并且:
f ′ ( x ) = f ( x ) ⋅ ( 1 − f ( x ) ) f^{\prime}(x)=f(x)\cdot(1-f(x)) f(x)=f(x)(1f(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} βjf(xiβ)=f(xiβ)(1f(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} βjJ(β)=i=1n(yif(xiβ))xij=i=1n(1+exiβ1yi)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(Ax),其中 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)=1P(Ax)

但是,对于二分类问题,除了可以使用单个输出节点表示事件 A A A发生的概率,还可以分别预测 P ( A ∣ x ) P(A|x) P(Ax) 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(Ax)+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. zjyi={pi(1pj)=pi(1pi)pjpij=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=logc=1Cezcezi=(zilogc=1Cezc)

前面提到,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=1Cyclog(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 ziloss=piyi

总结和延伸

参考

线性回归:

https://blog.csdn.net/simplification/article/details/95238464

逻辑回归:

https://zhuanlan.zhihu.com/p/139122386

https://zhuanlan.zhihu.com/p/74874291

Softmax回归:

https://zhuanlan.zhihu.com/p/98061179

https://zhuanlan.zhihu.com/p/105722023

  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值