逻辑回归 logistics regression 公式推导

逻辑回归 logistics regression 公式推导

原创,转载请注明出处。

(常规字母代表标量,粗体字母代表向量,大写粗体字母代表矩阵)


逻辑回归虽然名字里面有回归,但是主要用来解决分类问题。


一、线性回归(Linear Regression)

线性回归的表达式:

f(\bm{x}) = \bm{w}^T\bm{x} + b

线性回归对于给定的输入 \bm{x} ,输出的是一个数值 y ,因此它是一个解决回归问题的模型。

为了消除掉后面的常数项b,我们可以令 \begin{matrix} \bm{x}^{'} &= [ 1 & \bm{x}]^T  \end{matrix} ,同时 \begin{matrix} \bm{w}^{'} &= [ b & \bm{w}]^T \end{matrix} ,也就是说给x多加一项而且值恒为1,这样b就到了w里面去了,直线方程可以化简成为:

f(\bm{x'}) = \bm{w'}^T\bm{x'}

在接下来的文章中为了方便,我们所使用的 \bm{w},\bm{x} 其实指代的是 w',x'


二、分类问题(Classification)

二分类问题就是给定的输入 \bm{x},判断它的标签是A类还是类。二分类问题是最简单的分类问题。我们可以把多分类问题转化成一组二分类问题。比如最简单的是OVA(One-vs-all)方法,比如一个10分类问题,我们可以分别判断输入 \bm{x} 是否属于某个类,从而转换成10个二分类问题。

因此,解决了二分类问题,相当于解决了多分类问题。


三、如何用连续的数值去预测离散的标签值呢?

线性回归的输出是一个数值,而不是一个标签,显然不能直接解决二分类问题。那我如何改进我们的回归模型来预测标签呢?

一个最直观的办法就是设定一个阈值,比如0,如果我们预测的数值 y > 0 ,那么属于标签A,反之属于标签B,采用这种方法的模型又叫做感知机(Perceptron)。

另一种方法,我们不去直接预测标签,而是去预测标签为A概率,我们知道概率是一个[0,1]区间的连续数值,那我们的输出的数值就是标签为A的概率。一般的如果标签为A的概率大于0.5,我们就认为它是A类,否则就是B类。这就是我们的这次的主角逻辑回归模型 (Logistics Regression)。


四、逻辑回归(logistics regression)

我们明确了要预测的目标是标签为A的概率。我们知道概率是属于[0,1]区间。

但是线性模型 f(\bm{x}) = \bm{w}^T\bm{x} 值域是 (-\infty,\infty) ,那我们就不能直接基于线性模型来建模。需要找到一个替代的模型,这个模型的值域需要刚好在[0,1]区间,同时足够好用。

于是找到了sigmoid函数,它的表达式长这样: \sigma(x) =\frac{1}{1+e^{-x}} ,下面是它的图像:

这个函数的有很多非常好的性质,一会儿你就会感受到。虽然它很好,但是我们也不能直接拿了sigmoid函数就用吧,毕竟它连要训练的参数 w 都没得。于是我们结合sigmoid函数以及线性回归的函数,我们把线性回归模型的输出作为sigmoid函数的输出,就变成了我们想要的逻辑回归模型:

y=\sigma(f(\bm{x})) = \sigma(\bm{w}^T\bm{x})=\frac{1}{1+e^{-\bm{w}^T\bm{x}}}

好了,假设我们已经训练好了一组权值 \bm{w}^T ,那么只要把我们需要预测的 \bm{x} 代入到方程y中,y所输出的值就能够代表这个标签为A的概率,从而我们就能够判断到底属于哪个类别。

接下来就来详细介绍如何利用一组采集到的真实样本来训练出参数w的值。


五、逻辑回归的损失函数(Loss Function)

假设只有两个标签1和0, y_n \in\{0, 1\} 。我们把采集到的任何一组样本看做一个事件的话,那么这个事件发生的概率假设为p。我们的模型y的值等于标签为1的概率也就是p。

P_{y=1}=\frac{1}{1+e^{-\bm{w}^T\bm{x}}} = p

因为标签不是1就是0,因此标签为0的概率就是: P_{y=0} = 1-p

我们把单个样本看做一个事件,那么这个事件发生的概率就是:

P(y|\bm{x})=\left\{ \begin{aligned} p, y=1 \\ 1-p,y=0 \end{aligned} \right.

这个函数不方便计算,它等价于:

P(y_i|\bm{x}_i) = p^{y_i}(1-p)^{1-{y_i}}

解释下这个函数的含义,如果我们采集到了一个样本 (\bm{x_i},y_i) 。对于 \bm{x}_i 这组数据,它的标签是 y_i 的概率是 p^{y_i}(1-p)^{1-{y_i}} 。 (当y=1,结果是p;当y=0,结果是1-p)。

那么假设我们采集到了一组数据 \{(\bm{x}_1,y_1),(\bm{x}_2,y_2),(\bm{x}_3,y_3)...(\bm{x}_N,y_N)\} ,这个合成在一起的合事件发生的总概率怎么求呢?其实就是将每一个样本发生的概率相乘就可以了,即采集到这组样本的概率:

\begin{aligned} P_{总} &= P(y_1|\bm{x}_1)P(y_2|\bm{x}_2)P(y_3|\bm{x}_3)....P(y_N|\bm{x}_N) \\  &= \prod_{n=1}^{N}p^{y_n}(1-p)^{1-y_n}  \end{aligned}

注意P_{总 } 是一个函数,并且未知的量只有 \bm{w} (在p里面)。

由于连乘很复杂,我们通过两边取对数来把连乘变成连加的形式,即:

\begin{aligned} F(\bm{w})=ln(P_{总} )  &= ln(\prod_{n=1}^{N}p^{y_n}(1-p)^{1-y_n} ) \\ &= \sum_{n=1}^{N}ln (p^{y_n}(1-p)^{1-y_n}) \\ &= \sum_{n=1}^{N}(y_n ln (p) + (1-y_n)ln(1-p)) \end{aligned}

其中, p = \frac{1}{1+e^{-\bm{w}^T\bm{x}}}

这个函数 F(\bm{w}) 又叫做它的损失函数。损失函数可以理解成衡量我们当前的模型的输出结果,跟实际的输出结果之间的差距的一种函数。


六、最大似然估计MLE(Maximum Likelihood Estimation)

我们在真实世界中并不能直接看到概率是多少,我们只能观测到事件是否发生。也就是说,我们只能知道一个样本它实际的标签是1还是0。那么我们如何估计参数 \bm{w} 跟b的值呢?

最大似然估计MLE(Maximum Likelihood Estimation),就是一种估计参数 \bm{w} 的方法。在这里如何使用MLE来估计 \bm{w} 呢?

在上一节,我们知道损失函数 F(\bm{w}) 是正比于总概率 P_{总} 的,而 F(\bm{w}) 又只有一个变量 \bm{w} 。也就是说,通过改变 \bm{w} 的值,就能得到不同的总概率值 P_{总} 。那么当我们选取的某个 \bm{w}^* 刚好使得总概率 P_{总} 取得最大值的时候。我们就认为这个 \bm{w}^* 就是我们要求得的 \bm{w} 的值,这就是最大似然估计的思想。

现在我们的问题变成了,找到一个 \bm{w}^* ,使得我们的总事件发生的概率,即损失函数 F(\bm{w}) 取得最大值,这句话用数学语言表达就是:

\bm{w^*} = arg\max_{w}F(\bm{w}) = -arg\min_{w}F(\bm{w})


七、 求F(\bm{w}) 的梯度 \nabla F(\bm{w})

梯度的定义

我们知道对于一个一维的标量x,它有导数 x'

对一个多维的向量 \bm{x} = (x_1,x_2,x_3,..,x_n) 来说,它的导数叫做梯度,也就是分别对于它的每个分量求导数 \bm{x}' = (x_1',x_2',x_3',..,x_n')


接下来请拿出纸笔,一起动手来推导出 \nabla F(\bm{w}) 的表达式。请尽量尝试自己动手推导出来,如果哪一步不会了再看我的推导。


七(二)、求梯度的推导过程

为了求出 F(\bm{w})的梯度\nabla F(\bm{w}),我们需要做一些准备工作。原谅我非常不喜欢看大串的数学公式,所以我尽可能用最简单的数学符号来描述。当然可能不够严谨,但是我觉得更容易看懂。


首先,我们需要知道向量是如何求导的。具体的推导过程以及原理请参见 矩阵求导

我们只要记住几个结论就行了:对于一个矩阵 \bm{A} 乘以一个向量的方程 \bm{A}\bm{x} ,对向量 \bm{w} 求导的结果是 \bm{A}^T 。在这里我们把函数 \bm{A}\bm{x}\bm{w} 求梯度简单记作 (\bm{A}\bm{x})' 。因此(\bm{A}\bm{x})' = \bm{A}^T , 推论是 (\bm{x}^T\bm{A})' = \bm{A} ,我们把 \bm{x},\bm{w}^T 代入进去,可以知道 (\bm{w}^T\bm{x})' = \bm{x}


然后求 1-p 的值:

1-p=\frac{e^{-\bm{w}^T\bm{x}} }{ 1+e^{-\bm{w}^T\bm{x}} }

p是一个关于变量 \bm{w} 的函数,我们对p求导,通过链式求导法则,慢慢展开可以得:

\begin{aligned}  p' = f'(\bm{w})&= (\frac{1}{1+e^{-\bm{w}^T\bm{x}}} )' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2}   · ( 1+e^{-\bm{w}^T\bm{x}})' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2}   · e^{-\bm{w}^T\bm{x}}  · (-\bm{w}^T\bm{x})' \\ &= -\frac{1}{ (1+e^{-\bm{w}^T\bm{x}} )^2}   · e^{-\bm{w}^T\bm{x}}  · (-\bm{x} ) \\ &= \frac{e^{-\bm{w}^T\bm{x}} }{ (1+e^{-\bm{w}^T\bm{x}} )^2} ·   \bm{x} \\ &=  \frac{1}{ 1+e^{-\bm{w}^T\bm{x}} }    · \frac{e^{-\bm{w}^T\bm{x}} }{ 1+e^{-\bm{w}^T\bm{x}} }  · \bm{x} \\ &= p(1-p)\bm{x} \end{aligned}

上面都是我们做的准备工作,总之我们得记住: p' = p(1-p)\bm{x} , 并且可以知道 (1-p)' = -p(1-p)\bm{x}


下面我们正式开始对 F(\bm{w}) 求导,求导的时候请始终记住,我们的变量只有 \bm{w} ,其他的什么 y_n,\bm{x}_n 都是已知的,可以看做常数。

\begin{aligned} \nabla F(\bm{w})& = \nabla ( \sum_{n=1}^{N}(y_n ln (p) + (1-y_n)ln(1-p)) )\\ &= \sum ( y_n ln'(p) + (1-y_n) ln'(1-p)) \\ &= \sum( (y_n \frac{1}{p}p')+(1-y_n)\frac{1}{1-p}(1-p)') \\ &= \sum(y_n(1-p)\bm{x}_n - (1-y_n)p\bm{x}_n) \\ &= \sum_{n=1}^{N}{(y_n-p)\bm{x}_n} \end{aligned}

终于,我们求出了梯度 \nabla F(\bm{w}) 的表达式了,现在我们再来看看它长什么样子:

\begin{aligned} \nabla F(\bm{w})&= \sum_{n=1}^{N}{(y_n-p)\bm{x}_n}  \end{aligned}

它是如此简洁优雅,这就是我们选取sigmoid函数的原因之一。当然我们也能够把p再展开,即:

\begin{aligned} \nabla F(\bm{w})&=  \sum_{n=1}^{N}{(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n}   \end{aligned}


八、梯度下降法(GD)与随机梯度下降法(SGD)

现在我们已经解出了损失函数  F(\bm{w})在任意 \bm{w} 处的梯度 \nabla F(\bm{w}),可是我们怎么算出来 \bm{w^*} 呢? 回到之前的问题,我们现在要求损失函数取最大值时候的\bm{w^*}的值:

\bm{w^*} = arg\max_{w}F(\bm{w})

梯度下降法(Gradient Descent),可以用来解决这个问题。核心思想就是先随便初始化一个 \bm{w}_0 ,然后给定一个步长 \eta ,通过不断地修改 \bm{w}_{t+1} <-    \bm{w}_{t} ,从而最后靠近到达取得最大值的点,即不断进行下面的迭代过程,直到达到指定次数,或者梯度等于0为止。

\bm{w}_{t+1} = \bm{w}_t + \eta\nabla F(\bm{w})

随机梯度下降法(Stochastic Gradient Descent),如果我们能够在每次更新过程中,加入一点点噪声扰动,可能会更加快速地逼近最优值。在SGD中,我们不直接使用 \nabla F(\bm{w}) ,而是采用另一个输出为随机变量的替代函数 G(\bm{w}) :

\bm{w}_{t+1} = \bm{w}_t + \eta  G(\bm{w})

当然,这个替代函数 G(\bm{w})需要满足它的期望值等于\nabla F(\bm{w}),相当于这个函数围绕着 \nabla F(\bm{w}) 的输出值随机波动。

要怎么实现呢?其实很简单,注意我们GD求导每次都耿直地用到了所有的样本点,从1一直到N都参与梯度计算。

\begin{aligned} \nabla F(\bm{w})&=  \sum_{n=1}^{N}{(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n} \end{aligned}

在SGD中,我们每次只要均匀地、随机选取其中一个样本 (\bm{x_i},y_i) ,用它代表整体样本,即把它的值乘以N,就相当于获得了梯度的无偏估计值,即 E(G(\bm{w})) = \nabla F(\bm{w}) ,因此SGD的更新公式为:

\bm{w}_{t+1} = \bm{w}_t + \eta  N  {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n}

这样我们前面的求和就没有了,同时 \eta  N 都是常数, N 的值刚好可以并入 \eta 当中,因此SGD的迭代更新公式为:

\bm{w}_{t+1} = \bm{w}_t + \eta   {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n}

其中 (\bm{x_i},y_i) 是对所有样本随机抽样的一个结果。


九、总结

终于一切都搞清楚了,现在我们来理一理思路,首先逻辑回归模型长这样:

y=\frac{1}{1+e^{-\bm{w}^T\bm{x}}}

其中我们不知道的量是 \bm{w} ,假设我们已经训练好了一个 \bm{w}^* , 我们用模型来判断 \bm{x}_i 的标签呢?很简单,直接将\bm{x}_i代入y中,求出来的值就是\bm{x}_i的标签是1的概率,如果概率大于0.5,那么我们认为它就是1类,否则就是0类。

那怎么得到 \bm{w}^* 呢?

如果采用随机梯度下降法的话,我们首先随机产生一个\bm{w}的初始值 \bm{w}_0 ,然后通过公式不断迭代从而求得\bm{w}^*的值:

\bm{w}_{t+1} = \bm{w}_t + \eta   {(y_n- \frac{1}{1+e^{-\bm{w}^T\bm{x}_n}} )\bm{x}_n}

每次迭代都从所有样本中随机抽取一个 (\bm{x_i},y_i) 来代入上述方程。


原创,转载请注明出处。

初学者,不可避免出现错误。如果有任何问题,欢迎大家指正,也欢迎大家一起来交流讨论。

发布于 2018-09-15

文章被以下专栏收录