目录
写这个博客是因为最近我在Coursera上学习吴恩达的机器学习课程,为了巩固所学,记录在学习中遇到的一些问题。之后每一周都会在这里进行分享。
第一、二周的内容是围绕线性回归展开的,其中最重要的一个部分就是梯度下降法(Gradient Descent),这是一个用来求解假设 h θ ( x ) h_\theta(x) hθ(x)中参数 θ \theta θ的算法。下面就是我在学习梯度下降法时遇到的一些值得注意的点。
1. Simultaneous Update
梯度下降法中,需要通过不断迭代更新参数
θ
\theta
θ(每一次迭代可能会用到所有训练样本,也有可能只用到一个训练样本,这就是批梯度下降和随机梯度下降的区别,这将会在第3点讲到),直到cost function
J
θ
(
x
)
J_\theta(x)
Jθ(x)收敛。在更新过程中,
θ
\theta
θ中的所有参数
[
θ
0
θ
1
.
.
.
θ
n
]
[\theta_0 \space \theta_1 \space ... \space \theta_n]
[θ0 θ1 ... θn]需要遵循Simultaneous Update的规则,即同时更新,以单变量的梯度下降为例,令假设为
h
θ
(
x
)
=
θ
0
x
0
+
θ
1
x
1
h_\theta(x)=\theta_0x_0+\theta_1x_1
hθ(x)=θ0x0+θ1x1,则梯度下降过程如下:
t
e
m
p
0
:
=
θ
0
−
α
∂
J
θ
(
x
)
∂
θ
0
temp_0:=\theta_0-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_0}
temp0:=θ0−α∂θ0∂Jθ(x)
t
e
m
p
1
:
=
θ
1
−
α
∂
J
θ
(
x
)
∂
θ
1
temp_1:=\theta_1-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_1}
temp1:=θ1−α∂θ1∂Jθ(x)
θ
0
:
=
t
e
m
p
0
,
θ
1
:
=
t
e
m
p
1
\theta_0:=temp_0,\theta_1:=temp_1
θ0:=temp0,θ1:=temp1
之所以采取中间变量,是因为在一次迭代过程中,所有式子里
J
θ
J_\theta
Jθ都是一样的,也就是说,
θ
0
\theta_0
θ0更新后,不能立刻将
J
θ
J_\theta
Jθ中的
θ
0
\theta_0
θ0替换然后用替换后的
J
θ
J_\theta
Jθ用去更新
θ
1
\theta_1
θ1,而应该将
θ
0
\theta_0
θ0存储到某个中间变量中(如上述的
t
e
m
p
0
temp_0
temp0),继续用
J
θ
J_\theta
Jθ更新,直到该次迭代结束,再将中间变量的值赋给
θ
=
[
θ
0
θ
1
.
.
.
θ
n
]
\theta=[\theta_0 \space \theta_1 \space ... \space \theta_n]
θ=[θ0 θ1 ... θn],完成更新,再开始下一次的迭代。
2. 梯度下降法中的减号
为什么在梯度下降法的公式中要用减号而不是加号呢?
θ
i
:
=
θ
i
−
α
∂
J
θ
(
x
)
∂
θ
0
\theta_i:=\theta_i-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_0}
θi:=θi−α∂θ0∂Jθ(x)
这个问题可以用画图的问题去解决:
如图,横坐标为
θ
\theta
θ,纵坐标为
J
θ
J_\theta
Jθ,为了讲述方便,设
θ
\theta
θ为标量,即只有一个参数。
J
θ
J_\theta
Jθ是cost function,
P
1
P_1
P1和
P
2
P_2
P2分别代表某次迭代前的
θ
i
\theta{i}
θi,
P
3
P_3
P3和
P
4
P_4
P4分别代表该次迭代后的
θ
i
+
1
\theta_{i+1}
θi+1。
可以看出, P 1 P_1 P1点的梯度是负的,假设梯度下降法的公式中用了加号,又因为 α \alpha α为正值,那么 θ i + 1 \theta_{i+1} θi+1就会比 θ i \theta{i} θi小,反而是向着与最优点相反的方向前进,而我们是想尽快到达最优点,所以这与我们的目标相反。
而如果梯度下降法的公式中用了减号,那么 θ i + 1 \theta_{i+1} θi+1就会比 θ i \theta{i} θi大,是朝着最优点的方向前进的,符合我们的要求。
P 3 P_3 P3和 P 4 P_4 P4的例子同理。综上所述,减号是为了确保每一次迭代都向着最优值的方向前进。
3. 批(Batch)梯度下降和随机(Stochastic)梯度下降
所谓批梯度下降,即每次迭代更新
θ
\theta
θ时都用到所有的训练样本:
θ
i
:
=
θ
i
−
α
∑
j
=
1
m
(
θ
i
x
i
(
j
)
−
y
(
j
)
)
x
i
(
j
)
\theta_i:=\theta_i-\alpha\sum_{j=1}^{m}{(\theta_ix_i^{(j)}-y^{(j)})x_i^{(j)}}
θi:=θi−αj=1∑m(θixi(j)−y(j))xi(j)
m
m
m是训练样本数量,
i
i
i是
θ
\theta
θ和
x
x
x的下标(线性回归的假设
h
θ
=
θ
0
x
0
+
θ
1
x
0
+
.
.
.
+
θ
n
x
n
h_\theta=\theta_0x_0+\theta_1x_0+...+\theta_nx_n
hθ=θ0x0+θ1x0+...+θnxn)
但是当训练样本数量太大时,这样的迭代速度就比较慢了,所以有了随机梯度下降法,一次迭代只用一个样本:
θ
i
:
=
θ
i
−
α
(
θ
i
x
i
(
j
)
−
y
(
j
)
)
x
i
(
j
)
\theta_i:=\theta_i-\alpha(\theta_ix_i^{(j)}-y^{(j)})x_i^{(j)}
θi:=θi−α(θixi(j)−y(j))xi(j)
在样本数量足够大的情况下,一轮迭代只用一个样本,既可以达到足够的迭代次数,也大大减少了运算负担。虽然这样做会使梯度下降的过程更加“曲折”,但最后仍会趋向最优值。
4. Normalized Features
在多变量梯度下降中,会涉及到多个不同的特征,这些特征不一定都是相同的数量级,比如在预测房价的问题中,房屋面积、卧室数量这两个特征就不是一个数量级。为了使梯度下降更快,我们需要对特征进行归一化。
设特征为
x
1
x_1
x1、
x
2
x_2
x2…
x
n
x_n
xn(
x
0
=
1
x_0=1
x0=1,因此无需归一化),归一化公式如下:
x
i
:
=
x
i
−
μ
i
σ
i
x_i:=\frac{x_i-\mu_i}{\sigma_i}
xi:=σixi−μi
其中
μ
i
\mu_i
μi是训练样本中特征
x
i
x_i
xi对应的那一列的平均值,
σ
i
\sigma_i
σi则是相对应的标准差(极差也可以)。
这里尤其需要注意的是:在已经得到最优参数,进行预测时,输入也要做归一化!否则输出不正确!(因为参数都是根据归一化特征得到的)
5. θ T x \theta^T\mathbf{x} θTx和 X θ X\theta Xθ之间的区别
θ
T
x
\theta^T\mathbf{x}
θTx:只有一个参数和一种特征的情况下会使用,多数情况下只是为了讲解方便才会使用,通常情况下都是多参数。
θ
=
[
θ
0
θ
1
.
.
.
θ
n
]
T
\theta=[\theta_0 \space \theta_1 \space ... \space \theta_n]^T
θ=[θ0 θ1 ... θn]T
x
=
[
x
0
x
1
.
.
.
x
n
]
T
\mathbf{x}=[x_0 \space x_1 \space ... \space x_n]^T
x=[x0 x1 ... xn]T
∴
θ
T
x
=
θ
0
x
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
\therefore \theta^T\mathbf{x}=\theta_0x_0+\theta_1x_1+...+\theta_nx_n
∴θTx=θ0x0+θ1x1+...+θnxn
X
θ
X\theta
Xθ:现实问题中,通常有许多特征,所以会将所有特征所有训练样本放在同一个矩阵
X
X
X中:
X
=
[
x
0
(
1
)
x
1
(
1
)
x
2
(
1
)
.
.
.
x
n
(
1
)
x
0
(
2
)
x
1
(
2
)
x
2
(
2
)
.
.
.
x
n
(
2
)
x
0
(
3
)
x
1
(
3
)
x
2
(
3
)
.
.
.
x
n
(
3
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
x
0
(
m
)
x
1
(
m
)
x
2
(
m
)
.
.
.
x
n
(
m
)
]
X= \left[ \begin{matrix} x_0^{(1)} & x_1^{(1)} & x_2^{(1)} & ... & x_n^{(1)}\\ x_0^{(2)} & x_1^{(2)} & x_2^{(2)} & ... & x_n^{(2)}\\ x_0^{(3)} & x_1^{(3)} & x_2^{(3)} & ... & x_n^{(3)} \\ ... & ... & ... & ... & ...\\ x_0^{(m)} & x_1^{(m)} & x_2^{(m)} & ... & x_n^{(m)} \\ \end{matrix} \right]
X=⎣⎢⎢⎢⎢⎢⎡x0(1)x0(2)x0(3)...x0(m)x1(1)x1(2)x1(3)...x1(m)x2(1)x2(2)x2(3)...x2(m)...............xn(1)xn(2)xn(3)...xn(m)⎦⎥⎥⎥⎥⎥⎤
所以
X
θ
=
[
θ
0
x
0
(
1
)
+
θ
1
x
1
(
1
)
+
θ
2
x
2
(
1
)
+
.
.
.
+
θ
n
x
n
(
1
)
θ
0
x
0
(
2
)
+
θ
1
x
1
(
2
)
+
θ
2
x
2
(
2
)
+
.
.
.
+
θ
n
x
n
(
2
)
θ
0
x
0
(
3
)
+
θ
1
x
1
(
3
)
+
θ
2
x
2
(
3
)
+
.
.
.
+
θ
n
x
n
(
3
)
.
.
.
θ
0
x
0
(
m
)
+
θ
1
x
1
(
m
)
+
θ
2
x
2
(
m
)
+
.
.
.
+
θ
n
x
n
(
m
)
]
X\theta= \left[ \begin{matrix} \theta_0x_0^{(1)}+\theta_1x_1^{(1)}+\theta_2x_2^{(1)}+... +\theta_nx_n^{(1)}\\ \theta_0x_0^{(2)}+\theta_1x_1^{(2)}+\theta_2x_2^{(2)}+... +\theta_nx_n^{(2)}\\ \theta_0x_0^{(3)}+\theta_1x_1^{(3)}+\theta_2x_2^{(3)}+... +\theta_nx_n^{(3)}\\ ...\\ \theta_0x_0^{(m)}+\theta_1x_1^{(m)}+\theta_2x_2^{(m)}+... +\theta_nx_n^{(m)}\\ \end{matrix} \right]
Xθ=⎣⎢⎢⎢⎢⎢⎡θ0x0(1)+θ1x1(1)+θ2x2(1)+...+θnxn(1)θ0x0(2)+θ1x1(2)+θ2x2(2)+...+θnxn(2)θ0x0(3)+θ1x1(3)+θ2x2(3)+...+θnxn(3)...θ0x0(m)+θ1x1(m)+θ2x2(m)+...+θnxn(m)⎦⎥⎥⎥⎥⎥⎤
因为
X
X
X是
m
∗
(
n
+
1
)
m*(n+1)
m∗(n+1)的矩阵,
θ
\theta
θ是
(
n
+
1
)
∗
1
(n+1)*1
(n+1)∗1的向量,
θ
T
X
\theta^TX
θTX是无法运算的,所以是
X
θ
X\theta
Xθ。