在《大家的人工智能——线性回归》中,什么是拟合,代价函数,梯度下降,相信大家已经对这些基本概念有所了解。线性回归的应用场景是输出为连续的数值,比如下个月的房价多少,明天的气温多少。而在机器学习中还有一类任务,它的输出是离散的,比如明天他会不会去游泳(会或不会),这是狗还是猫,这就是分类任务,而Logistic回归就是处理这种分类任务的,不要看他的名字里面有“回归”两个字,但是它其实是个分类算法。它取名Logistic回归主要是因为是从线性回归转变而来的。
假设我们有一些数据点,我们使用一条直线对这些点进行拟合,这条线称为最佳拟合直线,这个拟合过程称为回归。利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。如下图:
我们想要得到一个函数,能够接收所有的输入然后预测出类别。例如在两个类的情况下,函数输出0或1。该函数称为海维塞德阶跃函数(Heaviside step function),或者直接称为单位阶跃函数。但是海维塞德阶跃函数的问题在于:该函数在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程有时很难处理。不过另外一个函数也有类似的性质,而且数学上更容易处理,它就是Sigmoid函数,具体公式如下:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
Sigmoid函数输入记为z,公式为:
z = w 0 x 0 + w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w n x n z = w_0x_0 + w_1x_1 + w_2x_2 + ··· + w_nx_n z=w0x0+w1x1+w2x2+⋅⋅⋅+wnxn
也可以写成向量的形式:
Z = W T X Z = W^TX Z=WTX
Sigmoid函数的形状如下:
Sigmoid函数处处可导,其导数为:
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma^{'}(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))
如下图:
我们使用之前线性回归中的参数命名来改写一下上面的方程来得到Logistic回归函数:
h Θ ( X ) = 1 1 + e − Θ T X h_{\Theta}(X) = \frac{1}{1 + e^{-\Theta^TX}} hΘ(X)=1+e−ΘTX1
我们可以看到上面分母中的 Θ T X \Theta^TX ΘTX 与线性回归中的那条“直线”形式一模一样,在Logistic回归中就是要找到一条这样的“直线”进行分类。而上面的h(x)表示属于类别1(二分类)的概率:
h Θ ( X ) = P ( y = 1 ∣ X ; Θ ) h_{\Theta}(X) = P(y = 1 |X;\Theta) hΘ(X)=P(y=1∣X;Θ)
我们现在知道在线性回归中的代价函数是什么样的,但是如果将它作为Logistic回归中的代价函数的话,那么它将会是一个非凸函数,会有很多局部最优值,这是因为使用了非线性的sigmoid:
因此在Logistic回归中,我们将使用下面的代价函数:
C o s t ( h Θ ( X ) , y ) = { − l o g ( h Θ ( X ) ) , i f y = 1 − l o g ( 1 − h Θ ( X ) ) , i f y = 0 Cost(h_{\Theta}(X), y) = \left\{ \begin{aligned} -log(h_{\Theta}(X)), \space if \space y = 1 \\ -log(1 - h_{\Theta}(X)) , \space if \space y = 0 \end{aligned}\right. Cost(hΘ(X),y)={−log(hΘ(X)), if y=1−log(1−hΘ(X)), if y=0
那么上面的代价函数为什么是凸函数呢,我们先来看看y=1的情况。
当y=1时,代价函数为-log(h(x)):
那么为什么是这样的形状呢,我们可以看看log(z)的样子:
红色曲线[0,1]的区间就是y=1时的代价函数。
当y=0时,代价函数为-log(1-h(x)):
把上面的代价函数合起来:
C o s t ( h Θ ( X ) , y ) = − [ y l o g ( h Θ ( X ) ) + ( 1 − y ) l o g ( 1 − h Θ ( X ) ) ] Cost(h_{\Theta}(X), y) = -[ylog(h_{\Theta}(X)) + (1-y)log(1-h_{\Theta}(X))] Cost(hΘ(X),y)=−[ylog(hΘ(X))+(1−y)log(1−hΘ(X))]
那么在所有数据上,代价函数为:
J ( Θ ) = − 1 m ∑ i = 1 m [ y ( i ) l o g ( h Θ ( X ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h Θ ( X ( i ) ) ) ] J(\Theta) = - \frac{1}{m} \sum_{i = 1}^m [y^{(i)}log(h_{\Theta}(X^{(i)})) + (1-y^{(i)})log(1-h_{\Theta}(X^{(i)}))] J(Θ)=−m1i=1∑m[y(i)log(hΘ(X(i)))+(1−y(i))log(1−hΘ(X(i)))]
接下来按照线性回归中提到的方式最小化代价函数即可。
上面讲述了二分类的情况,现在推广到多分类。但是对于多分类的情况,需要对上面的Logistic进行改进。
回顾一下上面回归函数中,一个样本属于某个类的概率:
h Θ ( X ) = P ( y = k ∣ X ; Θ ) h_{\Theta}(X) = P(y = k |X;\Theta) hΘ(X)=P(y=k∣X;Θ)
将它展开:
h θ ( x ( i ) ) = [ p ( y ( i ) = 1 ∣ x ( i ) ; θ ) p ( y ( i ) = 2 ∣ x ( i ) ; θ ) ⋮ p ( y ( i ) = k ∣ x ( i ) ; θ ) ] = 1 ∑ c = 1 k e θ c T x ( i ) [ e θ 1 T x ( i ) e θ 2 T x ( i ) ⋮ e θ k T x ( i ) ] h_{\theta}(x^{(i)}) = \left[ \begin{matrix} p(y^{(i)} = 1 |x^{(i)};\theta) \\ p(y^{(i)} = 2 |x^{(i)};\theta) \\ ⋮ \\ p(y^{(i)} = k |x^{(i)};\theta) \end{matrix} \right] = \frac{1}{\sum_{c=1}^ke^{\theta_c^Tx^{(i)}}} \left[ \begin{matrix} e^{\theta_1^Tx^{(i)}} \\ e^{\theta_2^Tx^{(i)}} \\ ⋮ \\ e^{\theta_k^Tx^{(i)}} \end{matrix} \right] hθ(x(i))=⎣⎢⎢⎢⎡p(y(i)=1∣x(i);θ)p(y(i)=2∣x(i);θ)⋮p(y(i)=k∣x(i);θ)⎦⎥⎥⎥⎤=∑c=1keθcTx(i)1⎣⎢⎢⎢⎢⎡eθ1Tx(i)eθ2Tx(i)⋮eθkTx(i)⎦⎥⎥⎥⎥⎤
知道了h(x)的形式之后,我们可以写出它的代价函数:
J ( θ ) = − ∑ i = 1 m ∑ c = 1 k s i g n ( y ( i ) = c ) l o g p ( y ( i ) = c ∣ x ( i ) , θ ) = − ∑ i = 1 m ∑ c = 1 k s i g n ( y ( i ) = c ) l o g e θ c T x ( i ) ∑ l = 1 k e θ l T x ( i ) J(\theta) = -\sum_{i=1}^m\sum_{c=1}^ksign(y^{(i)}=c)logp(y^{(i)} = c|x^{(i)}, \theta) = -\sum_{i=1}^m\sum_{c=1}^ksign(y^{(i)} = c)log\frac{e^{\theta_c^Tx^{(i)}}}{\sum_{l=1}^ke^{\theta_l^Tx^{(i)}}} J(θ)=−i=1∑mc=1∑ksign(y(i)=c)logp(y(i)=c∣x(i),θ)=−i=1∑mc=1∑ksign(y(i)=c)log∑l=1keθlTx(i)eθcTx(i)
其中,如果y=c为真,则sign(y=c)=1,否则为0。