作者 | 梁唐
大家好,我是梁唐。
今天来和大家聊聊一个上古模型——LR。
关于LR模型,之前其实写过不少文章了,剖析过原理,也做过公式推导。今天这篇文章主要来聊聊LR模型应用相关的一些理解。
王喆大佬在《深度学习推荐系统》一书当中对于LR(逻辑回归)模型的评价非常高,说它曾经在相当长的一段时间里是推荐系统、计算机广告业界的主要选择之一。
不仅如此,就我了解到,即使是现在2021年了,国内依然有不少公司还在用LR。所以LR模型虽然简单,但是围绕着它的讨论点却很多,有非常多值得我们讨论和思考的地方。
LR的长处
如果在面试的时候面试官问你,说说LR模型有哪些优点。估计稍微了解一点的同学都能侃侃而谈上不少。像是什么实现简单、模型运行效率高、可解释性强云云,但如果仔细问题,为什么运行效率高,为什么可解释性强,这些优势究竟有什么作用?估计能答上来的要少不少。
我们从原理出发,一条一条来说。
运行效率高
一般来说,线性模型的运行效率都不低。但LR依然可以说是线性模型当中效率最高的几个模型之一,可能只有线性回归模型比它更快。我们来看下LR的公式:
写成向量形式就是:
对于多条样本来说,我们想要预测它们的结果,只需要做一次矩阵乘法,然后再过一下sigmoid
函数即可。矩阵相乘的操作是可以并行计算的,因此程序运行的效率是非常非常高的。
可解释性强
LR模型可以简单理解成各个特征的加权和,然后再过一层sigmoid函数,sigmoid函数的取值范围刚好是0到1,也符合我们对于CTR的直观认识。
另外sigmoid函数是一个单调递增函数,也就是说它的结果和特征以及特征权重之间是正相关的。不同的特征重要程度不一样,也就意味着对于结果的影响程度不一样。权重越大往往说明特征越重要,对于结果的影响也越大。
如此一来,模型的可解释性就很强,我们只需要看一眼特征权重的分布,就能知道什么特征比较重要,什么特征影响很小。在模型出了偏差的时候,我们也很容易溯源,找出导致问题的原因。
易于特征工程
我们知道LR模型的输入是一个各个维度的特征向量,输出的结果是这个向量加权之后经过sigmoid函数的值。很容易想到,如果我们输入的特征全为0或者1,那么得到的结果其实就是权重的求和结果。
01特征也叫one-hot特征或者是sparse特征,一般长度短的做one-hot长度较长的做sparse。简单解释一下,比如说我们现在要对类目id做one-hot,类目一共有100种,当前的类目id是10。那么做完one-hot之后,将会得到一个长度为100的向量, 它的第10位为1,其余全为0。
显然这样的方式会比较浪费空间,因为大部分都为0,只有极少维度为1。所以我们可以没必要存储整个01的向量,就记录为1的维度即可,这样可以节省大量的空间。这种01向量的表达方式称为sparse类型,也就是稀疏类型。
在推荐领域,我们通常会倾向于使用one-hot和sparse特征。因为这样可以消除数值带来的偏差,举个例子,比如说我们要用物品的价格作为特征。那么就有一个问题,物品的价格分布是非常不均匀的,便宜的物品可能只有1块钱,而贵的物品可能好几万。如果我们直接用价格作为特征,这些特别贵的物品显然会对权重产生极大的影响,这样的偏差会对模型的结果产生巨大的噪声。
为了消除这样的噪声,比较好的做法是根据价格分段。比如0-100分为一段,100-200为一段,200-100为一段……分段之后,价格这个取值范围极大,并且为浮点型的特征就被转化成了一个01组成的one-hot特征。这样不论价格高低,对于模型参数的影响都是一样的。
还有一个原因是一些特征不适合作为浮点型(dense)特征,比如说时间。有一个行为发生在5点,有一个行为发生在10点,如果我们直接拿时间作为特征的话。因为共享权重,所以10点这个值的影响是5点的两倍。但是我们知道,时间和时间之间是没有倍数关系的。10点和5点表示的是两个不同的时间而已,本身并没有数学上的任何关联。
在推荐领域,我们常常会生成一些交叉特征使用。比如用户性别和物品类别的交叉,用户标签和物品标签的交叉。所谓的交叉特征,其实就是类别和类别的特征做笛卡尔积。比如说用户的某个特征有01两个取值,而物品的某个特征有[012] 三种取值,交叉之后的结果就是2 x 3 = 6种取值。
通过特征交叉,我们可以生成一些更高信息维度的特征,进一步提升模型的能力。一般做交叉的都是one-hot和sparse类型的特征,交叉之后的结果也同样为one-hot或sparse类型。前面也介绍过,LR模型非常适合使用one-hot以及sparse类型的特征。所以两者相得益彰,给了LR模型继续更新的动力。
在GPU没有流行之前,很多公司的算法工程师的主要工作就是人工生成一些交叉特征喂给LR模型,以希望模型能够学到更多高维的信息,提升效果。在有着大量人工生成的特征的加持下,LR模型的效果还算可以。也正因此,给LR模型续命了很久,直到深度神经网络兴起之后,才逐渐被淘汰。
易于分布式训练
早年在GPU流行之前,计算资源是非常宝贵的。在大数据场景下,每天动辄TB的数据。在这个量级下,模型的训练开销和服务开销都是非常可观的。唯一可行的办法就是分布式多机训练,利用多台机器并行训练提升训练速度。
我们知道,LR模型的参数非常简单,就是一维的权重向量,所以它非常适合做分布式的训练以及部署。而很多其他的模型比如GBDT、Adaboost等,由于模型结构的限制,导致了无法并行训练。而one-hot、sparse特征为主的特征集导致了随机森林等树模型很难拥有良好的效果。所以在这种场景下,使用LR并不是一个糟糕的选择。
简单讲一下分布式训练的原理,首先选择一台机器作为主节点,其余的机器作为副节点。每个节点在训练的时候不会直接更新,而是会将得到的梯度传给主节点。主节点在拿到所有副节点传来的梯度之后求平均,再返回给副节点。副节点得到主节点传回的梯度之后更新参数,这样可以保证每一个节点的模型的参数都是一样的。
LR的劣势
很有意思的一点是,很多时候长处和短处其实是一体两面。
一个明显的优点,反过来理解也是它的缺点。比如说模型结构简单,可解释性强是LR的优点。但反过来理解,也是一个短板。毕竟模型节点会导致模型的拟合能力不够,很难学习到一些高阶的信息,非常依赖特征工程。
我们知道特征工程是非常依赖人力的,需要做大量的数据处理,以及进行大量的实现才能取得一点点提升。因此LR的部署和搭建都非常简单,但想要进一步作出效果得到提升则很难。越往后边际效应越明显。在神经网络兴起之后,多层神经网络强大的表达能力很快就秒杀了LR。没几年的时间,几乎已经看不到LR的踪迹了。
不过在一些要求强可解释性特殊场景下,LR模型依然没有完全淘汰。比如金融、风控等场景,这些场景不求模型效果有多好,但求尽量少地出问题,以及出了问题之后能够找到原因解释,这一点神经网络模型就无法办到。
对于算法学习者或者是推荐领域的从业者来说,是LR模型入手是一个非常好的选择。因为很多时候有了对比才有感悟,再说了,只有工程师的水平高低,没有模型本身的高下之分。