jionlp数据分析

V1

2022/11/03阅读:22主题:默认主题

逻辑回归,超详细版

前言

想要讨论清楚NLP和神经网络,实在绕不开逻辑回归(Logistic Regression),因为这个模型实在太过经典,又是其它算法和模型的基础,所以需要花时间将该算法详详细细、里里外外讲清楚。

本文的行文叙述将会尽量减少抽象、空洞的大段公式,目标是要让非机器学习从业人员也能明白该算法的工作原理,同时让已经了解熟悉该算法的朋友也能返回头来,再次咀嚼出新的滋味

虽然标题很古板,但是这里立一个 flag,我相信这是你看到的最深入浅出的一篇逻辑回归教程,比知乎上的文章都要简明清晰。

从选女朋友说起

老友记第二季里有一集,Ross 事先找了 Julie 做女朋友,然后回头发现 Rachel 也对自己心有所属,然后他就 emo 了,不知道该选谁做女票。这时 Chandler 给他建议,既然不知道该如何选,那么就两人打PK,列一个表格,分别列出来两个女人的优缺点,逐一比较,然后 all the work is to do the math。

rachel and julie
rachel and julie

然后 Chandler 就列了几个项目,大概就是颜值、工作、性格

Ross 就开始比较了,每一项满分1分,最低分 0 分。颜值方面,Rachel 当然是非常漂亮,不过 Julie 也并不差多少,打 0.7 分;工作上,Julie 是古生物学家,高校工作,非常体面,还有共同语言,而 Rachel 则只是一个咖啡厅端咖啡的服务员,还经常把咖啡端错,打 0.4 分吧;性格上,两个人脾气都不错,只不过 Rachel 稍微有点大小姐脾气,骄纵了一些,打 0.8 分吧。可以归结为如下表格:

最后可以计算得到一个总分,Julie 是 2.7 分,Rachel 是 2.2 分。从直观上来讲,Julie 胜出,Ross 应该选择 Julie 了。

但是有的人就讲了,剧情里 Ross 最终还是选择了 Rachel,毕竟她比较漂亮,Ross 这种男人一看见就女孩漂亮就失去了大脑,至于工作、性格、家庭之类的,一概就不关心了。

这里就涉及到了权重的概念,上述计算方法中,我们将 颜值、工作、性格 三项看得同等重要。但是对于 Ross 这种男人,颜值最重要,其它的重要性很低。那么又可以有如下计算结果:

结果,Rachel 得分为

反超了 Julie 的得分

Ross 这时可以选择 Rachel 了。

虽然为两个女孩打了分,相对来讲,Rachel 要比 Julie 好,但是依然有一个问题存在,那就是,这两个人之间到底存在多大的差距

Rachel 的得分 1.12,Julie的得分 0.9,是否可以说在 Ross 眼里,Rachel 比 Julie 强

也许,在 Ross 的眼里,Rachel 永远是 Rachel,是其她任何人都替代不了的,她比 Julie 要强很多很多倍,这不是颜值所能决定的,也不是任何其它可以具象的因素决定的,而是由某种她自身的特质决定的,这就是该死的说不清的爱情。

我们可以为两个女孩各加一个固定的偏置值,比如 ,那么Rachel 的最终得分是

Julie 的最终得分是

大概,从这个结果来看,我们可以隐约感觉到,Rachel 在 Ross 心里,是比 Julie 要好很多很多的。这一个偏置值,使得 Rachel 和 Julie 之间的差距拉大了。

但是我们可以讲,Rachel 比 Julie 强 倍吗?

Ross 挑选女朋友的时候,只设置了颜值、工作、性格三个选项。可事实上,挑选女朋友的选项条件可是太多了,学历、家庭情况、经济状况、有无吸烟史、有无犯罪史、有无偷盗、祖上是否贵族、八字是否不合、是否秃头、做饭是否放太多盐、是否话太多太爱唠叨等等,这种选项条件甚至可以列出来一万条。如果这样计算的话,两个人的计算取值可能随着选项的增多而越来越大,到最后,可能 Rachel 得分 ,Julie 得分

也就是说,两人的得分值是没有一个固定区间的,大概就是 这么大的范围。这样的情况,到底要如何比较两者之间的差距呢?

其实我们应该可以想到,应当将两个人的比较值放在同一个范围内来计算,比如,就像为每一个单项设定满分1分、最低0分一样,将总分也局限在 分之间。

sigmoid 函数

由上可知,我们需要设计一个函数,它的输入就是一个上述的计算得分值,这个值可正可负,例如,Julie 有犯罪记录,则可以给她记录 分,取值范围也就是 ,而输出则需要限制在 之间。这个范围,很明显,是可以当作一个概率值看待的,因为概率值就介于 之间。

当然了,我们设计函数时也不是胡乱设计,应当满足既简单、又好用的原则。

  • 1、应当是单调函数
  • 2、应当是初等函数,方便求导(可梯度下降)
  • 3、最好形式上满足一些对称性

恰好,此时就有一个这样的函数,名叫 sigmoid。其表达式为:

这个函数图像看着就很对称,也很优雅,其导数为

换句话说,sigmoid函数的导数值,仅仅依靠该函数值本身的四则运算就可以计算得到,计算可谓是非常简便。

逻辑回归名字由来: 逻辑回归的英文名字是 Logistic Regression,这里的逻辑实际上只是一个音译。更准确的名称应该是逻辑斯蒂回归。所谓 Logistic,指的是以下函数族

很明显,它是 sigmoid 函数的一般化式子,sigmoid 函数是 Logistic 函数的一个特例。所以,逻辑回归改名为 sigmoid回归也未尝不可。

当然,其实只要是满足单调、可导的函数都是完全可以的,这样的函数有一大把:

只不过,sigmoid 函数是最简单的一个,求导也是目前发现的最简单的一个。如上图中的函数,大多形式复杂丑陋,难于记忆,最关键的是,求导也不方便,因此也就被人们放弃了。

接着用 sigmoid 函数计算 Ross 的两个女朋友候选人,Julie 的最终取值

Rachel 的最终取值:

由此,我们可以说,根据上述的打分,Rachel 比 Julie 好 。调节偏置值,我们可以得到不同的 Rachel 比 Julie 好的程度值。

同时也可以认为,这个取值是一个概率值,Rachel 适合做女朋友的概率要大于Julie。

逻辑回归模型的抽象

所谓逻辑回归模型,就是给定一些样本数据作为输入,为这些样本分配恰当的输出。例如,根据之前一年的经济数据预测第二年的经济是增长还是衰退;根据果树林中的春夏病虫害数量推测秋天是丰收还是歉收。这些都可以利用逻辑回归模型完成。

同样的,根据Ross 的打分,来判断女孩是否适合做女朋友,也是其中一种应用。

从上述选择女朋友的例子可以看出,我们可以将颜值、工作、性格等因素看作一个向量 ,而最终的输出的是否适合做女朋友的值为 ,权重值是 ,偏置值为 , 可以得到如下建模公式:

上述 Julie 可以看作是一个输入样本1, Rachel 是输入样本2。我们是在样本1和样本2之间做比较。

然而在一般逻辑回归模型中,我们往往只针对一个样本本身做是、否的决策,而并不将多个样本之间做比较,也就是,逻辑回归一般意义上只做二分类任务。这不难办到,可以将问题转化为:

输入:样本 Julie,输出:不适合做女朋友

输入:样本 Rachel,输出:适合做女朋友

这样就有了两个独立的样本,样本的类型总共就两个:适合,不适合。根据之前的计算结果,Rachel 适合做女朋友的概率是 0.567,Julie 的概率是0.512,而最终真正的输出只有两个值,适合、不适合,这是一个二分类问题。

所以,还应当有一个函数,它的输入是 之间的实数,也就是上述所谓的概率值,输出只有两个值,按照方便,可以规定输出只有 0 和 1 两个值。。可做如下规定:

一般形式,我们规定 为最终的二分类标签,正样本为1,负样本为0, 为输入的样本数据,则

接下来,我们就可以比对 Rachel 适合做女朋友的概率 0.567,和她不适合的概率 进行比对了。 可以发现,最终的比较阈值是 0.5。大于 0.5 代表 Rachel 更加适合做女朋友,小于 0.5 代表更加不适合。

可是 Julie 的计算得分是 0.512,此时按道理讲,Julie 也应当被划分到更加适合做女朋友那一类里。这就和标注的样本相违背,和剧情发展不同,是错误的。那么有两种解决办法

办法1:调整这个 0.5 的阈值,改成 0.55,这样 Julie 的分值低于 0.55,就可以被划归到不适合做女朋友这一类中。(这种方法随后再详细补充介绍)

办法2:权重 和 偏置值 在 Ross 打完分之后其实都可以可以进行调节的,我们可以调节这些值,从而使 Julie 的得分低于 0.5。这个过程就是逻辑回归模型的训练。

逻辑回归的训练

所谓模型训练,就是将样本输入 x 和输出二分类标签 y 当作固定不变的定值,去调节 ,使得样本的输入和输出相匹配。

放在上述的例子中,就是 Ross 已经为两人打好了分,我们需要有一个模型,为两人是否适合做女朋友给出正确的判断。我们需要调节权重,将 Julie 也划归为不适合做女朋友这一类。

讲到模型训练,很多博客会直接抛出一长串损失函数和求导过程,告诉读者,模型训练核心就是损失函数求导,然后结束。

虽然结论是对的,但事实上,这种文章依然没有直观地向读者展现,为什么列出求导公式就等同于模型训练。因此,我将根据例子详细阐述这个过程是如何而来的。

逻辑回归的损失函数

根据前例,我们知道一个样本最终的计算值在 之间浮动,可以被视作概率值。并且由于sigmoid函数的单调性,我们可以认为,概率值越接近1,说明样本越接近正样本,评价质量越好,例如 Rachel 的得分是 0.567,这个值是不够高的,如果 Rachel 的得分是 0.99,就意味着在 Ross 心里,她几乎接近 100% 是理想的女朋友人选。反之,一个得分 0.05 的候选人一定比一个得分 0.3 的候选人更加不适合做女朋友。一个得分为 0 的候选人,其含义基本等同于,哪怕世界上只剩这一个女人,Ross 都不会碰她。

模型训练过程,就是使 Rachel 的计算概率值从 0.567 更加接近 1。而 Julie 的值从 0.512 更加接近 0。

因此,我们可以构造一个似然函数,它衡量了计算得分值和真实样本标签之间的差距:

这里的 指的是就是从 Ross 为两人打完分之后,到计算得到概率值的过程,y的取值范围就两个值,

由于我们的样本不止一个,很有可能,Ross 有无数个备胎,假设为 ,那么似然函数就应当照顾到所有的样本,可以定义成

再考虑到该函数的连乘,也未对样本的数量做归一化,应当转换成

这样就得到了一个方便求导的损失函数。它的含义是指,如果样本的计算值越接近它的标签值,0或1,那么损失函数值就越小,模型和数据匹配度就越好

损失函数和似然函数的区别: 损失函数指的是机器学习模型训练阶段,用来衡量模型预测错误程度的函数,这个错误值越小越好。 似然函数指的是比较两个概率分布,其中一个是真实分布,另一个是抽样数据,两者最好是越接近越好。最大似然就是此意。

训练过程

依然通过举例的方式来阐述这个训练过程。

Julie 的三项指标打分为 ,目前对应的权重为 根据公式计算得到的结果为 0.512,这个值大于 0.5,按理来讲,我们应该调节 两块参数,使得 Julie 最终计算得到的值低于 0.5,也就是让 Julie 的计算概率结果从 0.512逐渐变小,尽量向 0 靠近。

根据 sigmoid 函数的单调递增性,如果希望 sigmoid 的输出值变小,那么 sigmoid 函数的输入,也应当变小。即

这个值也应当变小,越接近负无穷大越好。

此时,构成 0.05 这个值由三个权重和偏置值影响。我们单拎出来工作这个因素来考量,工作当前的权重为 0.1。

这个多项式函数也是随着工作的权重单调递增的,此时,假设我将工作的权重从 0.1 调整为 0,则可以得到

由此可以发现,减少工作的权重,确实可以使得 Julie 的计算结果降低,向 0 靠近一些,相应的损失函数值也降低了。

实际上,判断该增加还是减少 的关键因素,就是这两个函数(sigmoid函数、多项式函数)的导数。遵循着函数的导数方向,就可以朝着预期的方向迈进

目前,我们将工作权重从 0.1 调整到了 0。只要我们针对每一个样本、每一个权重和偏置,重复上述这个步骤,就可以使得 Julie 的取值一步一步越来越接近0,同样的 Rachel 的值越来越接近1。这个过程就是模型的训练。

可以发现,模型训练是一个复合函数的求导过程,利用损失函数,先对 sigmoid 求导,再对多项式函数求导,即可得到权重的变化值。将权重向应变的方向增大或者减小,即可实现模型的训练。

由此,我们可以根据上述的损失函数对权重 ,以及偏置 求导。由于前面已经阐述了 sigmoid 的求导过程,此外,一次多项式的求导也非常简单,以参数 为例,求导结果就是:

其中, 指的是当前的样本, 指的是样本中的第 个元素。

此时,梯度就得到了,如果这条是 Julie 的样本,我们希望它尽量向 0 靠拢,则应当将该权重逐渐减小。如果是 Rachel 这条样本,则应当向 1 靠拢,权重应当逐渐增大。也就是,权重的变化方向是由样本的标签决定的。

任何复杂神经网络的参数训练都完全脱胎于逻辑回归的这种复合函数求导,本质上都是一回事。

模型的过拟合

在这里例子里,我们有 4个参数,分别是颜值、工作、性格、偏置值,而样本数有两个,分别是 Rachel 和 Julie。现在假设,我们已经完成了模型的训练,Rachel 的取值为接近 0.9999,Julie 的取值接近 0.0001,那么,相应的 sigmoid 的输入值分别是 。因为

此时可以列出两个多项式方程:

实际上我们的模型训练过程就是在求解一个最优的上述方程组的解。4个未知数,2个方程,那么其解一定是有无数组

这无数组解,到底哪个才是最优的?

我找到了两组解,一组解是:

另一组解是:

这两组解分别有一些统计意义上的特点,第一组解取值普遍比较大,绝对值都大于100,第二组解取值普遍都比较小,换句话讲,第一组解的取值方差比较大,第二组解的取值方差比较小

继续观察这两组参数,可以发现, ,也就是颜值这个选项,是对 Rachel 十分有利的,可以让她的最终得分更高;而 这个参数,也就是性格 这个选项,原本是对 Julie 最有利,可以让她得分更高,却被赋予了一个很大的负值,使得性格越好的女生,被选择的概率越低。

当然,有可能 Ross 就是一个受虐狂,女生越骄纵,越不礼貌,他反而越喜欢,有种 SM 倾向;也有可能,由于 Rachel 的独特性,使 Ross 忽略了性格 的重要性。总而言之,Ross 被眼前的两个女人蒙住了双眼,看不到世界上还有千千万万的女人。

假使 Ross 又有了一个新的候选女友 Lucy(第三个样本),Lucy 其貌不扬,但是知性温柔,善解人意,好巧不巧,Ross 一见钟情,感觉 Lucy 比 Rachel 还要好。

第三个样本: 输入:Lucy:颜值 0.2,工作 0.8,性格 1.0;输出:适合做女朋友。

此时,我们希望训练得到的模型依然能够适应 Lucy 并得到合理的结果。

针对 Lucy,上述模型的权重就显得有点矛盾了:利用第一组参数,可知 Lucy 的得分是

这是一个极度低的值,意味着 Lucy 极其不适合做女朋友。

而利用第二组参数可知 Lucy 的得分是

此时可以发现,虽然第二组参数依然把 Lucy 判定为不适合做女朋友这一类,但是这组值表面要比第一组值相对靠谱一些,或者说错得不那么离谱。

对某些样本极其有利的权重值(颜值之于 Rachel),可能会对另外的样本(颜值之于 Lucy)产生很大的矛盾。这个权重值越大,矛盾感越大。

其根本原因,就在于,权重值的绝对值过高,会对某些样本产生极强的负作用力,这个极强的副作用力就叫做模型的过拟合

很明显,我们防止过拟合很重要的一个手段,就是希望权重值的绝对值尽量维持在一个均值为0,方差较小的范围之内。这个值越趋近于 0,就说明这个权重对应的参数,影响力越小,对另外其它的样本可能产生的负作用力就越小,避免了错得很离谱。

模型参数的正则化

为了在模型训练过程当中,尽量获得比较小的权重值和偏置值,同样可以从损失函数入手。

可以为原先的损失函数值上添加一个控制权重的多项式。这个多项式应当满足,如果权重的绝对值越大,损失函数值就越大,如果权重的绝对值能够逐渐趋近于 0,说明模型抗过拟合效果好,损失函数值也应当变小

一般有两种控制权重值的方法。

L1 正则化

损失函数形式为

其中, 指的是所有的样本集的输入,包含了 Rachel、Julie、Lucy 等等。 则是一个控制权重值的参数,它是必然大于 0 的实数值。这种控制权重值的方式是最直观的。

L2 正则化

损失函数形式为

在这种形式中,是对每一个参数都求了平方,同样满足权重值越小,损失函数值越小的准则。

总结

还没写完,如果觉得好,可以关注一下JioNLP。也可以wx搜索JioNLP。有关注我才有动力更新。

分类:

人工智能

标签:

机器学习

作者介绍

jionlp数据分析
V1

jionlp开源作者,数据分析专家