zoukankan      html  css  js  c++  java
  • 【机器学习】梯度检验

    梯度检验的目的:

    当我们对一个复杂的模型,使用梯度下降算法时,可能会存在一些不容易察觉的错误,这意味着,虽然看上去代价在不断的减小,俺单身实际上最终结果并不是最优解。

    为了避免这种问题,我们采用一种被称作梯度检验的方法来检验我们所计算出来的导数的值是不是我们所想要的。这种方法的思想是通过梯度值来检验之前计算的导数是否符合要求。

    梯度检验的方法:

    在如图所示的曲线上取一点Θ,对Θ±ε,得打两个新的点,然后我们求出这两个点之间的斜率。通常ε非常小,约为1e-4。

    J’(Θ) = J(Θ+ε)- J(Θ-ε)/2*ε

    gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
    

    将该方法一般化,当 θ 是一个向量时,我们则需要对偏导数进行检验。

    最后我们还需要对通过反向传播方法计算出的偏导数进行检验。
    根据上面的算法,计算出的偏导数存储在矩阵中。检验时,我们要将该矩阵展开

    成为向量,同时我们也将 Θ 矩阵展开为向量,我们针对每一个 θ 都计算一个近似的梯度值,
    将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同进行比较。

    for i = 1:n,
    thetaPlus = theta;
    thetaPlus (i)  =  thetaPlus (i) + EPSION;
    thetaMinus = theta;
    thetaMinus(i) = thetaMinus(i) -  EPSION;
    gradApporx(i) = (J(thetaPlus) - J(thetaMinus))/(2*EPSION);
    end
    

      最后对gradApprox的值和DVec的值进行对比,保证他们之间的值相近

  • 相关阅读:
    AAC音频格式分析与解码
    SIGPIPE信号
    可变参数的宏定义
    Makefile条件编译debug版和release版
    Linux下查看内存使用情况
    Trie树 字典树
    C/C++随机数生成 rand() srand()
    关于编译安装Thrift找不到libthriftnb.a的问题
    Linux下使用popen()执行shell命令
    WebSocket协议分析
  • 原文地址:https://www.cnblogs.com/KID-XiaoYuan/p/7280859.html
Copyright © 2011-2022 走看看