逻辑回归

    本文将从KL距离(相对熵)、交叉熵、损失函数和一些公式推导来阐述逻辑回归这个传统的机器学习方法,重理论轻代码。

1.KL距离

   KL距离又称作相对熵,通常是用来衡量两分布之间的相似度。公式如下:

                                                                                D(P||Q) = \sum_{i=1}^{n}P(x_{i})*log\frac{P(x_{i})}{Q(x_{i})}

其中P,Q是两分布。很显然,KL距离不具有对称性,正是因为这点,描述一些概率性问题的差异性通常使用KL距离,而不用欧式距,逻辑回归也是。

2.Sigmoid函数

                                                                               f(x) = \frac{1}{1+e^{-(wx+b)}}

图像如下(网上百度的):

                                                        逻辑回归_第1张图片

其中wx+b是线性函数,Sigmoid行数的作用就是将线性函数wx+b得到的结果映射到(0,1)之间的一个数,并且具有概率意义。

接下来求下Sigmoid函数的导数,后面会用到。                                                                                                                                                    \frac{\partial f(x)}{\\\partial d}= \frac{1}{(1+e^{-d})^{2}} * e^{-d} =\frac{e^{-d} }{(1+e^{-d})^{2}} =\frac{e^{-d} +1-1}{(1+e^{-d})^{2}} =\frac{(e^{-d} +1)-1}{(1+e^{-d})^{2}} =\frac{(e^{-d} +1)}{(1+e^{-d})^{2}}-\frac{1}{(1+e^{-d})^{2}} =\frac{1}{(1+e^{-d})} -(\frac{1}{(1+e^{-d})} )^{2} =f-f^{2} =f*(1-f)

其中 d = wx+b, 推导完毕。

3.逻辑回归损失函数

    文章开头提到过,KL距离通常用来衡量概率之间的相似度,经过Sigmoid函数转换,我们最终得到的一个值正好是一个概率值。又因为逻辑回归是个二分类问题,可以认为有两种类别0和1,假设x_{i}为类别0的概率为p(x_{i}),则x_{i}为类别1的概率为1-p(x_{i})。接下来我们看下损失函数:

                                                       d_{KL} = \frac{1}{n}\sum_{i=1}^{n}[y_{i}*log\frac{y_{i}}{f_{i}} + (1-y_{i})*log\frac{1-y_{i}}{1-f_{i}}]                          

其中y_{i}为实际训练样本的类别值,f_{i}是通过sigmoid函数算出来的值,很明显,上面式子中,加号两边对于一个样本只有一边不为0,因为实际样本的类别不是0就是1。上述式子继续简化:

                       d_{KL} =\frac{1}{n} \sum_{i=1}^{n}[y_{i}*logy_{i}-y_{i}*logf_{i}+(1-y_{i})*log(1-y_{i})-(1-y_{i})*log(1-f_{i})]

其中y_{i}*logy_{i} 和 (1-y_{i})*log(1-y_{i}) 可以认为是常数项,因为训练样本的类别都是已知的,所以最终KL距离就为:

                                                  d_{KL} = -\frac{1}{n}\sum_{i=1}^{n}[y_{i}*logf_{i}+(1-y_{i})*log(1-f_{i})]

机器学习训练的过程,就是不断更新 w ,使得损失函数不断减小的过程。而这最常用的方法就是梯度下降法。而一般的梯度下降法的公式如下:

                                               w^{_{'}} = w_{0} - \alpha \frac{\partial d_{sunshi}}{\partial w}    其中 d_{sunshi} 是指的损失函数,\alpha是学习因子,是个超参数,可以人为设定

回到逻辑回归中,它的损失函数是d_{KL},那么

                                                 w^{_{'}} = w_{0} - \alpha \frac{\partial d_{KL}}{\partial w}

接下来我们看下 \frac{\partial d_{KL}}{\partial w} 这部分其实是决定 w 的变化方向,那么等于什么呢

                                                    \frac{\partial d_{KL}}{\partial w}=\frac{\partial d_{KL}}{\partial d}*\frac{\partial d}{\partial w}

                                                             =\frac{\partial (-\frac{1}{n}\sum_{i=1}^{n}[y_{i}*logf_{i}+(1-y_{i})*log(1-f_{i})])}{\partial d} *\frac{\partial d}{\partial w}

                                                           = -\frac{1}{n}\sum_{i=1}^{n}(y_{_{i}}*\frac{1}{f_{i}} * \frac{\partial f}{\partial d} - (1-y_{i}) *\frac{1}{1-f_{i}} * \frac{\partial f}{\partial d} ) * \frac{\partial d}{\partial w}                

在前面我们对 \frac{\partial f}{\partial d} 求过导数:\frac{\partial f}{\partial d} = f * (1 - f ) ,代入上面式子有

                                                           = -\frac{1}{n}\sum_{i=1}^{n}(y_{_{i}}*\frac{1}{f_{i}} * f_{i }*(1-f_{i}) - (1-y_{i}) *\frac{1}{1-f_{i}} * f_{i }*(1-f_{i} ) * \frac{\partial d}{\partial w}

                                                           = -\frac{1}{n}\sum_{i=1}^{n}(y_{_{i}}*(1-f_{i}) - (1-y_{i}) *f_{i })* \frac{\partial d}{\partial w}

                                                           = -\frac{1}{n}\sum_{i=1}^{n}(y_{_{i}}*(1-f_{i}) - (1-y_{i}) *f_{i })* x_{i}

我们将点 (x_{i},y_{i}) 代入上面式子中,很容易就可以 w 要变化的方向,只要数据正常,也不存在得到的值特别大或特别小的情况。如果得到的值特别大,模型容易震荡,如果得到的值特别小,w 会学不到东西,即初始化是什么值,训练完后也差不多和这个值相等,显然这两种情况都不是我们想要的。在线性回归问题里面,我们通常用mse来作为我们的损失函数,那逻辑回归为啥不用mse做损失函数呢?

    首先,假设我们用mse来做损失函数,那么

                                                      \frac{\partial mse}{\partial w} =\frac{1}{n} \sum_{i=1}^{n} \frac{\partial (f_{i}-y_{i})^{2}}{\partial w}

                                                                 =\frac{1}{n}\sum_{i=1}^{n} \frac{\partial (f_{i}-y_{i})^{2}}{\partial d} * \frac{\partial d}{\partial w}

                                                                 =\frac{1}{n}\sum_{i=1}^{n} {2*(f_{i}-y_{i})} *f_{i}^{'} * x_{i}

                                                                =\frac{1}{n}\sum_{i=1}^{n} {2*(f_{i}-y_{i})} * f_{i}* (1 - f_{i}) * x_{i}

我们结合f(x) = \frac{1}{1+e^{-(wx+b)}} 的图像来观察这一项 f_{i}* (1 - f_{i}) 

                                                        逻辑回归_第2张图片

我们从sigmoid函数中可以看出,当我们把 w 的值稍微大些或稍微小写的时候,f_{i} 很容易趋近于1或0,造成的结果就是\frac{\partial mse}{\partial w}会很小,导致 w 学不到东西,所以mse不适合用于做逻辑回归的损失函数,其实还有一个不用mse做损失函数的原因是,它的极小值点特别多,而且与特征维度的平方成正相关,这对初始化 w 就有很大的要求了,所以逻辑回归没有选用mse作为它的损失函数。

4.数据归一化

    我们接着观察\frac{\partial d_{KL}}{\partial w}= -\frac{1}{n}\sum_{i=1}^{n}(y_{_{i}}*(1-f_{i}) - (1-y_{i}) *f_{i })* x_{i} ,可以看到 w 每次迭代变化都是和输入数据 x_{i} 相关,如果x_{i}的值很大,那么整个模型的训练过程就会震荡,如果x_{i}的值很小,那么w每次就学不到什么东西,到时模型训练时间非常长,这些情况都是理想结果,那么通常我们会对数据进行预处理,将数据归一化,其实就是通过一定手段将数据映射到同一个量级。接下来介绍两种常用的数据归一化:

  1. 离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间,转换公式x^{'} = \frac{x-min}{max-min},其中的min是数据集中最小值,max是数据集中最大值,因为处理后的x^{'}都是大于0的,故w(w_{1},w_{2},w_{3},... ,w_{n})只会往同一个方向走
  2. Z-score标准化方法, 这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:x^{'} = \frac{x-\mu }{\sigma },其中 \mu 是数据集的均值,\sigma 是数据集的标准差。因为处理后的x^{'}有正有负,那么w(w_{1},w_{2},w_{3},... ,w_{n})不一定会沿着同一方向走,这样会使得训练过程时间大大减少。

你可能感兴趣的:(机器学习)