笔记与代码仓库:https://github.com/yunsaijc/LearnMachineLearning.git

  • 分类:目标是离散变量
  • 回归:目标是连续变量

Logistic回归与Softmax回归虽然称为“回归”,但是目标是分类。即通过回归的过程来得到连续值,最后再处理一下变成分类

线性回归

其实高中就有学过,在高中的题目形式大概是:用一条直线来拟合散点数据,通过平方差损失来确定最优的直线

一元线性回归的形式: \[y=\beta_0+\beta_1x\] 用数据点\(\{(x_i, y_i)\}\)来确定参数\([\beta_0, \beta_1]\)的值即可。其中用来度量损失的函数称为“残差平方和”。残差即真实值与预测值之间的差: \[e=y-\hat{y}\] 那么损失定义为: \[L=\sum_1^n e_i^2=\sum_1^n(y_i-(\hat{\beta_0}+\hat{\beta_1}x))^2\] 用最小二乘法来最小化\(L\):求对于\([\beta_0, \beta_1]\)的偏导,使其为零即可

Logistic 回归(逻辑回归)

回归形式的确定

在二分类问题中因变量只取\(0,1\)两个值,用线性回归不合适

可以用阶跃函数来拟合: \[y=\begin{cases}&0,z<0\\&0.5,z=0\\&1,z>0&\end{cases}\] 但是阶跃函数不连续不可导,因此改用单调可导的sigmoid函数,将正负无限的值映射到\((0,1)\)\[f(z)=\frac1{1+e^{-z}}\]

可以发现该函数中除了\(z\)都是常数,也就是说参数和自变量的位置应该是\(z\)所在的位置。那么,把因变量、自变量、参数分别记为: \[\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=X\beta\),在Logistic中形式改变了,相当于: \[Y'=f(X\beta)=sigmoid(X\beta)=\frac1{1+e^{-X\beta}}\] 注意,这里记为\(Y'\)是考虑到:实际上的\(Y\)是离散的,但这里的函数值是连续的,两者不能直接划等号

考虑到上述的\(Y'\)值是连续的,但我们要解决的是离散的分类问题,而概率又是连续的值,所以可以令\(Y'\)为预测为正例的概率\(P(Y=1)\),也就是说越靠图像的右边,\(Y=1\)的概率就越大。那么逻辑回归的形式就可以写为: \[Y'=P(Y=1|X,\beta)=\frac1{1+e^{-X\beta}}\]

余下的工作是确定\(\beta\)的值,即目标为似然(不明白似然可以参考https://www.zhihu.com/question/24261751),采用极大似然估计(https://zhuanlan.zhihu.com/p/89074979)。

这里可能会有一个问题:为什么不像线性回归一样使用最小二乘法来得到\(\beta\)的值? 如果使用残差平方和,那么损失函数为: \[Q=\sum_1^n\left(y_i-\frac1{1+e^{-x_i\beta}}\right)^2\]

  • 与线性回归的形式不同,这个不是凸函数,难优化!!!
  • 并且采用梯度下降法进行学习时,会出现学习速率非常慢的情况(可以看到在除了输入=0附近的地方导数非常小)

所以还是用极大似然法来估计

极大似然估计

对于函数\(p(x|\theta)\):如果\(\theta\)是确定的,\(x\)是变量,这个函数叫做概率函数;如果\(x\)是已知确定的,\(\theta\)是变量,这个函数叫做似然函数

也就是说,当参数确定时该函数表示\(x\)出现的概率(probability);当\(x\)确定时,该函数表示参数\(\theta\)是真实参数的可能性(likelihood)

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

在这里,两个类别的数据点的似然: \[\begin{aligned}&P(y=1|x,\beta)\\&P(y=0|x,\beta)=1-P(y=1|x,\beta)\end{aligned}\] 可以统一地写为: \[P(y|x,\beta)=P(y=1|x,\beta)^y[1-P(y=1|x,\beta)]^{1-y}\]

那么总体的似然函数:只需将所有数据点的似然函数相乘即可(当然,这里的假设是每个采样的数据点是相互独立的): \[\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}\] 想要取该函数的最大值不好算,观察到可以取个对数: \[\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}\]

接下来的工作是求使该式取最大值的\(\beta\)

损失函数

既然这里不用残差平方和作为损失,目标又是最大化上述的对数似然函数,那么直接将对数似然取个符号即可,即最小化: \[J(\beta)=-log\mathcal{L}(\beta)\]

这称为负对数似然。随后使用梯度下降法求解即可

梯度下降法求解

对于sigmoid,其导数: \[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^{\prime}(x)=f(x)\cdot(1-f(x))\]

那么对于\(f(x_i\beta)\),其对于\(\beta\)中一个分量的偏导为: \[\frac{\partial f(x_i\beta)}{\partial\beta_j}=f(x_i\beta)\cdot(1-f(x_i\beta))\cdot x_{ij}\] 注意,此处的最后本来应该乘的是\(x_i\),即第\(i\)个样本的特征向量。但是其中的分量只有\(x_{ij}\)会和\(\beta_j\)相乘,因此只剩\(x_{ij}\)

代入损失函数的求导过程可以得到(具体推导参考https://zhuanlan.zhihu.com/p/139122386): \[\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}\]

最后更新参数: \[\beta_{i+1}=\beta_{i}-\alpha\cdot g\] 其中\(\alpha\)为学习率/ 步长;\(g\)为梯度

Softmax回归

从Logistic到Softmax

上述Logistic解决的是二分类问题,Softmax回归则解决多分类问题,是 logistic 回归的一般形式

使用Logistic回归预测二分类问题时,==输出层可以只设置一个节点==,表示某个事件A发生的概率为\(P(A|x)\),其中\(x\)为输入。 例如,在预测某病人是否有肿瘤时,\(A\)可以表示为有肿瘤,那么无肿瘤就自然地表示为\(\bar{A}\)并且\(P(\bar{A}|x)=1-P(A|x)\)

但是,对于二分类问题,除了可以使用单个输出节点表示事件\(A\)发生的概率,还可以分别预测\(P(A|x)\)\(P(\bar{A}|x)\),并满足约束\(P(A|x)+P(\bar{A}|x)=1\)

也就是说,输出层为多个节点,并添加了一个约束(这在二分类问题中可能没有必要,但是多分类问题中有必要,因为只有一个节点无法进行多分类)

转换成数学表达即:将各个输出节点的值范围映射到\([0,1]\),且各个节点输出之和为\(1\)

Softmax函数就是这样的函数

Softmax函数

Softmax的soft是相对于hard来说的。hardmax也就是直接从所有元素中找出最大值,其他的丢弃;也就是非黑即白的

但对于多分类问题,有时我们更希望得到对于每一个类别的置信度:例如在对文本进行分类时,得到文章对于每个可能的文本类别的概率值,表示属于每个类别的可能性

Softmax定义为: \[Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}\] 其中\(z_i\)为第\(i\)个节点的输出值,\(C\)为节点个数/ 类别数

  • 引入指数的优点:
    • \(x\)的少许差距会快速拉开函数值的差距(个人理解:使得辨识度更高)
    • 指数求导还是指数,求导方便
  • 缺点:
    • 指数的数值大,可能会溢出

注意:当使用Softmax函数作为输出节点的激活函数的时候,一般使用交叉熵作为损失函数。由于Softmax函数的溢出现象,在计算交叉熵时也可能会出现数值溢出的问题。为了数值计算的稳定性,Torch/ TensorFlow提供了统一的接口,将Softmax与交叉熵损失函数同时实现,同时也处理了数值不稳定的异常

Softmax求导

Softmax的求导需要分两类情况讨论。比如: \[y_1=\frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}}\] 这时对于\(z_1\)\(z_2,z_3\)的求导就是不一样的

\(Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}\)记为\(p_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.\]

Softmax回归的损失函数与求导

从Softmax的定义引出损失函数:对于单个数据样本来说,假设此时第\(i\)个输出节点为正确类别对应的输出节点,则\(p_i\)是正确类别对应输出节点的概率值: \[p_i=Softmax(z_i)=\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}\] 那么优化的目标显然是\(p_i\)越大越好

与Logistic回归类似地,取负对数: \[loss=-log\frac{e^{z_i}}{\sum_{c=1}^Ce^{z_c}}=-(z_i-log\sum_{c=1}^Ce^{z_c})\]

前面提到,Softmax一般使用交叉熵作为损失函数: \[loss'=-\sum_{c=1}^Cy_c\left.log(p_c)\right.\]

其实上述损失与交叉熵是一样的: - 上述损失只针对正确类别的对应的输出节点,将该节点的Softmax值最大化 - 交叉熵则是直接衡量真实分布和实际输出的分布之间的距离

对于多分类一般使用ont-hot编码,也就是标签值\(y_i\)的取值只有\(0,1\)。 那么除了\(i\)之外,其余的类别都被\(0\)消掉了,实际上交叉熵在这种情况下就是: \[loss'=-\left.log(p_i)\right.\]

偏导数很简洁(具体推导参考https://zhuanlan.zhihu.com/p/105722023): \[\frac{\partial loss}{\partial z_i}=p_i-y_i\]

总结和延伸

参考

线性回归:

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