监督学习和优化——逻辑回归(Logistic Regression)
问题描述
之前我们学习的是通过一个线性方程预测一个连续的值(e.g. 房屋价格)。但有时我们想要预测一个离散的值,比如一张图片是不是猫,这属于分类问题。而逻辑回归是一种简单的分类算法。在这里,我们只讨论二元分类问题,即 y ∈ { 0 , 1 } y\in \{0,1\} y∈{0,1}。
Logistic函数
给定 x ( i ) , y ( i ) x^{(i)},y^{(i)} x(i),y(i)是其标签。若还是像线性回归中的描述方法: h θ ( x ) = θ ⊤ x h_\theta(x) = \mathbf{\theta}^\top x hθ(x)=θ⊤x来描述标签,则显然是不合理的,因为 y y y只能是0或者1,因此修改 h θ ( x ) = g ( θ ⊤ x ) = 1 1 + e − θ ⊤ x h_\theta(x) = g(\mathbf{\theta}^\top x) = \frac{1}{1+e^{-\mathbf{\theta}^\top x}} hθ(x)=g(θ⊤x)=1+e−θ⊤x1其中 g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+e−z1 该函数被叫做logistic函数或者sigmoid函数。该函数如下图所示可以看到 g ( z ) ∈ ( 0 , 1 ) g(z) \in (0,1) g(z)∈(0,1),因此 h θ ( x ) h_\theta(x) hθ(x)的取值也在该范围内。其他取值在[0,1]之间的函数也可以替代这里的sigmoid函数。
算法描述
假设
h
θ
(
x
)
h_\theta(x)
hθ(x)表示分类为正类(y为1)的概率,则有
P
(
y
=
1
∣
x
;
θ
)
=
h
θ
(
x
)
P(y=1|x;\theta) = h_\theta(x)
P(y=1∣x;θ)=hθ(x)
P
(
y
=
0
∣
x
;
θ
)
=
1
−
h
θ
(
x
)
P(y = 0|x;\theta) = 1-h_\theta(x)
P(y=0∣x;θ)=1−hθ(x)上面两式可简写为下面的式子:
P
(
y
∣
x
;
θ
)
=
h
θ
(
x
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
P(y|x;\theta) = h_\theta(x)^y(1-h_\theta(x))^{1-y}
P(y∣x;θ)=hθ(x)y(1−hθ(x))1−y假设m个训练样本是独立生成的,则可以写出参数的似然函数为:
L
(
θ
)
=
p
(
y
⃗
∣
X
;
θ
)
=
∏
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
∏
i
=
1
m
h
θ
(
x
(
i
)
)
y
(
i
)
(
1
−
h
θ
(
x
(
i
)
)
)
1
−
y
(
i
)
L(\theta) = p(\vec y | X;\theta)\\ = \prod_{i=1}^mp(y^{(i)}|x^{(i)};\theta)\\=\prod_{i=1}^mh_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}}
L(θ)=p(y∣X;θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏mhθ(x(i))y(i)(1−hθ(x(i)))1−y(i)使用对数似然更加容易计算:
l
(
θ
)
=
log
L
(
θ
)
=
∑
i
−
1
m
y
(
i
)
log
h
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
(
x
(
i
)
)
l(\theta) = \log L(\theta) \\ = \sum_{i-1}^my^{(i)}\log h(x^{(i)}) + (1-y^{(i)})\log (1-h(x^{(i)})
l(θ)=logL(θ)=i−1∑my(i)logh(x(i))+(1−y(i))log(1−h(x(i))
现在的任务转变为最大化对数似然估计,即我们的
l
(
θ
)
l(\theta)
l(θ)。最大化该函数可以使用上一章介绍的梯度下降进行计算。其中梯度为:
∂
∂
θ
j
l
(
θ
)
=
∑
i
(
y
−
h
θ
(
x
)
)
x
j
(
i
)
\frac{\partial}{\partial \theta_j}l(\theta) = \sum_i(y - h_\theta(x)) x_j^{(i)}
∂θj∂l(θ)=i∑(y−hθ(x))xj(i)伪代码如下所示:
Repeat until convergence{
θ
j
:
=
θ
j
+
α
∑
i
=
1
m
(
y
(
i
)
−
h
θ
(
x
(
i
)
)
)
x
j
(
i
)
(
f
o
r
e
v
e
r
y
j
)
\theta_j :=\theta_j + \alpha\sum_{i=1}^m(y^{(i)} - h_\theta(x^{(i)}))x_j^{(i)} \ \ \ \ (for\ every\ j)
θj:=θj+αi=1∑m(y(i)−hθ(x(i)))xj(i) (for every j)}
可以发现,这与线性规划的迭代公式一样,但它们不是同一个算法,因为目标函数
h
θ
(
x
)
h_\theta(x)
hθ(x)不同了。
Exercise 1B
在ex1/ex1b_logreg.m
文件中的代码实现的是对28*28像素大小的0或者1的数字图片进行分类。这里需要我们完成的部分就是在logistic_regression.m
文件中计算目标函数
l
(
θ
)
l(\theta)
l(θ)以及梯度
∂
∂
θ
j
l
(
θ
)
\frac{\partial}{\partial \theta_j}l(\theta)
∂θj∂l(θ)。
具体代码如下所示:
%compute the value of f
for i=1 : m
f = f - (y(i) * log(1 / (1 + exp(-theta' * X(:,i)))) + (1 - y(i)) * log(1 - 1 / (1 + exp(-theta' * X(:,i)))));
end
% compute the gradient
for i = 1 : size(X,1)
for j = 1 : m
g(i) = g(i) + X(i,j) * (1 / (1 + exp(-theta' * X(:,j))) - y(j));
end
end
最终训练数据以及测试数据的正确率都能达到100%,这是由于此分类任务较简单,且数据集充足。在一般分类问题中很难达到100%的正确率。
但此训练运行耗时巨大,共计花费约100分钟,主要在于
θ
\theta
θ每次迭代都需要遍历所有的训练数据,而我们的代码使用循环来完成,是完全串行的,使运行时间大大增长。下一节会描述如何将数据向量化,从而加快了运行速度。