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


写这个博客是因为最近我在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)=θ0x0+θ1x1h_\theta(x)=\theta_0x_0+\theta_1x_1,则梯度下降过程如下:
temp0:=θ0αJθ(x)θ0temp_0:=\theta_0-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_0}
temp1:=θ1αJθ(x)θ1temp_1:=\theta_1-\alpha\frac{\partial J_\theta(\mathbf{x})}{\partial \theta_1}
θ0:=temp0,θ1:=temp1\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存储到某个中间变量中(如上述的temp0temp_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}
这个问题可以用画图的问题去解决:
Machine Learning-Andrew Ng 课程第一、二周——梯度下降法(单变量、多变量)
如图,横坐标为θ\theta,纵坐标为JθJ_\theta,为了讲述方便,设θ\theta为标量,即只有一个参数。JθJ_\theta是cost function,P1P_1P2P_2分别代表某次迭代前的θi\theta{i}P3P_3P4P_4分别代表该次迭代后的θi+1\theta_{i+1}

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

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

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

3. 批(Batch)梯度下降和随机(Stochastic)梯度下降

所谓批梯度下降,即每次迭代更新θ\theta时都用到所有的训练样本:
θi:=θiαj=1m(θixi(j)y(j))xi(j)\theta_i:=\theta_i-\alpha\sum_{j=1}^{m}{(\theta_ix_i^{(j)}-y^{(j)})x_i^{(j)}}
mm是训练样本数量,iiθ\thetaxx的下标(线性回归的假设hθ=θ0x0+θ1x0+...+θnxnh_\theta=\theta_0x_0+\theta_1x_0+...+\theta_nx_n
但是当训练样本数量太大时,这样的迭代速度就比较慢了,所以有了随机梯度下降法,一次迭代只用一个样本:
θi:=θiα(θixi(j)y(j))xi(j)\theta_i:=\theta_i-\alpha(\theta_ix_i^{(j)}-y^{(j)})x_i^{(j)}
在样本数量足够大的情况下,一轮迭代只用一个样本,既可以达到足够的迭代次数,也大大减少了运算负担。虽然这样做会使梯度下降的过程更加“曲折”,但最后仍会趋向最优值。

4. Normalized Features

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

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

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

θTx\theta^T\mathbf{x}:只有一个参数和一种特征的情况下会使用,多数情况下只是为了讲解方便才会使用,通常情况下都是多参数。
θ=[θ0 θ1 ... θn]T\theta=[\theta_0 \space \theta_1 \space ... \space \theta_n]^T
x=[x0 x1 ... xn]T\mathbf{x}=[x_0 \space x_1 \space ... \space x_n]^T
θTx=θ0x0+θ1x1+...+θnxn\therefore \theta^T\mathbf{x}=\theta_0x_0+\theta_1x_1+...+\theta_nx_n

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