测试

梯度下降

方向导数

​ 设三元函数(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))内任一点,以( ho)表示(P)(P_0)两点间的距离,若极限

[limlimits_{ ho ightarrow 0^+}dfrac{f(P)-f(P_0)}{ ho}=limlimits_{ ho ightarrow 0^+}dfrac{Delta_lf}{ ho} ]

存在,则称此极限为函数(f)在点(P_0)沿方向(l)的方向导数,记作

[dfrac{partial f}{partial l}Bigg |_{P_0},f_l(P_0) ext{或}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)cosalpha + f_x(P_0)coseta + f_z(P_0)cosgamma ]

其中(cosalpha, coseta, cosgamma)为方向(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 = (cosalpha,coseta,cosgamma) ]

于是方向导数公式又可写成

[f_l(P_0) = grad; f(P_0)cdot l_0 = |grad; f(P_0)||l_0|cos heta = |grad; f(P_0)|cos heta ]

这里( heta)是梯度向量(grad;f(P_0))(l_0)的夹角。

​ 因此当( heta = 0)时,(f_l(P_0))取最大值(|grad; f(P_0)|)。这就是说,当(f)在点(P_0)可微时,(f)在点(P_0)的梯度方向是(f)的值增长最快的方向,并且沿这一方向的变化率是梯度的模;而当(l)与梯度向量反方向( heta = pi)时,方向导数取得最小值(-|grad;f(P_0)|)

梯度下降

由于我们的拟合函数是这样子的:$$h_{ heta}(x) = heta_0 + heta_1x_1 + heta_2x_2 + ldots + heta_nx_n$$

为了方便,设置初始值(x_0=1),那么得到拟合函数

[h(x) = sum_{i=0}^{n} heta_ix_i = heta^Tx ]

[J( heta) = dfrac{1}{2}sum_{i=0}^{m}(h_ heta(x^{(i)})-y^{(i)})^2 ]

这是损失函数,用来表示拟合程度的好坏。现在要确定一组( heta_1, heta_2,ldots, heta_n)使得到的拟合函数(h(x)=sum_{i=0}^n heta_ix_i)让损失函数(J( heta))尽可能小。

​ 为了确定( heta_0, heta_1, ldots, heta_n)的值,可以先对其赋一组初值,然后改变( heta)的值,使得(J( heta))最小,由上面的梯度性质可以知道,函数(J( heta))在其负梯度方向下降最快,所以只要使得每个参数( heta)按函负梯度方向改变,则(J( heta))将得到最小值,即

[ heta_i = heta_i - alphadfrac{partial J( heta)}{partial heta_i} ]

其中(alpha)表示步长,即每次往下降最快方向走多远。

​ 当只有一组数据时,由于

[dfrac{partial J( heta)}{partial heta_i} = dfrac{partial}{partial heta_i}frac{1}{2}(h_ heta(x) - y)^2=(h_ heta(x)-y)x_i ]

所以

[ heta_i = heta_i - alpha(h_ heta(x)-y)x_i ]

当有(m)组数据时

[ heta_i = heta_i - alphasum_{j=1}^{m}(h_ heta(x^{(j)}-y^{(j)}))x_i^{(j)} ]

每迭代一步,都要遍历到所有的训练数据,此时为批梯度下降算法,当(m)非常大的时候,此时算法收敛的得非常慢。所以在进行迭代的时候,让( heta_i = heta_i - alpha(h_ heta(x^{(j)})-y^{(j)})x_i^{(j)})来进行更新迭代,即每次随机选择一个数据集来更新,这样的算法叫做随机梯度算法。

参考文献

  1. 梯度下降深入浅出
  2. 方向导数与梯度
原文地址:https://www.cnblogs.com/crackpotisback/p/5537222.html