10-1:Logistic Regression Problem
Logistic回归问题
我们举一个心脏病预测的例子 ,我们根据患者的年龄,性别,体重,血压这些特征来预测这个人是否有心脏病,很显然这是一个二分类的例子,其输出结果为{+1,-1},算法流程如下图所示:

具体流程图的介绍在第八节已经详细介绍了,这里就不再赘述了。
那么我们如何根据这些特征判定是否该患者患心脏病呢?类似PLA,我们一般可以取一个阈值threshold=0.5,然后计算目标分布p(y|x)的大小,当p(+1|x)>0.5时就认为患有心脏病,否则就认为没有心脏病,即目标函数:
f(x)=sign(p(+1|x)−12)∈ {-1,1}
但是如果我们考虑的不是该患者患病与否,而是考虑这个患者患心脏病的几率是多大的?因为我们通常告诉患者的是他患病的概率是多大,那么我们就需要重新定义一个目标函数了,如下式所示:
f(x)=p(+1|x)∈[0,1]
上面通常称为软二元分类(soft Binary classification),那么对于这种分类,我们想要的理想数据格式应该是如下所示(即我们想要的是确切的概率 p):

但是实际的数据,比如医院给你病例数据之类的,肯定不会是上面这种完美的数据,因为医院肯定只会记录该患者是否患病,实际的数据应该像下面这样:

比如上面第一条记录了O,表示是患病的,第二条记录了×,表示没有患病。并没有直观的给出我们想要的目标函数分布(即患病概率)。我们将这种数据可以作为理想的数据+noise共同生成的。
那么我们接下来就应该寻找一个好的hypothesis来尽可能的接近目标函数f(x)。
例如,输入X=(x0,x1,x2,…xd)个病人的输入特征,我们可以根据PLA的思想,构建一个风险分数(risk score)S来对该患者患病的程度进行量化,即:
S=∑di=0wixi,但是我们知道概率是有上界的,不会超过1,如果单单使用S来进行评判,并不能达到我们想要的结果,我们应该将S进行转换,最常用的转换方式就是sigmoid函数了,即:
θ(S)=11+e−s,该函数对应的函数图像如下图所示:

从函数图像可以看出sigmoid函数是平滑的S形曲线,并且是递增的,那么我们可以将上面的S=∑di=0wixi=wTx带入sigmoid函数,就可以将S映射到[0,1]区间,也就得到了我们想要的概率p,这一结果可以定义为Logistic Hypothesis即:
h(x)=θ(wTx)=11+e−wTx
然后我们就可以用h(x)来近似目标函数分f(x)=p(y|x)了。
10-2:Logistic Regression Error
Logistic回归错误衡量
回想一下我们学过的线性分类(Linear classification)、线性回归(Linear Regression),以及今天学到的Logistic Regression。我们将他们进行对比如下图所示:

我们很容易能够得到图中的S=wTx,即三种假设h都有着共同的得分函数。如何衡量他们的误差呢?线性分类用的是0/1 error,线性回归用的是Squared error(平方错误),那么问题来了,对于Logistic Regression,我们该如何量化它的误差(即Ein(w))。
我们的目标函数f(x)=p(+1|x),我们可以将其等价为公式(1):
(1)
我们考虑一组数据D=(x1,O),(x2,X)…(xN,X)(O代表+1,X代表-1),那么实际能产生这一组数据的概率是多大呢,其计算过程如下:
p=p(x1)p(O|x1)×p(x2)p(X|x2)×⋯×p(xN)p(X|xN)(将公式(1)带入)
=p(x1)f(x1)×p(x2)[1−f(x2)]×⋯×p(xN)[1−f(xN)]
我们考虑以下两个问题:
1. 我们的目的是找到一个最好的Hypothesis近似等于f(x),那么上面的p理论上由f(x)产生的和h(x)产生的是差不多大的概率(不然就是不好的hypothesis)
2. 上面的数据D是一个正常的数据,那么f(x)产生D的概率p应该是足够大的
综合2条规则,我们可以得到下面g:
g=argmaxh likelihood(h)
即f=h,并且最大化g。
由于h(x)=θ(wTx),或者从sigmoid函数我们可以看出h(−x)=1−h(x),这样子就能代替掉p中的(1−h(x)),计算过程如下:
likelihood(h)=p(x1)h(x1)×p(x2)h(−x2)×⋯×p(xN)h(−xN)
实际中我们假设先验概率p(x)是相等的,进一步推出:

在Lecture 9中我们就用w替换掉了h,这里一样如此,并且将 h(x)=θ(wTx)带入:进一步推出:

两边取对数ln,进一步推出:
maxh∑Ni=1lnθ(ynwTxn)
=minw1N∑Nn=1[−lnθ(ynwTxn)]
将θ(S)=11+exp(−S),进一步推出:
=minw1N∑Nn=1[ln(1+exp(−ynwTxn))]
将上式和经常使用的误差公式对比一下:
误差公式minw1N∑Nn=1err(h(xn),yn)
我们最终得到Logistic Regression的交叉熵错误(cross_entropy error):
err(w,x,y)=ln(1+exp(−ynwTxn))
10-3:Gradient of Logistic Regression Error
Logistic回归误差的梯度
上一节我们已经求出来了Ein(w)的表达式:
minwEin(w)=1N∑Nn=1[ln(1+exp(−ynwTxn))]
那么我们接下来的目的便是最小化这个函数来得到权值向量w。我们考虑Ein(w)的函数图像:

我们发现,Ein(w)具有可微分、连续、二阶可微、并且还是凸函数。由于Ein(w)是凸函数,我们可以直接可以求∇Ein(w)=0,然后得到w的解。
因为Ein(w)的表达式还是有点复杂的,我们首先进行如下替换:

我们进行如下求微分的计算过程(由于太复杂,就直接盗用图片,然后在下面进行解释。)

这里求微分的计算是分布计算的,可以类似于:
∂E∂w=∂E∂t1∂t1∂t2⋯∂tn∂w (其实,你类似于乘法相乘是很容易理解的)。
为了简便,这里我们将得到的xn,i用xn表示,得到最终的梯度公式如下:
∇Ein(w)=1N∑Nn=1θ(−ynwTxn)⋅(−ynxn)
Lecture9中,介绍了何时能使得Ein(w)最小,即梯度为0的时候(因为这是凸函数),我们考虑两种情况:
1. 所有的θ(−ynwTxn)=0,这个条件可以满足梯度为0,但是当且仅当ynwTxn>>0,换个角度想也就是数据是Linear Separable(线性可分)的。
2. 当数据线性不可分的时候,我们又不能像LinReg(线性回归)一样使用闭式解,那么这种问题怎么解呢?其实可以用迭代的方法。
回顾一下之前PLA的算法过程:

我们找到一个错误记为(xn(t),yn(t)),并且用这个错误点来对w进行修正,具体细节在Lecture2中有详细介绍。
上面的修正错误的过程,我们如果换一个角度看呢?
wt+1←wt+1⋅[sign(wTx≠yn)]⋅ynxn
这个式子和上面算法的修正是一样的,只是做了一些小小的改变:

如图中η和v所示,η一般称之为学习的步长,v称为学习的方向。上面的这种方法我们称为iterative optimization approach(迭代优化算法)。
10-4:Gradient Descent
梯度下降
我们回顾一下Ein(w)的函数图像:

我们将Ein(w)比作一个山谷,那么假定我们现在处于小球的位置,那么如何才能最快的到谷底呢?我们需要考虑走的方向v和每次走的步长η,有一个贪婪的方法是在η给定的情况下,条件限制为||v||=1,即:
min||v||=1Ein(wt+ηv)
其中wt+1=wt+ηv,我们接下来简化这个过程,利用taylor展开式:可以得到:
min||v||=1Ein(wt+ηv)≈Ein(wt)+ηvT∇Ein(wt)
(这里有一个想法就是:我觉得这就相当于求直线斜率的表达式把即:
min||v||=1Ein(wt+ηv)−Ein(wt)ηvT=∇Ein(wt),将步长限制的比较小的时候,那么直线可以等价于曲线的)。
那么经过上面的简化之后,我们发现Ein(wt)是常数,η是给定的正数,那么现在就只剩下一个变量v了,那么上式就转化为:
min||v||=1vT∇Ein(wt)
要使这个表达式值最小,因为这是内积,那么v的方向和∇Ein(wt)的方向相反的话就会得到最小值,即:
v=−∇Ein(wt)||∇Ein(wt)||
得到方向v之后,利用我们上一节课得到iterative optimization approach(迭代优化算法),即wt+1←wt+ηv,当η很小的时候,带入式子可得:
wt+1←wt−η∇Ein(wt)||∇Ein(wt)||
上面的式子就是经典的Gradient Descent (梯度下降)算法。
从上面式子可以看出,现在只剩下如何选择η了。下面观察一下η对GD(梯度下降)的影响:

1. 我们发现,小的η能够收敛到最小值,但是收敛速度太慢了
2. 大的η下降非常不稳定,甚至还可能出现越下降越高的情形
3. 最右边的是比较好的η,它在梯度比较大(即坡比较陡)的时候,η比较大,在梯度比较小(即坡比较缓)的时候,η比较小,很完美的收敛,即η和梯度的大小成正比。
我们下面重新定义一下梯度下降公式:

图中红色的η和紫色的η是不一样的,它们之间存在的关系为:
紫色η=(红色η)⋅1||∇Ein(wt)||
我们将最终得到的紫色η称为固定的学习速率。
综上,我们对Logistic回归算法进行小结:

1. 先初始化w_0
2. 计算每依次迭代过程中梯度∇Ein(wt)的值
3. 用梯度下降算法对wt+1进行更新
直到∇Ein(wt+1)≈0或者足够的迭代次数后使得循环结束,返回最后的wt+1作为g。
注明:
文章中所有的图片均来自台湾大学林轩田《机器学习基石》课程