UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!
第二节是:Logistic Regression(逻辑回归)
我们之前看过的Linear Regression(线性回归)是争对连续值预测的,但是这并不能很好地处理二分类问题,也就是
y
(
i
)
∈
{
0
,
1
}
y^{(i)} \in\{0,1\}
y(i)∈{0,1}的问题。我们就需要使用另外一个“hypothesis class”来预测当给了一个样本,有多少的可能性它是属于0还是属于1,其实“逻辑回归”名字上有回归二字,其实是一个分类算法。以下是要学习的函数:
P
(
y
=
1
∣
x
)
=
h
θ
(
x
)
=
1
1
+
exp
(
−
θ
⊤
x
)
≡
σ
(
θ
⊤
x
)
P
(
y
=
0
∣
x
)
=
1
−
P
(
y
=
1
∣
x
)
=
1
−
h
θ
(
x
)
\begin{array}{l}{P(y=1 | x)=h_{\theta}(x)=\frac{1}{1+\exp \left(-\theta^{\top} x\right)} \equiv \sigma\left(\theta^{\top} x\right)} \\ {P(y=0 | x)=1-P(y=1 | x)=1-h_{\theta}(x)}\end{array}
P(y=1∣x)=hθ(x)=1+exp(−θ⊤x)1≡σ(θ⊤x)P(y=0∣x)=1−P(y=1∣x)=1−hθ(x)
其中的
σ
(
z
)
≡
1
1
+
exp
(
−
z
)
\sigma(z) \equiv \frac{1}{1+\exp (-z)}
σ(z)≡1+exp(−z)1就是大名鼎鼎的sigmoid函数,输出介于0和1之间,所以我们也可以把
h
θ
(
x
)
h_{\theta}(x)
hθ(x)理解为
y
=
1
y=1
y=1的概率,
1
−
h
θ
(
x
)
1-h_{\theta}(x)
1−hθ(x)就是
y
=
0
y=0
y=0的概率。
我们要优化的目标函数是这样的,是一个二分类的交叉熵:
J
(
θ
)
=
−
∑
i
(
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
)
J(\theta)=-\sum_{i}\left(y^{(i)} \log \left(h_{\theta}\left(x^{(i)}\right)\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right)
J(θ)=−i∑(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
可以分析得到,当
y
(
i
)
∈
1
y^{(i)}\in1
y(i)∈1的时候,要减少cost的值的话,那就得让
h
θ
(
x
(
i
)
)
h_{\theta}\left(x^{(i)}\right)
hθ(x(i))增大,即让
y
y
y是1的概率增大;
y
(
i
)
∈
0
y^{(i)}\in0
y(i)∈0的时候亦然。
我们可以推导出梯度的表达式和线性回归里面一样,一开始我也很惊讶,后来推了一下确实是如此的,大伙可以自己推一下,实在不明白下面留言。只是这里的hypothesis function是
h
θ
(
x
)
=
σ
(
θ
⊤
x
)
h_{\theta}(x)=\sigma\left(\theta^{\top} x\right)
hθ(x)=σ(θ⊤x),不再是线性回归里面的
h
θ
(
x
)
=
θ
⊤
x
h_{\theta}(x)=\theta^{\top} x
hθ(x)=θ⊤x:
∂
J
(
θ
)
∂
θ
j
=
∑
i
x
j
(
i
)
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
\frac{\partial J(\theta)}{\partial \theta_{j}}=\sum_{i} x_{j}^{(i)}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)
∂θj∂J(θ)=i∑xj(i)(hθ(x(i))−y(i))
向量化的写法就是:
∇
θ
J
(
θ
)
=
∑
i
x
(
i
)
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
\nabla_{\theta} J(\theta)=\sum_{i} x^{(i)}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)
∇θJ(θ)=i∑x(i)(hθ(x(i))−y(i))
之后也是在logistic_regression.m文件中编写好损失函数和梯度,然后分别赋给
f
f
f和
g
g
g就可以运行ex1/ex1b_logreg.m了。
这是我的代码,里面的路径自己改一下,我用的是MATLAB2016a:
function [f,g] = logistic_regression(theta, X,y)
%
% Arguments:
% theta - A column vector containing the parameter values to optimize.
% X - The examples stored in a matrix.
% X(i,j) is the i'th coordinate of the j'th example.
% y - The label for each example. y(j) is the j'th example's label.
%
m=size(X,2);
n=size(X,1);
% initialize objective value and gradient.
f = 0;
g = zeros(size(theta));
%
% TODO: Compute the objective function by looping over the dataset and summing
% up the objective values for each example. Store the result in 'f'.
%
% TODO: Compute the gradient of the objective by looping over the dataset and summing
% up the gradients (df/dtheta) for each example. Store the result in 'g'.
%
%%% MY CODE HERE %%%
h = inline('1./(1+exp(-z))');
% Calculate f
temp = zeros(1,m);
for i=1:m
for j=1:n
temp(i) = temp(i) + theta(j) * X(j,i);
end
end
h_temp = h(temp);
for i = 1:m
f = f - (y(i) * log(h_temp(i)) + (1-y(i)) * log(1-h_temp(i)));
end
% Calculate g
for j=1:n
for i=1:m
g(j) = g(j) + X(j,i) * (h_temp(i) - y(i));
end
end
运行结果:
有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!