Machine Learning-Andrew Ng 课程第一、二周——梯度下降法(单变量、多变量)

版权声明: https://blog.csdn.net/Dr_destiny/article/details/82754132


写这个博客是因为最近我在Coursera上学习吴恩达的机器学习课程,为了巩固所学,记录在学习中遇到的一些问题。之后每一周都会在这里进行分享。

第一、二周的内容是围绕线性回归展开的,其中最重要的一个部分就是梯度下降法(Gradient Descent),这是一个用来求解假设 h θ ( x ) h_\theta(x) 中参数 θ \theta 的算法。下面就是我在学习梯度下降法时遇到的一些值得注意的点。

1. Simultaneous Update

梯度下降法中,需要通过不断迭代更新参数 θ \theta (每一次迭代可能会用到所有训练样本,也有可能只用到一个训练样本,这就是批梯度下降和随机梯度下降的区别,这将会在第3点讲到),直到cost function J θ ( x ) J_\theta(x) 收敛。在更新过程中, θ \theta 中的所有参数 [ θ 0   θ 1   . . .   θ n ] [\theta_0 \space \theta_1 \space ... \space \theta_n] 需要遵循Simultaneous Update的规则,即同时更新,以单变量的梯度下降为例,令假设为 h θ ( x ) = θ 0 x 0 + θ 1 x 1 h_\theta(x)=\theta_0x_0+\theta_1x_1 ,则梯度下降过程如下:
t e m p 0 : = θ 0 α J θ ( x ) θ 0 temp_0:=\theta_0-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_0}
t e m p 1 : = θ 1 α J θ ( x ) θ 1 temp_1:=\theta_1-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_1}
θ 0 : = t e m p 0 , θ 1 : = t e m p 1 \theta_0:=temp_0,\theta_1:=temp_1
之所以采取中间变量,是因为在一次迭代过程中,所有式子里 J θ J_\theta 都是一样的,也就是说, θ 0 \theta_0 更新后,不能立刻将 J θ J_\theta 中的 θ 0 \theta_0 替换然后用替换后的 J θ J_\theta 用去更新 θ 1 \theta_1 ,而应该将 θ 0 \theta_0 存储到某个中间变量中(如上述的 t e m p 0 temp_0 ),继续用 J θ J_\theta 更新,直到该次迭代结束,再将中间变量的值赋给 θ = [ θ 0   θ 1   . . .   θ n ] \theta=[\theta_0 \space \theta_1 \space ... \space \theta_n] ,完成更新,再开始下一次的迭代。

2. 梯度下降法中的减号

为什么在梯度下降法的公式中要用减号而不是加号呢?
θ i : = θ i α J θ ( x ) θ 0 \theta_i:=\theta_i-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_0}
这个问题可以用画图的问题去解决:
在这里插入图片描述
如图,横坐标为 θ \theta ,纵坐标为 J θ J_\theta ,为了讲述方便,设 θ \theta 为标量,即只有一个参数。 J θ J_\theta 是cost function, P 1 P_1 P 2 P_2 分别代表某次迭代前的 θ i \theta{i} P 3 P_3 P 4 P_4 分别代表该次迭代后的 θ i + 1 \theta_{i+1}

可以看出, P 1 P_1 点的梯度是负的,假设梯度下降法的公式中用了加号,又因为 α \alpha 为正值,那么 θ i + 1 \theta_{i+1} 就会比 θ i \theta{i} 小,反而是向着与最优点相反的方向前进,而我们是想尽快到达最优点,所以这与我们的目标相反。

而如果梯度下降法的公式中用了减号,那么 θ i + 1 \theta_{i+1} 就会比 θ i \theta{i} 大,是朝着最优点的方向前进的,符合我们的要求。

P 3 P_3 P 4 P_4 的例子同理。综上所述,减号是为了确保每一次迭代都向着最优值的方向前进。

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)}}
m m 是训练样本数量, i i θ \theta x x 的下标(线性回归的假设 h θ = θ 0 x 0 + θ 1 x 0 + . . . + θ n x n h_\theta=\theta_0x_0+\theta_1x_0+...+\theta_nx_n
但是当训练样本数量太大时,这样的迭代速度就比较慢了,所以有了随机梯度下降法,一次迭代只用一个样本:
θ 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)}
在样本数量足够大的情况下,一轮迭代只用一个样本,既可以达到足够的迭代次数,也大大减少了运算负担。虽然这样做会使梯度下降的过程更加“曲折”,但最后仍会趋向最优值。

4. Normalized Features

在多变量梯度下降中,会涉及到多个不同的特征,这些特征不一定都是相同的数量级,比如在预测房价的问题中,房屋面积、卧室数量这两个特征就不是一个数量级。为了使梯度下降更快,我们需要对特征进行归一化。
设特征为 x 1 x_1 x 2 x_2 x n x_n x 0 = 1 x_0=1 ,因此无需归一化),归一化公式如下:
x i : = x i μ i σ i x_i:=\frac{x_i-\mu_i}{\sigma_i}
其中 μ i \mu_i 是训练样本中特征 x i x_i 对应的那一列的平均值, σ i \sigma_i 则是相对应的标准差(极差也可以)。

这里尤其需要注意的是:在已经得到最优参数,进行预测时,输入也要做归一化!否则输出不正确!(因为参数都是根据归一化特征得到的)

5. θ T x \theta^T\mathbf{x} X θ X\theta 之间的区别

θ T x \theta^T\mathbf{x} :只有一个参数和一种特征的情况下会使用,多数情况下只是为了讲解方便才会使用,通常情况下都是多参数。
θ = [ θ 0   θ 1   . . .   θ n ] T \theta=[\theta_0 \space \theta_1 \space ... \space \theta_n]^T
x = [ x 0   x 1   . . .   x n ] T \mathbf{x}=[x_0 \space x_1 \space ... \space x_n]^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

X θ X\theta :现实问题中,通常有许多特征,所以会将所有特征所有训练样本放在同一个矩阵 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 θ = [ θ 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 X m ( n + 1 ) m*(n+1) 的矩阵, θ \theta ( n + 1 ) 1 (n+1)*1 的向量, θ T X \theta^TX 是无法运算的,所以是 X θ X\theta

猜你喜欢

转载自blog.csdn.net/Dr_destiny/article/details/82754132