利用逻辑回归模型判断用户提问意图

时间:2022-05-04
本文章向大家介绍利用逻辑回归模型判断用户提问意图,主要内容包括LR模型的原理、最大化目标函数的算法、LR处理多分类问题、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

在之前开发聊天机器人的文章里,我们讲解了如何使用在线工具LUIS (https://luis.ai) 开发Chat bot的自然语言理解模型。

在构造问题解决型机器人的前提之下,我们需要对用户用自然语言输入的问题进行意图判断和实体抽取。这两个功能是LUIS都可以做到的。

但如果不借助现成的工具,自己实现这两个功能,该如何做呢?今天,我们先来讲第一部分:意图识别

分类问题

意图识别的目的是判断用户发送给聊天机器人的语句表达了TA的何种意图(intent)。

因为是问题解决型机器人,所能够回答的问题有限,且在一个明确的范畴之内。

也就是说,问题解决型Chat bot仅仅接受有限种意图,此外所有其他语句,都被判定为无效,不做处理。

因此,它的意图识别,是这一个典型的分类问题,可以用分类模型来解决。

分类模型是机器学习中最常用的一类模型,常用的分类模型就有:Naïve Bayes,Logistic Regression,Decision Tree,SVM等。

逻辑回归模型

今天我们在这里介绍其中的逻辑回归Logistics Regression / LR)。它也是LUIS做意图识别时用到的模型

逻辑回归是一种简单、高效的常用分类模型。它典型的应用是二分类问题上,也就是说,把所有的数据只分为两个类。

当然,这并不是说LR不能处理多分类问题,它当然可以处理,具体方法稍后讲。我们先来看LR本身。

LR模型的原理

我们在之前的文章里,讲过模型的原理——模型可以被看做一个形式确定、参数值待定的函数。

LR对应的这个函数,我们记作:y=h(x)

其中自变量x是向量,物理意义是一系列特征,在bot LU的scenario之下,这些特征值就是用户问题经过VSM转换后得出的向量。

而最终计算出的因变量y,则是一个[0,1]区间之内的实数值。当y>0.5 时,x 被归类为阳性(Positive),否则当y <=0.5时,被归类为阴性(Negative)。

如果单纯看这个取值,是不是会有点担心,如果大量的输入得到的结果都在y=0.5附近,那岂不是很容易分错?说得极端一点,如果所有的输入数据得出的结果都在y=0.5附近,那岂不是没有什么分类意义了,和随机乱归类结果差不多?

这样的担心其实是不必要的,因为LR的模型对应公式是:

这个公式对应的分布是这样的:

发现没有,此函数在y=0.5附近非常敏感,自变量取值稍有不同,因变量取值就会有很大差异,所以不用担心出现大量因细微特征差异而被归错类的情况。

LR模型的目标函数

上述的h(x) 是我们要通过训练得出来的最终结果,但是在最开始的时候,我们是不知道其中的参数theta的,我们所有的只是若干的x和与其对应的y(训练集合)。

怎么通过训练数据中已知的x和y来求未知的theta呢?

首先要么要设定一个目标:我们希望这个最终得出的theta达到一个什么样的效果——我们当然是希望得出来的这个theta,能够让训练数据中被归为阳性的数据预测结果为阳,本来被分为阴性的预测结果为阴。

而从公式本身的角度来看,h(x)实际上是x为阳性的分布概率,所以,才会在h(x) > 0.5时将x归于阳性。

也就是说h(x) = P(y=1)。反之,样例是阴性的概率P(y=0) = 1 - h(x)。

当我们把测试数据带入其中的时候,P(y=1)和P(y=0)就都有了先决条件,它们为训练数据的x所限定。

因此:

P(y=1|x) = h(x) P(y=0|x) = 1- h(x)

根据二项分布公式,可得出:

P(y|x) = h(x) ^y*(1- h(x))^(1-y)

假设我们的训练集一共有m个数据,那么这m个数据的联合概率就是:

我们求取theta的结果,就是让这个L(theta)达到最大。上面这个函数就叫做LR的似然函数。为了好计算,我们对它求对数。得到对数似然函数:

我们要做的就是求出让l(theta) 能够得到最大值的theta。l(theta) 就是LR的目标函数。

最大化目标函数

目标函数是机器学习的核心。机器学习要做的最关键的事情就是将一个实际问题抽象为数学模型,将解决这个问题的方法抽象问一个能够以某种确定性手段(最大化、最小化)使其达到最优的目标函数。

在此,我们已经得到了LR的目标函数l(theta),并且优化目标是最大化它。为了获得l(theta)的最大值,我们要对它求导:

因为l(theta)为凸函数,因此当其导数函数为0时原函数达到最大值。所以,我们要求取的,就是上述公式为0时的theta,其中的y(i)和x(i)都是已知的。

最大化目标函数的算法

在上述目标函数的导函数中,如果求解theta呢?具体方法有很多,我们在此仅介绍最常见最基础的梯度下降算法。

我们已经知道l(theta)函数是有极值的,那么如何去找到这个极值呢?

我们可以试,即先找到这个函数上的一点p1,算出它的函数值,然后沿着该点导数方向前进一步,跨到p2点,再计算出p2点所对应的函数值,然后不断迭代,直到找到函数值收敛的点为止:

Set initial value: theta(0), alpha

while (not convergence)

{

}

其中,参数α叫学习率,就是每一步的步长。步长的大小很关键,如果步长过大,很可能会跨过极值点,总也无法达到收敛。

步长太小,则需要的迭代次数太多,训练速度过慢。可以尝试在早期的若干轮迭代中设置一个较大的步长,之后再缩小步长继续迭代。

具体判断收敛的方式可以是判断两次迭代之间的差值小于某个阈值ϵ(即比阈值小就停止)。

有时候,在实际应用中会强行规定一个迭代次数,到了这个次数无论收敛与否都先停止。具体推出迭代条件要按实际需要确定。

LR处理多分类问题

LR是用来做而分类的,我们的意图识别肯定不是只有两个意图啊,怎么能用LR?!

别急,LR一样可以做多分类,不过就是要做多次。

假设你一共有n个intent,也就是说可能的分类一共有n个。那么就构造n个LR分类模型,第一个模型用来区分intent_1non-intent_1(即所有不属于intent_1的都归属到一类),第二个模型用来区分intent_2non-intent_2,..., 第n个模型用来区分intent_nnon-intent_n

使用的时候,每一个输入数据都被这n个模型同时预测。最后哪个模型得出了positive结果,就是该数据最终的结果。

如果有多个模型都得出了positive,那也没有关系。因为LR是一个回归模型,它直接预测的输出不仅是一个标签,还包括该标签正确的概率。那么对比几个positive结果的概率,选最高的一个就是了。

例如:有一个数据,第一和第二个模型都给出了positive结果,不过intent_1模型的预测值是0.95,而intent_2的结果是0.78,那么当然是选高的,结果就是intent_1