• 测试


    梯度下降

    方向导数

    ​ 设三元函数(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. 方向导数与梯度
  • 相关阅读:
    MySQL体系结构
    简单高效的代码部署方法
    笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
    笔试算法题(06):最大连续子数组和 & 二叉树路径和值
    笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
    笔试算法题(04):实现 string & memcpy & strcpy & strlen
    笔试算法题(03):最小第K个数 & 判定BST后序序列
    笔试算法题(02):N阶阶乘 & 双向循环链表实现
    笔试算法题(01):字符串倒置 & 八皇后问题
    chosen选择框加载数据
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/5537222.html
Copyright © 2020-2023  润新知