梯度下降
方向导数
设三元函数\(f\)在点\(p_0(x_0, y_0, z_0)\)的某领域\(U(P_0)\subset \mathbf{R}^3\)有定义,\(l\)为从点\(P_0\)出发的射线,\(P(x, y, z)\)为\(l\)上且含于\(U(P_0)\)内任一点,以\(\rho\)表示\(P\)与\(P_0\)两点间的距离,若极限
\[ \lim\limits_{\rho\rightarrow 0^+}\dfrac{f(P)-f(P_0)}{\rho}=\lim\limits_{\rho\rightarrow 0^+}\dfrac{\Delta_lf}{\rho} \]
存在,则称此极限为函数\(f\)在点\(P_0\)沿方向\(l\)的方向导数,记作
\[ \dfrac{\partial f}{\partial l}\Bigg |_{P_0},f_l(P_0)\text{或}f_l(x_0, y_0, z_0) \]
若函数\(f\)在点\(P_0(x_0, y_0, z_0)\)可微,则\(f\)在点\(P_0\)沿任一方向\(\mathcal{l}\)的方向导数都存在,且
\[ f_l(P_0)=f_x(P_0)\cos\alpha + f_x(P_0)\cos\beta + f_z(P_0)\cos\gamma \]
其中\(cos\alpha, \cos\beta, \cos\gamma\)为方向\(l\)方向余弦。
梯度
若\(f(x, y, z)\)在点\(P_0(x_0, y_0, z_0)\)存在对所有自变量的偏导数,则称向量\((f_x(P_0), f_y(P_0), f_z(P_0))\)为函数\(f\)在点\(P_0\)的梯度。记作
\[ grad\; f(P_0) = (f_x(P_0), f_y(P_0), f_z(P_0)) \]
向量\(grad\;f\)的长度(或模)为
\[ |grad\; f(P_0)| = \sqrt{f_x(P_0)^2+f_y(P_0)^2+f_z(P_0)^2} \]
若记\(l\)方向上的单位向量为
\[ l_0 = (\cos\alpha,\cos\beta,\cos\gamma) \]
于是方向导数公式又可写成
\[ f_l(P_0) = grad\; f(P_0)\cdot l_0 = |grad\; f(P_0)||l_0|\cos\theta = |grad\; f(P_0)|\cos\theta \]
这里\(\theta\)是梯度向量\(grad\;f(P_0)\)与\(l_0\)的夹角。
因此当\(\theta = 0\)时,\(f_l(P_0)\)取最大值\(|grad\; f(P_0)|\)。这就是说,当\(f\)在点\(P_0\)可微时,\(f\)在点\(P_0\)的梯度方向是\(f\)的值增长最快的方向,并且沿这一方向的变化率是梯度的模;而当\(l\)与梯度向量反方向\(\theta = \pi\)时,方向导数取得最小值\(-|grad\;f(P_0)|\)。
梯度下降
由于我们的拟合函数是这样子的:\[h_{\theta}(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \ldots + \theta_nx_n\]
为了方便,设置初始值\(x_0=1\),那么得到拟合函数
\[ h(x) = \sum_{i=0}^{n}\theta_ix_i = \theta^Tx \]
\[ J(\theta) = \dfrac{1}{2}\sum_{i=0}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 \]
这是损失函数,用来表示拟合程度的好坏。现在要确定一组\(\theta_1, \theta_2,\ldots,\theta_n\)使得到的拟合函数\(h(x)=\sum_{i=0}^n\theta_ix_i\)让损失函数\(J(\theta)\)尽可能小。
为了确定\(\theta_0, \theta_1, \ldots, \theta_n\)的值,可以先对其赋一组初值,然后改变\(\theta\)的值,使得\(J(\theta)\)最小,由上面的梯度性质可以知道,函数\(J(\theta)\)在其负梯度方向下降最快,所以只要使得每个参数\(\theta\)按函负梯度方向改变,则\(J(\theta)\)将得到最小值,即
\[ \theta_i = \theta_i - \alpha\dfrac{\partial J(\theta)}{\partial\theta_i} \]
其中\(\alpha\)表示步长,即每次往下降最快方向走多远。
当只有一组数据时,由于
\[ \dfrac{\partial J(\theta)}{\partial \theta_i} = \dfrac{\partial}{\partial\theta_i}\frac{1}{2}(h_\theta(x) - y)^2=(h_\theta(x)-y)x_i \]
所以
\[ \theta_i = \theta_i - \alpha(h_\theta(x)-y)x_i \]
当有\(m\)组数据时
\[ \theta_i = \theta_i - \alpha\sum_{j=1}^{m}(h_\theta(x^{(j)}-y^{(j)}))x_i^{(j)} \]
每迭代一步,都要遍历到所有的训练数据,此时为批梯度下降算法,当\(m\)非常大的时候,此时算法收敛的得非常慢。所以在进行迭代的时候,让\(\theta_i = \theta_i - \alpha(h_\theta(x^{(j)})-y^{(j)})x_i^{(j)}\)来进行更新迭代,即每次随机选择一个数据集来更新,这样的算法叫做随机梯度算法。
参考文献
- 梯度下降深入浅出
- 方向导数与梯度