测试

梯度下降

方向导数

​ 设三元函数\(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)}\)来进行更新迭代,即每次随机选择一个数据集来更新,这样的算法叫做随机梯度算法。

参考文献

  1. 梯度下降深入浅出
  2. 方向导数与梯度
posted @ 2016-05-28 13:20  狂徒归来  阅读(203)  评论(0编辑  收藏  举报