逻辑回归作为最基础、最简单的模型,在工业界应用非常广泛。LR本身具有极强的鲁棒性和非常简单的计算方式,以至于我们不需要了解很多“为什么”就可以得到一个不错的结果。
本着什么都略懂一些,生活更精彩一点的原则,大概用几个Q&A的形式(这也是从最近看的《百面机器学习》里面学来的)来记录一些关于LR的小知识。
1. “逻辑回归”为什么要叫回归?
1.1 历史问题
逻辑回归是个分类模型,之所以叫这个名字是因为最早提出LR是在一篇叫《xxxx回归分析》的文章里,后面就沿用了这个名字。
1.2 “回归”概率
这个解释往往不是那么令人性福,那么下面这个说法会更好一些,如果我们把一个分类问题,看作是对一次实验出现“1”概率的预估问题,用一个什么函数去拟合这个,也就是(事实上,分类问题一般也都是这么做的),那我们的问题其实也就变成了“回归一个函数”。
1.3 LR的由来
所以LR是这样设计的,训练一个函数,来拟合“出现1的概率”。在普通问题中我们会考虑回归目标的值域,然后选择一个合适的激活函数作为上面的,但是站在设计LR的历史角度上来说,可能还没有激活函数的概念。那就选最简单的线性函数:
直接拟合是不现实的,这时候就需要把做个映射,变成一个值域和匹配的值,也即。反正,找到一个:
概率学上将称为出现1的“几率”,叫做“对数几率”,用去拟合则有:
做个简单的变换,把放到等号一边,变成一个end2end的标准问题:
其实也就是我们的学习目标,写成这样是不是就很眼熟。
所以对于逻辑回归,一言以蔽之就是:
逻辑回归是对实验成功对数几率的线性拟合
2. LR的损失函数是啥?
2.1 损失函数推导
按照上述的理论,LR直接输出的就是一个概率值,很自然的,对于样本(也就是所谓的训练集)可以做最大似然做参数的估计
注意到,表达的是的概率,那么对于的样本,需要写成,所以最大似然估计写成的loss应该是
进一步,取个对数
2.2 收敛性
关于损失函数的最大似然推导显得非常顺畅,但是经验告诉我们,损失函数并不是写出来就可以的,loss最大的作用是在于利用梯度来寻优,最终完成模型参数的训练。因此,一个loss能否求得最优解就最需要考虑的问题。
不出意外地,书上都会告诉我们,这个loss(也就是分类问题中的交叉熵损失),是满足KKT条件的,也就是说整个求解问题是个凸问题,进而告诉我们有全局最优解。相应的基于最小二乘的MSE在这个问题上,是不满足KKT条件的,所以这个最自然的结果也就是最好的结果——这往往是符合体感的,人类劳动中总结出来的经验总是被科学证实,但仍然对所谓的KKT条件认识不是很清晰,下面我们可以用一种比较土的方式感受一下凸命题。基于交叉熵和均方误差的loss都写在下面:
话不多说,对loss求导,公式里面全是sigmoid函数,因此可以先把sigmoid函数的导数写出来,后面会简洁一些
好了下面开始求导,这里把sigmoid函数称为
对于交叉熵损失,有:
而对于平均平方损失有:
用二阶导数来理解,交叉熵的二阶导数符号确定,因此是个凸的;
用MSE求出来的导数符号不确定,存在多个极值点,所以非凸。
2.3 MSE vs. CrossEntropy
交叉熵在分类中是一个非常好用的损失,同时MSE又是一个哪里都能用的万金油损失,在工具非常发达的情况下尤其是tf/torch这种傻瓜式框架的普及,loss的选择有时候就成了一种超参数,并行跑个实验靠数据说话即可。
但损失函数具体表现区别的原因究竟是为什么,我们从梯度反向传播的角度来说一说——说白了,还是求导。假设输出(在nn里也就是激活函数)还是一个sigmoid,写成这样
在一次backpropagation中,得到对参数和的梯度(也就是偏导)如下:
bias的偏导直接跟误差线性相关了
但是MSE的偏导是这样的
注意到,是很容易饱和的,也就是说上述的非常容易为0,这个时候,反向传播的梯度就消失了。
所以,通常会有这种结论,如果sigmoid激活的分类问题,一般用交叉熵的效率会比MSE高。
2.4 MSE是怎么来的?
在损失函数领域,最小二乘和极大似然可以说是各领半壁江山。
- 极大似然很好理解,就是把每个样本当成是独立事件,计算各个样本的联合概率,通过优化概率训练参数。
- 最小二乘看起来也很好理解,直接把样本的误差求导,但是由于范数在原点不可导,所以变成了可导的二次函数。
那对于最小二乘,有没有其他的解释呢,其实是有的:最小二乘其实仍然是基于极大似然的推导。
对于一个学习任务,,我们认为是对真实值的拟合/估计,为误差。最小二乘一个基础的假设是误差符合均值为0的正态分布,也就是说:
根据误差的概率密度函数,也可以构造一个极大似然函数
注意到
其极大似然写成:
关于是单调的,优化跟的结果是一样的——至此,得到了最小二乘从最大似然的推导。
小结
以上是一点关于LR最基础用法的来由和相关的一点分析,换成神经网络里面的术语,无外乎“激活函数”和“损失函数”。
内容不多,但是里面很多东西也是理解了很长时间才想明白个大概,包括在写这些公式的过程中,也会陷入一些自己都不知道怎么解释的窘境,也是翻阅了不少材料,其中大神刘建平Pinard的博客真的是获益匪浅,深入浅出言简意赅,每一篇都值得读一读。
关于LR还有很多有意思的应用,也正是这些工业化的改造才使得这么一个简单的函数在这个深度学习满天飞的年代依然是某些大公司的首选,留着日后再说。