机器学习:梯度下降法(调试、其它思考)

一、梯度下降法的调试

 1)疑问 / 难点

  • 如何确定梯度下降法的准确性?
  • 损失函数的变量 theta 在某一点上对应的梯度是什么?
  • 在更负责的模型中,求解梯度更加不易;
  • 有时候,推导出公式后,并将其运用到程序中,但当程序运行时,有时对梯度的计算可能会出现错误,怎么才能发现这种错误?

 2)梯度下降法的调试思路

  • 调试思路
  1. 如果机器学习的算法涉及到求解梯度,先使调试方式求出梯度,提前得到此机器学习算法的正确结果;
  2. 数学推导方式(根据算法模型推导出的求解梯度的公式)求出梯度的数学解,将数学解带入机器学习算法中,得出结果;
  3. 对比两种最终得到的结果是否一致,如果一样,则此数学推导公式可用,如果不一样,则此数学推导公式待改进;

 3)公式的确定

  • 导数的推导过程
  • 公式:
  • 梯度的求解的思路,与导数类似
  • 最终推导出的调试的公式
  1. θ:损失函数的变量(theta)
  2. θ1+  =  θ + ε:表示 θ 右侧的点的变量;
  3. θ1-  =  θ - ε:表示 θ 左侧的点的变量;
  4. θ1+  -  θ  ==  θ  -  θ1-  ==  ε
  • 调试公式的特点:时间复杂度高,每求一次梯度都要花相当多的时间,因此一般此种求解梯度的方式只用于调试;

 4)代码实现

  • 数学模型推导方式求梯度

    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(666)
    X = np.random.random(size=(1000, 10))
    true_theta = np.arange(1, 12, dtype=float)
    
    X_b = np.hstack([np.ones((len(X), 1)), X])
    y = X_b.dot(true_theta) + np.random.normal(size=1000)
    
    def J(theta, X_b, y):
        """求当前 theta 的损失函数"""
        try:
            return np.sum((y - X_b.dot(theta)) ** 2) / len(X_b)
        except:
            return float(‘inf‘)
    
    def dJ_math(theta, X_b, y):
        """使用模型推导公式求当前 theta 对应的梯度"""
        return X_b.T.dot(X_b.dot(theta) - y) * 2. / len(y)true_theta
  1. true_theta:有 11 个元素,因为包含截距;
  2. true_theta = np.arange(1, 12, dtype=float):是一个一位数组,并没有转置为向量;
  3. X_b.dot(true_theta) + np.random.normal(size = 1000):此时用 矩阵 . dot(一维数组) + 一维数组;
  • 调试方式求梯度:

    def dJ_debug(theta, X_b, y, epsilon=0.01):
        """使用调试方式求当前 theta 对应的梯度"""
    
        res = np.empty(len(theta))
        for i in range(len(theta)):
            theta_1 = theta.copy()
            theta_1[i] += epsilon
            theta_2 = theta.copy()
            theta_2[i] -= epsilon
            res[i] = (J(theta_1, X_b, y) - J(theta_2, X_b, y)) / (2*epsilon)
    
        return res
  1. res:当前 theta 对应的梯度;
  2. theta_1 = theta.copy():将 theta 向量复制给 theta_1;#  此处的 copy() 是序列的方法;
  3. 特点由于该求解过程与函数 J() 的内部实现无关,该过程适用于所有函数的梯度求解;
  • 批量梯度下降法优化

    def gradient_descent(dJ, X_b, y, initial_theta, eta, n_iters=10**4, epsilon=10**-8):
    
        theta = initial_theta
        cur_iter = 0
    
        while cur_iter < n_iters:
            gradient = dJ(theta,X_b, y)
            last_theta = theta
            theta = theta - eta * gradient
            if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
                break
    
            cur_iter += 1
    
        return theta
  1. dJ:代表求梯度的函数,这里作为参数,可以传入不同方法求解梯度;
  • 初始化后得到结果(一):使用调试方式求解梯度

    initial_theta = np.zeros(X_b.shape[1])
    eta = 0.01
    
    %time theta = gradient_descent(dJ_debug, X_b, y, initial_theta, eta)
    theta
    # 输出:Wall time: 4.89 s
           array([ 1.1251597 ,  2.05312521,  2.91522497,  4.11895968,  5.05002117,
            5.90494046,  6.97383745,  8.00088367,  8.86213468,  9.98608331,
           10.90529198])
  1. initial_theta:theta 的初始化值,为一个向量,一般设置为全 0 向量;
  • 初始化后得到结果(二):使用模型推导的公式求解梯度

    %time theta = gradient_descent(dJ_math, X_b, y, initial_theta, eta)
    theta
    # 输出:Wall time: 652 ms
           array([ 1.1251597 ,  2.05312521,  2.91522497,  4.11895968,  5.05002117,
            5.90494046,  6.97383745,  8.00088367,  8.86213468,  9.98608331,
           10.90529198])
  • 两种结果对比:
  1. 调试公式求梯度,最终可以得到结果,但运行速度较慢;
  2. 通过(dJ_debug 函数)计算过程可以看出,这种调试方法对梯度的计算,适用于一切目标函数;

二、梯度下降法的其它思考

  • 注:计算中有看不懂的地方,要对照着公式的推导过程理解;

 1)梯度下降法类型类

  • 批量梯度下降法(Batch Gradient Descent)
  1. 每一次都对所有样本进行计算,求出梯度
  2. 缺点:运算速度较慢;
  3. 优点:稳定,按此梯度方向,损失函数一定减小最快;
  • 随机梯度下降法(Stochastic Gradient Descent)
  1. 每一次只对随机抽取的一个样本,求出其梯度,作为 theta 的优化方向;
  2. 优点:运算速度较快;
  3. 缺点:不稳定,每一次的优化方向是不确定的,甚至有可能像反方向优化;
  • 小批量梯度下降法(Mini-Batch Gradient Descent)
  1. 综合了批量梯度下降法和随机梯度下降法的优点,避免了它们的确定;
  2. 思路:每次计算优化的方向(梯度),即不是查看所有样本也不只看一个样本,而是每次抽取 k 个样本,把这 k 个样本的梯度作为优化方向;
  3. 优点(一):比批量梯度下降法运算量小,速度快;
  4. 优点(二):比随机梯度下降法更稳定,获取的优化方向更能偏向批量梯度下降法中的梯度方向;
  5. 缺点:增加了一个新的超参数 k ,每一批该去多少个样本?
  6. k 个样本的梯度求解:和批量梯度下降法的求解过程一样;

 2)随机的优点

  1. 跳出局部最优解:更能找到损失函数的整体最优解,而不像批量梯度下降法那样,每次选取初始值后,可能只优化得到一个局部最小值,而不是损失函数整体的最小值;
  2. 更快的运行速度
  3. 机器学习领域很多算法都要使用随机的特点:随机森林、随机搜索
  • 机器学习领域解决的本身就是在不确定的世界中的不确定的问题,它本身可能就没有一个固定的最优解,因此随机扮演了一个重要的角色;

 3)梯度下降法理解回顾

  1. 不是一个机器学习算法
  2. 是一种基于搜索的最优化方法
  3. 作用:最小化一个损失函数
  • 梯度上升法
  1. 作用:最大化一个效用函数
  2. 每次参数 theta 加上变化量;

原文地址:https://www.cnblogs.com/volcao/p/9154872.html

时间: 2024-11-09 00:56:45

机器学习:梯度下降法(调试、其它思考)的相关文章

[机器学习]—梯度下降法

机器学习中往往需要刻画模型与真实值之间的误差,即损失函数,通过最小化损失函数来获得最优模型.这个最优化过程常使用梯度下降法完成.在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值. 1. 梯度 解释梯度之前需要解释导数与偏导数.导数与偏导数的公式如下: 导数与偏导数都是自变量趋于0时,函数值的变化量与自变量的变化量的比值,反应了函数f(x)在某一点沿着某一方向的变化率.导数中该方向指的是x轴正方向,偏导数中指的是向量x所在空间中一组单位正交基()中某

Hulu机器学习问题与解答系列 | 二十四:随机梯度下降法

Hulu优秀的作者们每天和公式抗争,只为提升你们的技能,感动的话就把文章看完,然后哭一个吧. 今天的内容是 [随机梯度下降法] 场景描述 深度学习得以在近几年迅速占领工业界和学术界的高地,重要原因之一是数据量的爆炸式增长.如下图所示,随着数据量的增长,传统机器学习算法的性能会进入平台期,而深度学习算法因其强大的表示能力,性能得以持续增长,甚至在一些任务上超越人类.因此有人戏称,"得数据者得天下". 经典的优化方法,例如梯度下降法,每次迭代更新需要用到所有的训练数据,这给求解大数据.大规

机器学习中常见问题_几种梯度下降法

一.梯度下降法 在机器学习算法中,对于很多监督学习模型,需要对原始的模型构建损失函数,接下来便是通过优化算法对损失函数进行优化,以便寻找到最优的参数.在求解机器学习参数的优化算法中,使用较多的是基于梯度下降的优化算法(Gradient Descent, GD). 梯度下降法有很多优点,其中,在梯度下降法的求解过程中,只需求解损失函数的一阶导数,计算的代价比较小,这使得梯度下降法能在很多大规模数据集上得到应用.梯度下降法的含义是通过当前点的梯度方向寻找到新的迭代点. 基本思想可以这样理解:我们从山

机器学习之梯度下降法

在吴恩达的机器学习课程中,讲了一个模型,如何求得一个参数令错误函数值的最小,这里运用梯度下降法来求得参数. 首先任意选取一个θ 令这个θ变化,怎么变化呢,怎么让函数值变化的快,变化的小怎么变化,那么函数值怎么才能变小变得快呢,求偏导,刚开始不太清楚,就是要求每一个θ,看看错误函数在哪一个方向上变化得快,所有θ的分量集合起来,就能让J(θ)变化变小的最快.

机器学习初学心得——梯度下降法

回归与梯度下降: 回归在数学上来说是给定一个点集,能够用一条曲线去拟合之,如果这个曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归,回归还有很多的变种,如locally weighted回归,logistic回归,等等,这个将在后面去讲. 用一个很简单的例子来说明回归,这个例子来自很多的地方,也在很多的open source的软件中看到,比如说weka.大概就是,做一个房屋价值的评估系统,一个房屋的价值来自很多地方,比如说面积.房间的数量(几室几厅).地段.朝向等等,

Stanford机器学习课程笔记——单变量线性回归和梯度下降法

Stanford机器学习课程笔记--单变量线性回归和梯度下降法 1. 问题引入 单变量线性回归就是我们通常说的线性模型,而且其中只有一个自变量x,一个因变量y的那种最简单直接的模型.模型的数学表达式为y=ax+b那种,形式上比较简单.Stanford的机器学习课程引入这个问题也想让我们亲近一下machine learning这个领域吧~吴恩达大神通过一个房屋交易的问题背景,带领我们理解Linear regression with one variable.如下: 不要看这个问题简答,大神就是大神

谷歌机器学习速成课程---3降低损失 (Reducing Loss):梯度下降法

迭代方法图(图 1)包含一个标题为"计算参数更新"的华而不实的绿框.现在,我们将用更实质的方法代替这种华而不实的算法. 假设我们有时间和计算资源来计算 w1 的所有可能值的损失.对于我们一直在研究的回归问题,所产生的损失与 w1 的图形始终是凸形.换言之,图形始终是碗状图,如下所示: 图 2. 回归问题产生的损失与权重图为凸形. 凸形问题只有一个最低点:即只存在一个斜率正好为 0 的位置.这个最小值就是损失函数收敛之处. 通过计算整个数据集中 w1 每个可能值的损失函数来找到收敛点这种

机器学习入门之单变量线性回归(上)——梯度下降法

在统计学中,线性回归(英语:linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归(multivariate linear regression).——————维基百科 一直以来,这部分内容都是ML的敲门砖,吴恩达教授在他的课程中也以此为第一个例子,同时,本篇也参考了许多吴教授的内容. 在这里,我简单把

【机器学习】机器学习入门05 - 梯度下降法

1. 梯度下降法介绍 1.1 梯度 在多元函数微分学中,我们都接触过梯度(Gradient)的概念. 回顾一下,什么是梯度? 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模). 这是百度百科给出的解释. 事实上,梯度的定义,就是多元函数的偏导数组成的向量.以二元函数 f(x,y) 为例.fx, fy 分别表示 f  对x,y的偏导数.则 f 在(x, y)处的梯度grad f = ( f