您的位置:首页 > 大数据 > 人工智能

腾讯校招基础研究岗相关:请解释LR/logistic regression/对数几率回归/逻辑回归/逻辑斯蒂回归

2017-09-02 12:17 645 查看
据说每一个机器学习学习者都会写一篇有关自己对LR的理解文章,查了很多资料后,我今天就写一下我的LR。

本文的重点是:为什么要LR,为什么要用logistic函数,为什么要用对数几率,以及他们是怎么求出来的。

(我不喜欢公式,但是有的时候比文字更清楚,所以这篇文章里的公式要么就是可以忽略的,要么两个公式之间一定是可以2分钟内推出来的,也就是说是能很简单的理解“为什么从这个公式能变成这个”的)

一. 求对数几率(odds)的动机和求解

为了刻画y属于某个类的概率P(y),引入概率,但是常见的Probability受x和y的差异的影响很大



首先为了避免过大过小值带来的影响,不用probability描述事件发生的可能性,而用对数几率(odds)这是个值为线性的函数

这就是对数几率:



求这个的话,由贝叶斯:



得到:



在数据量够大的情况下,x的分布由大数定理可逼近高斯分布

所以引入一个对于某一个y,x符合正态分布的性质



因此P(y|x)符合正态分布,所以P(x|y)是高斯的,则上式等于:

 


因为σ1,σ0实际上对应y=1和y=0时对应的x的方差,所以假设这两个情况下x的方差相等
即σ1=σ0,二次项会抵消,我们得到一个简单的线性关系:



上式等价于“P服从sigmoid这一命题”

转换一下可以得到:



 就获得了sigmoid函数

本节总结:

在x服从高斯分布而且在不同的y下方差相等的时候,y的概率服从Sigmoid函数。

而且这个Sigmoid函数中θ的值是个常数,等于y的Odds除以x

Sigmoid函数=Logistic函数

Logistics函数的作用

1.把数据做缩放,对于很大或者很小的x,都可以缩放到跟y的概率是线性的情况中,可以避免野点带来的巨大影响

2.方便求导和求log

3.方便求odds,因为会让odds等于x的线性式

4.表征P(y)的概率分布符合高斯性

二. 求二分类的最大似然函数的动机和求解

求二分类通用的log-loss函数(只要带入任意y=g(x)函数就可以求出对应log-loss函数)(也就是伯努利的二项分布的概率函数)

然后,对于二分类问题,假设y=g(x),有:
①P(y=1|x)=g(x)
②P(y=0|x)=1-g(x)
其最大似然函数:



 

【因为y要么就是0要么就是1,所以这样的写法是1和2两条式子的简写,所以称为二分类通用】

然后就对③这条式子求log,获得:



 于是求-l(θ)的最小值就可以求得L(θ)的最大值。

也就是说,-l(θ)+正则项就是loss

然后,可以把g(x)=logistic函数带进去求解,求最小值

本节总结:

知道y服从Sigmoid函数后,又因为y是只有0和1两个值的二项分布,所以就可以求出其log-loss函数,对其求导可以获得最小值

三. 浅谈如何求解最小值,也就是说优化方法

最简单的方法:
批量梯度下降法(Batch
Gradient Descent)



要求θ的最小值,可以求出θ的导数,然后乘上一个长度α,表示在图中的沿导数方向前进多少,然后:
下一个θ=上一个θ-αΔθ
这样就可以获得下一个θ
公式为:



每给出一个样本就更新一次的,可以在线训练的方法:
随机梯度下降法(Stochastic Gradient Descent / SGD)



红线表示每一次所更新的新的θ,可以看到经过很多很多曲折的迭代,终于,θ到了一个很优化的位置

其式子为:



一次只用一个样本点,对于每个样本求它的梯度,然后乘以α来更新θ
优点:可以随机选择样本降低波动,一次只用一个样本点,可以在线学习
缺点:对于损失方程有比较严重的振荡,并且容易收敛到局部最小值,适用于精度要求不高的任务

算法为:

{

对数据集中每个样本

计算该样本的梯度

使用alpha乘梯度来更新回归系数

 }

 

最新锐的在线学习方法,SGD的魔改版:
FTRL

一个SGD这样的在线训练算法的魔改版,可以产生稀疏解(降低模型体积)并保持很好的精度【并因为每个维度单独更哦学习率,能很好地利用每个样本】
业内常用LR(Logistic Regression)和FM(Factorization Machines)为点击率预估建模。对LR、FM这类模型的参数学习,传统的学习算法是batch learning算法,它无法有效地处理大规模的数据集,也无法有效地处理大规模的在线数据流。这时,有效且高效的online learning算法显得尤为重要。



FTRL是对w每一维分开训练更新的,每一维使用的是不同的学习速率,也是上面代码中lamda2之前的那一项。与w所有特征维度使用统一的学习速率相比,这种方法考虑了训练样本本身在不同特征上分布的不均匀性,如果包含w某一个维度特征的训练样本很少,每一个样本都很珍贵,那么该特征维度对应的训练速率可以独自保持比较大的值,每来一个包含该特征的样本,就可以在该样本的梯度上前进一大步,而不需要与其他特征维度的前进步调强行保持一致。

比较快的方法:牛顿法
牛顿法指出,求使f(θ)=0的θ,只需要一开始先固定一个θ,比如说θ=0,然后输入其他值使得

θ(t+1)= θt-Δθt

其中一维的情况,Δθ=f '(θt)/f(θt)(多维的情况,Δθ 前面要乘以个hassin矩阵的逆)

所以现在要求使得-l(θ)=0的θ,也就是让loss等于0 ,那么就令 f(θ)= -l(θ),带入公式进行求解即可

牛顿法是二阶收敛,而梯度下降则为一阶收敛,所以牛顿法更快。
简单来说,梯度下降是从所处位置选择一个坡度最大的方向走一步,而牛顿法则在选择方向时,不仅考虑坡度,还会考虑坡度的坡度,也就是下一步的坡度是否会变得更大。
几何上来说,牛顿法是用一个二次曲面去拟合当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面

其局限主要在于

1.矩阵的逆计算复杂度为n的立方,当规模很大时,计算量超大,通常改良做法是采用拟牛顿法如BFGS,L-BFGS等

2.如果初始值离局部极小值太远,Taylor展开并不能对原函数进行良好的近似

从物理学收到的启发:

动量法(Momentum)

为了克服SGD振荡比较严重的问题,Momentum将物理中的动量概念引入到SGD当中,通过积累之前的动量来替代梯度。即:

在更新量中,加入“上一次的变化量v(t-1)×衰减参数gamma”





相较于SGD,Momentum就相当于在从山坡上不停的向下走,带有加速度的效果,当没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。也就是说,在训练的时候,在梯度方向不变的维度上,训练速度变快,梯度方向有所改变的维度上,更新速度变慢,这样就可以加快收敛并减小振荡。

一开始大步迈进,后面小心挪动
Adagrad
相较于SGD,Adagrad相当于对学习率多加了一个约束,即:



Adagrad的优点是,在训练初期,由于gt较小,所以约束项能够加速训练。而在后期,随着gt的变大,会导致分母不断变大,最终训练提前结束。

最好用的非在线算法,各种批量下降的魔改版:
Adam

Adam是一个结合了Momentum与Adagrad的产物,它既考虑到了利用加速度来加速训练过程,又考虑到对于学习率的约束。利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。其公式为:



其中:



(这里不解释这些公式,如果理解不了Adam的话请从批量梯度下降到这块看一遍,一脉相承的,一定能理解的)

本节总结

在线学习方法比如SGD,FTRL经常用于在线LR系统的训练,具有很好的效果。

而虽然深度学习跟LR不是一样的东西,但是也要求解某一个误差的最优值,这个时候一般用Adam

通过实践证明,Adam结合了Adagrad善于处理稀疏梯度和Momentum善于处理非平稳目标的优点,相较于其他几种优化器效果更好。同时,我们也注意到很多论文中都会引用SGD,Adagrad作为优化函数。但相较于其他方法,在实践中,SGD需要更多的训练时间以及可能会被困到鞍点的缺点,都制约了它在很多真实数据上的表现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐