许多问题的预测结果是一个在连续空间的数值,比如房价预测问题,可以用线性模型来描述:
但也有很多场景需要输出的是概率估算值,例如:根据邮件内容判断是垃圾邮件的可能性;根据医学影像判断肿瘤是恶性的可能性;手写数字分别是0、1、2、3、4、5、6、7、8、9的可能性。这些都是分类问题。
要预测各类别的概率值,需要将预测输出值控制在[0,1]区间内。对于二元分类问题,它的目标是正确预测两个可能的标签中的一个,就像判断是不是垃圾邮件,答案只有是或否两种。此时可考虑⽤逻辑回归(Logistic Regression)来处理这类问题。
逻辑回归也叫回归,但本质上它能更好的处理分类问题。
如何保证输出值始终落在0和1之间呢?
这里有⼀个⾮常好的函数叫Sigmoid函数(S型函数),它的输出值正好具有以上特性。其定义如下:
通过sigmoid函数,可以把线性模型的输出映射到0到1之间的概率,从而实现⼆元分类的思想。
逻辑回归中的损失函数
在模型优化时需要计算损失函数,线性回归的损失函数是MSE均方差损失函数,即平方损失,如果把逻辑回归的损失函数也定义为平方损失,会得到如下函数:
这个损失函数是一个⾮凸的函数,是有多个极⼩值的。
⽤梯度下降优化算法就很有可能使优化过程陷⼊到局部最优的局部极⼩值中去, 使得函数不能达到全局最优。所以建议大家在逻辑回归中不要采⽤平⽅损失函数。
那这里应该采⽤什么样的损失函数呢?
对于二元逻辑回归的损失函数,一般采用对数损失函数,其定义如下:
其中
是预测值
为什么要采用这样的函数呢?
假设样本
中的标签值
,那么理想的预测结果
。
与
越接近,损失就越⼩。如果
,上图公式的后半部分为0,整个损失函数就变成了
。根据对数函数的性质,当
越接近1,
的值越⼩的。反之,如果标签值
,上图公式的前半部分为0,整个损失函数就变成了
,当
越⼩时,损失值越⼩。
通过这样的对数损失函数,就能较好的刻画预测值和标签值之间的损失关系,⽽且这个损失函数是凸函数:
多元分类和softmax回归
之前已经提到逻辑回归可生成介于0和1之间的小数。例如,某电子邮件分类器的逻辑回归输出值为0.8,表明电子邮件是垃圾邮件的概率为80%,不是垃圾邮件的概率为20%。很明显,这封电子邮件是垃圾邮件与不是垃圾邮件的概率之和为1。
在处理多元分类中,Softmax将逻辑回归的思想延伸到多类别领域。
在多类别问题中,Softmax为每个类别分配一个小数形式的概率,介于0到1之间,并且这些概率的和必须是1。
Softmax 层实际上是通过Softmax方程来实现,把y的值经过运算,映射到多分类问题中属于每个类别的概率值:
其计算公式如下:
这里的
指的是所有的类别
交叉熵
刻画的是两个概率分布之间的距离,p代表正确答案,q代表的是预测值,交叉熵越小,两个概率的分布约接近,损失越低。对于机器学习中的多分类问题,通常用交叉熵做为损失函数。
下面来看一个交叉熵计算的例子:
假设有一个3分类问题,某个样例的正确答案是(1,0,0),即它属于第一个类别。甲模型经过softmax回归之后的预测答案是(0.5,0.2,0.3),乙模型经过softmax回归之后的预测答案是(0.7,0.1,0.2)。它们俩哪一个模型预测的更好一些呢(更接近正确答案)?
通过下面交叉熵的计算可以看到,乙模型的预测更好:
于是,多分类的损失函数为:
logostic分布
设X是连续随机变量,X服从logistic分布是指X具有以下分布函数和密度函数:
式中,
是位置参数,
是形状参数
逻辑函数可视化:
假设函数:
代价函数:
当
时:
KaTeX parse error: \tag works only in display equations
当
时:
KaTeX parse error: \tag works only in display equations
其函数图像为:
从图中可以看出:
- ,当预测值
- 时,代价函数
- 的值为0,这是我们想要的(模型预测完全正确时,代价达到最小)。当预测值离1越远,其代价函数越大,这也是我们想要的
- 同理
- ,当预测值=0时,代价函数达到最小值;预测值离0越远,其代价函数越大。
代价函数推导过程(采用极大似然估计)
假设函数
表示预测结果为1的概率,则:
将公式6合并为一个公式:
取似然函数:
对数似然函数:
最大似然估计是取使得似然函数最大化的
,令损失函数
,则最大化的
即为最小化的
梯度下降法迭代公式:
矩阵形式:
推导如下:
带惩罚项的逻辑回归
重复直至收敛:
SoftMax函数
SoftMax函数是将各个类别的打分转化为合适的概率值的函数。
这个函数要满足以下几个条件:
- 打分越高概率越高
- 概率值
- 所有的类别的概率之和=1
SoftMax回归
假设
是单个样本的特征,
和
是SoftMax模型的参数。
SoftMax模型的第一步就是计算各个类别的logit: