今天粗略地学习了一下机器学习一个非常基础的算法——逻辑回归算法,说是回归,但其实它是用来分类的。
回忆一下线性回归的目标函数:Y=wX+b,我们是不是可以把分类问题套进这里面去解?比如说当Y为0或者更多时,类别为1,当Y小于0的时候,类别为0,那么实质上,这就是直接用一条回归线去分割数据,但是这个方法有几个问题:
1. 即使分类正确了,但假如有一些点远离其他点,那么这些偏离值会迫使回归方程去移动来适应它们,但实际上它们就是分类正确的。
2. 如果有多个类别,一个预测目标为1,一个为2,一个为3,很明显,这里隐含了一个假设,即类别1离类别2更“近”,而离类别3更“远”,对于一个分类问题,我们可不想有这样的假设。
于是,我们需要一个更好的工具来做分类,一个简单的想法时,我在对线性回归的损失函数进行优化时,不使用均方误差了,因为均方误差导致回归方程会去“迎合”更远的点。这时候,由于我们做的是个分类问题,很容易的就有这样的想法:分类错误的就是loss,分类正确的不构成loss,这个函数的问题是,无法微分,实际上感知机和SVM使用的就是这个方法。而我们这里要使用其他的方法。
首先,不加推导地提出一个函数:sigmoid=1/(1+e^{-z}),实际上,这个函数可以用基于高斯分布的分类生产式模型推导出来,观察这个函数,我们发现sigmoid有很多优点:
1. output范围在0到1之间,实际上就是类别的概率;
2. 对异常值不敏感,也就是外缘对概率变动的影响小。
所以我们可以把sigmoid当成我们的目标函数,而z=wX+b。
然后,就轮到使用什么样的损失函数了,这里是做分类问题,所以为了尽量优化,使用了交叉熵公式,从另一个角度来说就是伯努利分布计算概率,loss=-ylog(y_pred)-(1-y)log(1-y_pred)。当然,也可以使用均方误差损失函数,均方误差损失函数的后果是求解慢,梯度下降的速度变慢了很多。
最后,只要对loss进行求偏导,计算出相应的梯度,然后就可以使用梯度回归进行优化求解,得到模型的参数,并运用sigmoid函数进行预测。
sigmoid不仅是逻辑回归的“关键先生”,它在深度学习中也是重要的角色,深度神经网络进行分类时,sigmoid也是需要考虑的最后一层激活函数之一。