Classification:Logistic Regression(逻辑回归)
一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。
逻辑回归与线性回归都是一种广义线性模型。逻辑回归假设因变量
y
y
y 服从伯努利分布,而线性回归假设因变量
y
y
y 服从高斯分布。 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过 Sigmoid 函数引入了非线性因素,因此可以轻松处理二分类问题。
我们拿垃圾邮件二分类(C1(正常),C2(垃圾))举例,需要找到一个概率
p
(
C
1
∣
x
)
p(C1∣x)
p(C1∣x),当
p
(
C
1
∣
x
)
>
0.5
p(C1∣x)>0.5
p(C1∣x)>0.5 时候是分类C1,当
p
(
C
1
∣
x
)
<
0.5
p(C1∣x)<0.5
p(C1∣x)<0.5的时候的分类是C2。
逻辑回归中主要是引入了Sigmoid映射函数,从上图可以看到sigmoid函数是一个s形的曲线,它的取值在[0, 1]之间,在远离0的地方函数的值会很快接近0或者1。它的这个特性对于解决二分类问题十分重要。
函数模型如下
Python代码实现:
import numpy as np
def sigmoid(z):
return 1/(1+np.exp(-z))
这样,通过 σ ( z ) \sigma(z) σ(z) 函数的转换和帮助,你可以用逻辑回归来得到一个概率输出了。一般我们将 Logistic 的计算结果用小写字母 z z z 来表示。
函数模型的优化
比如说有一个训练集
容易得到产生这组训练集数据的概率为
L
(
w
,
b
)
=
f
w
,
b
(
x
1
)
f
w
,
b
(
x
2
)
(
1
−
f
w
,
b
(
x
3
)
)
.
.
.
f
w
,
b
(
x
N
)
L(w,b)=f_{w,b}(x^1)f_{w,b}(x^2)(1-f_{w,b}(x^3))...f_{w,b}(x^N)
L(w,b)=fw,b(x1)fw,b(x2)(1−fw,b(x3))...fw,b(xN)
当这个概率
L
(
w
,
b
)
L(w,b)
L(w,b) 最大的时候,这个时候的
w
w
w 和
b
b
b 就是最优解。
w
∗
,
b
∗
=
a
r
g
m
a
x
w
,
b
L
(
w
,
b
)
=
a
r
g
m
i
n
w
,
b
−
l
n
L
(
w
,
b
)
w^*,b^* =arg\mathop{max}\limits_{w,b}L(w,b)=arg\mathop{min}\limits_{w,b}-lnL(w,b)
w∗,b∗=argw,bmaxL(w,b)=argw,bmin−lnL(w,b)
然后又可以得到
这就是两个伯努利分布之间的交叉熵,我们用交叉熵的概念来描述两组不同概率数据分布的相似程度,越小越相似。(这个概念在机器学习中非常重要)
假设真实分布是
p
p
p ,预测分布是
q
q
q。
根据交叉熵的定义得到
p
p
p 和
q
q
q 之间的相似性:
H ( p , q ) = − ∑ p ( x ) l n ( q ( x ) ) H(p,q)=-\sum p(x)ln(q(x)) H(p,q)=−∑p(x)ln(q(x))
容易得出,如果他们的分布一样,那么交叉熵为0。
我们可以定义损失函数为交叉熵的和:
L
(
f
)
=
∑
C
(
f
(
x
n
)
,
y
^
n
)
L(f)=\sum C(f(x^n),\hat{y}^n)
L(f)=∑C(f(xn),y^n)
其中,
C
(
f
(
x
n
)
,
y
^
n
)
=
−
[
y
^
n
l
n
f
(
x
n
)
+
(
1
−
y
^
n
)
l
n
(
1
−
f
(
x
n
)
)
]
C(f(x^n),\hat{y}^n)=-[\hat{y}^nlnf(x^n)+(1-\hat{y}^n)ln(1-f(x^n))]
C(f(xn),y^n)=−[y^nlnf(xn)+(1−y^n)ln(1−f(xn))]
寻找最优的函数模型
对
−
l
n
L
(
w
,
b
)
-lnL(w,b)
−lnL(w,b) 做微分可以得到
∂
(
−
l
n
L
(
w
,
b
)
)
∂
w
i
=
∑
n
−
(
y
^
n
−
f
w
,
b
(
x
n
)
)
x
i
n
\frac{\partial(-lnL(w,b))}{\partial{w_i}}=\sum\limits_{n}-(\hat{y}^n-f_{w,b}(x^n))x_i^n
∂wi∂(−lnL(w,b))=n∑−(y^n−fw,b(xn))xin
上式表明,目前的数值与目标差距越大,更新的值也会越大,
与线性回归比较一下:
那么,这里有一个困惑,为什么不用 Square Error (方差)?
假设我们使用方差定义损失函数
L
(
f
)
=
1
2
∑
n
(
f
w
,
b
(
x
n
)
−
y
^
n
)
2
L(f)=\frac{1}{2}\sum\limits_{n}(f_{w,b}(x^n)-\hat{y}^n)^2
L(f)=21n∑(fw,b(xn)−y^n)2
那么会导致下面的问题
这样会不太容易得到好的结果,但是用交叉熵的方法,会顺利很多。
Discriminative(Logstic) v.s. Generative(Gaussion)
将之前的两类分类算法进行比较
在之前的一个例子中,两类分类算法的表现如下
Discriminative 的表现往往比 Generative 好。
但是有些时候 Generative 也会突出它的优势,比如:
- 训练数据很少
- 训练数据比较乱
- 可以通过不同的来源进行概率上的预测
多分类问题
原理与二分类一样
假设有三个类别
C
1
,
C
2
,
C
3
C_1,C_2,C_3
C1,C2,C3
softmax做的事情就是它们进行exponential(指数化),将exponential 的结果相加,再分别用 exponential 的结果除以相加的结果。
我们同样可以利用交叉熵来比较得到的概率分布与真实的概率分布之间的差异程度
Logistic 回归的局限性
假设这样一种情况
我们没有办法用一条直线把它们分开。
那么我们可以用一个特征转换的办法:(虽然不是很容易找到一个合适的特征转换)
x
1
′
:
d
i
s
t
a
n
c
e
t
o
[
0
0
]
x^{'}_1:distance\ to\begin{bmatrix}0\\0\end{bmatrix}
x1′:distance to[00]
x
2
′
:
d
i
s
t
a
n
c
e
t
o
[
1
1
]
x^{'}_2:distance\ to\begin{bmatrix}1\\1\end{bmatrix}
x2′:distance to[11]
cascading logistic regression models(级联逻辑回归模型)
Cascading logistic regression models就是一种转换的普遍适用的方法。
可以将很多的逻辑回归接到一起,就可以进行特征转换。
上图中,利用逻辑回归
Z
1
Z_1
Z1 和
Z
2
Z_2
Z2 进行特征转换,然后对
x
1
′
x^{'}_1
x1′ 和
x
2
′
x^{'}_2
x2′ 再用一个逻辑回归
Z
Z
Z 进行分类。
上面的例子经过这样的转换后,可以得到分类的结果
一个逻辑回归的输入可以来源于其他逻辑回归的输出,这个逻辑回归的输出也可以是其他逻辑回归的输入。把每个逻辑回归称为一个 neuron(神经元),把这些神经元连接起来的网络,就叫做 neural network(神经网络)。
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如我们要实
现 XNOR 功能(输入的两个值必须一样,均为 1 或均为 0),即:
X
N
O
R
=
(
x
1
A
N
D
x
2
)
O
R
(
N
O
T
x
1
)
A
N
D
(
N
O
T
x
2
)
)
XNOR=(x_1 AND x_2 )OR (NOT x_1) AND (NOT x_2))
XNOR=(x1ANDx2)OR(NOTx1)AND(NOTx2))
首先构造一个能表达
(
N
O
T
x
1
)
A
N
D
(
N
O
T
x
2
)
(NOT x_1) AND (NOT x_2)
(NOTx1)AND(NOTx2) 部分的神经元。
然后将表示 AND 的神经元和表示
(
N
O
T
x
1
)
A
N
D
(
N
O
T
x
2
)
(NOT x_1) AND (NOT x_2)
(NOTx1)AND(NOTx2) 的神经元以及表示 OR 的神经元进行组合:
我们就得到了一个能实现 XNOR 运算符功能的神经网络。
按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
这就是神经网络的厉害之处。