二叔看ML第一:梯度下降


原理

梯度下降是一个很常见的通过迭代求解函数极值的方法,当函数非常复杂,通过求导寻找极值很困难时可以通过梯度下降法求解。梯度下降法流程如下:

上图中,用大写字母表示向量,用小写字母表示标量。

假设某人想入坑,他站在某点,他每移动一小步,都朝着他所在点的梯度的负方向移动,这样能保证他尽快入坑,因为某个点的梯度方向是最陡峭的方向,如下图所示,此图画的不太能表达这个观点,但是懒得盗图了,意会吧:

以下举两个例子,两个例子中的被求函数都很简单,其实直接求导算极值更好,此处仅用来说明梯度下降法的步骤。

实践一:求\(y = x^2 - 4x + 1\)的最小值

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

def descent(p, original_x = 50, steplength = 0.01):
    ''' gradient descent, return min y '''

    deriv = p.deriv(m = 1) # 多项式p的导函数
    Y = [] # 保存每次迭代后的y值,方便绘图
    count = 0 # 迭代次数
    x = original_x # 设置x初始值
    d = deriv(x) # x位置的导数
    threshold = 0.001 # 阈值,当梯度小于此值时停止迭代

    while np.abs(d) > threshold:
        x = x - d * steplength
        y = p(x)

        Y.append(y)
        count += 1
        d = deriv(x)

    plt.plot(np.arange(1, count + 1), Y)
    plt.show()
    return y

if __name__ == "__main__":
    p = np.poly1d([2, -4, 1])
    min_y = descent(p)
    print(min_y)  

把迭代数和对应的函数值绘制出来以查看迭代效果:

实践二:求\(z = x^2 + y^2 + 5\)的最小值

以下代码中,把一组x和y当成一个向量处理,即\(z = X^TX + 5\),其中\(X=[x\ y]^T\)

import numpy as np
import matplotlib.pyplot as plt

def deriv(xy):
    dxy = 2 * xy
    return dxy

def descent(xy, steplength = 0.01):
    ''' gradient descent, return min y '''

    d = deriv(xy) # x^2 + y^2 + 5的梯度
    Y = [] # 保存每次迭代后的y值,方便绘图
    count = 0 # 迭代次数
    threshold = 0.001 # 阈值,当梯度的模小于此值时停止迭代

    while np.linalg.norm(d) > threshold:
        xy = xy - d * steplength
        y = np.dot(xy, xy) + 5

        Y.append(y)
        count += 1
        d = deriv(xy)

    plt.plot(np.arange(1, count + 1), Y)
    plt.show()
    return Y[-1]

if __name__ == "__main__":
    y = descent(np.array([50, 50]))
    print(y)  

把迭代数和对应的函数值绘制出来以查看迭代效果:

问答时间

Q:无法收敛到某个足够小的函数值,最后报错: overflow ...
A:步长设置太大,步子大了,容易跨过最低点,导致函数值在最低点上下震荡或发散,如图:

可以人为设置迭代次数(而不是通过阈值控制是否继续迭代),然后观察函数值是否收敛:

Q:如何选择合适的步长
A:步长太大会导致函数值不收敛,步长太小又浪费性能,可以通过绘制如上面的迭代次数和函数值关系图,刚才结果后调整步长,尽量选择满足需求的最大步长。达爷在他的网课中给出的建议是:按照这样的序列试验步长:..., 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, ...。通过算法自动预测步长十分复杂,非二叔所能为。

Q:何时停止迭代?
A:可设定一个阈值,当梯度的模长小于这个阈值时停止迭代(当函数接近极值时,梯度接近0)。也可以人为通过刚才迭代次数和函数值图像设定迭代次数。

Q:是否还有其他迭代法?
A:还有牛顿法和拟牛顿法,和梯度下降法的区别是牛顿法不是沿着梯度负方向下降的,而是另一套算法得出的方向,下降速度更快。

Q:迭代法是否一定会找到函数值域内的最小值?
A:不是,如果函数不是一个凸函数,那么迭代法可能会找到一个局部最小值或鞍点值。

Q:函数最大值怎么找
A:给函数取个负号然后找最小值,或者沿着梯度方向前进而不是负梯度方向前进

原文地址:https://www.cnblogs.com/zzy0471/p/gradient_descent.html

时间: 2024-10-04 22:36:42

二叔看ML第一:梯度下降的相关文章

机器学习算法 --- 逻辑回归及梯度下降

一.逻辑回归简介 logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域. logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处. 其公式如下: 其图像如下: 我们通过观察上面的图像可以发现,逻辑回归的值域为(0, 1),当输入为0时,其输出为0.5:当输入小于0,并且越来越小时,其输出越来越接近于0:相反的,当其输入大于0,并且越来越大时,其输出越来

ML(附录1)——梯度下降

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以).在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值.反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了.在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法. 简单地说,梯

线性规划、梯度下降、正规方程组——斯坦福ML公开课笔记1-2

几个常见问题: 1.为什么损失函数采用最小二乘法,而不是绝对值形式,也不采用最小三乘法?关于这个问题的答案,后面的课程会给出,主要是从最大似然函数角度给出的合理化解释,如果你追问,最大似然函数就代表科学的.合理的吗?那你听说过大数定律.极限中心定律吗?感觉有点像哲学问题了. 2.梯度下降法中提到学习率的问题,我们的目标函数是一个凸二次函数(就是你吃饭的碗的形状),我们知道学习率大会导致震荡,太小会走的慢,那么有没有必要动态调节这个学习率的大小,刚开始下降时可以先大,快收敛时再变小?这个是没有必要

《机器学习》第一周 一元回归法 | 模型和代价函数,梯度下降

课程地址:https://www.coursera.org/learn/machine-learning/lecture/8SpIM/gradient-descent 一 Model and Cost Function 模型及代价函数 1 Model Representation 模型表示 首先,教授介绍了一下课程中将会用到的符号和意义: m:训练样本的数目 x:特征量 y:目标变量 (x,y):一个训练样本 (x^(i),y^(i)):i不是指数,而是指第i行的样本 Univariate li

(CS229) 第一课 梯度下降及标准方程推导笔记

1 regression 和 classificationn we call the learning problem a regression prob if th target variable that we're trying to predict is continuous; when target variable can only take on a small number of discrete values we call it a classification prob.

看代码理解批量梯度下降求解线下回归问题

layout: post title: 梯度下降算法 subtitle: 批量梯度下降求解线下回归问题 date: 2017-12-01 author: Felix catalog: true tags: - 机器学习 - 优化算法 --- //############################################################## //# //# 批量梯度下降算法实例:求解线性回归问题 //# //##############################

【吴恩达机器学习】学习笔记——2.7第一个学习算法=线性回归+梯度下降

梯度下降算法: 线性回归模型: 线性假设: 平方差成本函数: 将各个公式代入,对θ0.θ1分别求偏导得: 再将偏导数代入梯度下降算法,就可以实现寻找局部最优解的过程了. 线性回归的成本函数总是一个凸函数,故梯度下降算法执行后只有一个最小值. "批"梯度下降:每一个步骤都使用所有的训练样本 原文地址:https://www.cnblogs.com/JJJanepp/p/8454834.html

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降 本文会讲到: (1)线性回归的定义 (2)单变量线性回归 (3)cost function:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)feature scaling:加快梯度下降执行速度的方法 (6)多变量线性回归   Linear Regression 注意一句话:多变量线性回归之前必须要Feature Scaling! 方法:线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个