文章目录

  • 概述
  • 概念理解
    • 场景假设
      • 数学场景
    • 梯度
      • 官方解释:
      • 通俗理解
    • 梯度求解
    • 目标函数
    • 损失函数
  • 实战演示
    • 求一元最值
      • 寻找最低点
      • 更新x
      • 代码实现:
    • 求多元最值
    • 求一元函数的参数

概述

梯度下降法,是一种基于搜索的最优化方法,它其实不是一个机器学习算法,但是在机器学习领域,许多算法都是以梯度下降法为基础的,不论是在线性回归还是Logistic回归还是其他深度学习算法中,它的主要作用就是通过迭代寻找目标函数的最优解

常用的梯度下降法有 3 种不同的形式:

  1. 批量梯度下降法,简称 BGD,使用所有样本,比较耗时;

  2. 随机梯度下降法,简称 SGD,随机选择一个样本,简单高效;

  3. 小批量梯度下降法,简称 MBGD,使用少量的样本,这是一个折中的办法。

概念理解

场景假设

梯度下降法的基本思想可以类比为一个下山的过程。

假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。

这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了

数学场景

梯度下降的基本过程就和下山的场景很类似。

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。
所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

梯度

官方解释:

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)

为什么沿梯度方向,函数变化最快???

通俗理解

我们对一个多元函数求偏导,会得到多个偏导函数,这些导函数组成的向量,就是梯度。

梯度求解

那就是这个函数在当前位置的偏导数。如函数f ( x , y ) f(x,y)f(x,y)的梯度就是:

目标函数

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。

也就是要求最优解的那个函数。

损失函数

机器学习模型关于单个样本的预测值与真实值的差称为损失。损失越小,模型越好,如果预测值与真实值相等,就是没有损失。
用于计算损失的函数称为损失函数。模型每一次预测的好坏用损失函数来度量。
损失函数有多种,如平方损失函数:

实战演示

求一元最值

设函数为:
y=(x−3)2−3y=(x - 3)^2-3y=(x−3)2−3
导函数为:
y′=2∗(x−3)y'=2*(x - 3)y′=2∗(x−3)
图像为:

寻找最低点

  1. 随机找一个x点,如这里我们设x=6,f(x)=6,f′(x)=6x=6,f(x)=6,f'(x)=6x=6,f(x)=6,f′(x)=6,显然,该点不是最低点,所以要更新x的值。
    如何更新呢?若x再大,肯定还不是最低点,所以x肯定要小一些。设x=x−Δ1x=x-{\Delta}_1x=x−Δ1​
    如图,若减小为0,x=0,f(x)=6,f′(x)=−6x=0,f(x)=6,f'(x)=-6x=0,f(x)=6,f′(x)=−6,显然,该点不是最低点,所以要更新x的值。肯定得比0要大,设x=x+Δ2x=x+{\Delta}_2x=x+Δ2​。如此重复迭代。

    就这样不断更新,最终达到如下结果:再最低点附近逛游,最终趋于稳定。

    上述步骤是有很多漏洞的,比如Δ\DeltaΔ如何确定,x如何更新???

更新x

上面x更新时有加有减,这与什么有关呢,可以看到,当导数大于0时,x=x−Δx=x-{\Delta}x=x−Δ;当导数小于0时,x=x+Δx=x+{\Delta}x=x+Δ

所以我们可以考虑到,x的更新是不是和其导数有关呢?肯定是有关的,这里我们可以用x=x−f′(x)x = x - f'(x)x=x−f′(x)来进行x的更新。

但这样更新可能会来回跳的跨度太大,所以我们可以对其加个参数,调节下x的变化:x=x−Δf′(x)x = x - \Delta f'(x)x=x−Δf′(x),(Δ\DeltaΔ调参是个讲究活,这里先不介绍。)

代码实现:

先定义出原函数和导函数:

# 原函数
def f(x):return (x - 3) ** 2 - 3# 导函数
def h(x):return 2 * (x - 3)

对相应的值进行初始化

# 随机设一个初始x值
x = np.random.randint(-10,10)
# 初始值对应的y值
cha = f(x)
y_update = cha
# 学习率
alpha = 0.7
# 迭代次数
iter_num = 0
# 保存每次迭代的x,y值
GD_X= []
GD_Y = []
GD_X.append(x)
GD_Y.append(y_update)

迭代更新

# 设定循环结束条件
while cha > 1e-10 and iter_num < 100:iter_num += 1# 更新x值x = x - alpha * h(x)# 更新上次与本次y值的差值cha = np.abs(y_update - f(x))y_update = f(x)# 保存每次的x,y值GD_X.append(x)GD_Y.append(y_update)print("第{}次迭代,差为:{},x为:{},y为:{}".format(iter_num,cha,x, f(x)))

画示意图

# 画出示意图
X = np.arange(-10,10,0.1)
Y = np.array(list(map(lambda t:f(t),X)))
plt.figure(facecolor='w')
plt.plot(X,Y,'r-',linewidth=2)
plt.plot(GD_X,GD_Y,'bo--',linewidth=2)
plt.show()

求多元最值

多远函数与一元函数类似,一元函数只更新x,这个要更新x和y。这边用了我们给他固定的迭代次数,上一个是用了判断条件来自动跳出迭代。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D# 求fxy的函数值
def f0(x, y):return (x - 3) ** 2 + (y - 2) ** 2def gradient_descent():times = 100  # 迭代次数alpha = 0.05  # 步长x = 1  # x的初始值y = 5  # y的初始值# 画图 将figure转化为3Dfig = Axes3D(plt.figure())  xp = np.linspace(-8, 14, 100)yp = np.linspace(-8, 14, 100)xp, yp = np.meshgrid(xp, yp)  # 将数据转化为网格数据zp = f0(xp, yp)fig.plot_surface(xp, yp, zp, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))# 梯度下降算法for i in range(times):xb = x  # 用于画图yb = y  # 用于画图fb = f0(x, y)  # 用于画图# 更新x,yx = x - alpha * 2 * (x - 10)y = y - alpha * 2 * (y - 10)f = f0(x, y)print("第%d次迭代:x=%f,y=%f,fxy=%f" % (i + 1, x, y, f))fig.plot([xb, x], [yb, y], [fb, f], 'ko', lw=2, ls='-')plt.show()if __name__ == "__main__":gradient_descent()

求一元函数的参数

如我们已知所有的x和y,想求其表达式y=wx+by=wx+by=wx+b中的w和b两个参数。

虽然说是求一元函数的参数,实则是求目标函数F=(wx+b−y)2F=(wx+b-y)^2F=(wx+b−y)2这个二元二次函数的最优值。

与上面那个求二元函数极值不同的是,上面已知两个固定参数,求x和y,这个是x和y已知(有多个),这就不能用上面那种方法了,但原理依然相同:通过迭代,逐步调整w和b,最终使目标函数的损失值最小。

具体实现代码如下(调参绝对是个手艺活,步长和迭代次数不同结果相差很大)

import numpy as np
import matplotlib.pyplot as plt# 计算平均损失值
def compute_error_for_line_given_points(b, w, points):totalError = 0for i in range(0, len(points)):x = points[i, 0]y = points[i, 1]totalError += (y - (w * x + b)) ** 2return totalError / float(len(points))# 迭代更新w和b
def step_graditent(b_current, w_current, points, learningRate):b_gradient = 0w_gradient = 0N = float(len(points))for i in range(0, len(points)):x = points[i, 0]y = points[i, 1]# b 和 w的偏导,求值加和求平均b_gradient += -(2 / N) * (y - ((w_current * x) + b_current))w_gradient += -(2 / N) * x * (y - ((w_current * x) + b_current))# 更新b和wnew_b = b_current - (learningRate * b_gradient)new_w = w_current - (learningRate * w_gradient)# print("--", new_w, new_b)return [new_b, new_w]def gradient_descent_runner(points, start_b, start_w, learn_rate, num_iterations):b = start_bw = start_wfor i in range(num_iterations):b, w = step_graditent(b, w, points, learn_rate)return [b, w]# 学习率
learning_rate = 0.05
# 初始化w和b
start_b = 0
start_w = 0
# 设置迭代次数
num_iterations = 100
# 自定义x0 y0
x0 = np.arange(0, 15, 0.1)
y0 = 0.83 * x0 + 0.48 + np.random.rand()
points = np.array([x0, y0])print("loss:", compute_error_for_line_given_points(start_b, start_w, points))
[b, w] = gradient_descent_runner(points, start_b, start_w, learning_rate, num_iterations)
print(b, w)
print("loss", compute_error_for_line_given_points(b, w, points))
plt.scatter(x0, y0, s=5, c="r")
plt.plot(x0, w * x0 + b)
plt.show()

梯度下降法-深度AI相关推荐

  1. 3.9 神经网络的梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.8 激活函数的导数 回到目录 3.10 直观理解反向传播 神经网络的梯度下降法 (Gradient Descent for Neural Networks) 在这个视频中 ...

  2. 2.6 动量梯度下降法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.5 指数加权平均的偏差修正 回到目录 2.7 RMSprop 动量梯度下降法 (Gradient Descent with Momentum) 还有一种算法叫做Momen ...

  3. 2.9 Logistic 回归的梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.8 计算图的导数计算 回到目录 2.10 m 个样本的梯度下降 Logistic 回归的梯度下降法 (Logistic Regression Gradient Desce ...

  4. 2.4 梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.3 Logistic 回归损失函数 回到目录 2.5 导数 梯度下降法 (Gradient Descent) 梯度下降法可以做什么? 在你测试集上,通过最小化代价函数(成 ...

  5. 深度学习原理-----线性回归+梯度下降法

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

  6. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法

    所谓Mini-batch梯度下降法就是划分训练集和测试集为等分的数个子集,比如原来有500W个样本,将其划分为5000个baby batch,每个子集中有1000个样本,然后每次对一个mini-bat ...

  7. 深度学习之梯度下降法

    深度学习之梯度下降法 代价函数 在一开始,我们会完全随机地初始化所有的权重和偏置值.可想而知,这个网络对于给定的训练示例,会表现得非常糟糕.例如输入一个3的图像,理想状态应该是输出层3这个点最亮. 可 ...

  8. 【深度学习的数学】2-11 用Excel体验梯度下降法(用python实现)

    梯度下降法是神经网络计算的基础,下面我们用python编程来体验它! 代码 # -*- coding: utf-8 -*- """ @File : 梯度下降法求函数最小值 ...

  9. 深度学习中多层全连接网络的梯度下降法及其变式

    深度学习中多层全连接网络的梯度下降法及其变式 1 梯度下降法 2 梯度下降的变式 1.SGD 2.Momentum 3.Adagrad 4.RMSprop 5.Adam 6.小结 1 梯度下降法 梯度 ...

最新文章

  1. 【移动通信】多址技术和调制技术
  2. 第三章:Creating Utilities--27.增加一个本地词典
  3. 图像处理之双线性插值原理和实现
  4. GIT项目管理工具(part8)--版本控制
  5. 可信云十年,重磅研究成果与2021云计算十大关键词悉数发布
  6. php取商,PHP获取百度关键词排名
  7. Linux系统有od程序吗,Linux od命令
  8. 手机modem开发(3)---Android Modem log分析
  9. Java 小白:没有项目经验,企业会要我么
  10. 【HTML+CSS网页设计与布局 从入门到精通】第8章-CSS
  11. 排名怎么查_常见客户SEO问题解答:网站降权了应该怎么处理?
  12. 随便玩玩Django--输入网址生成二维码
  13. 斐波那契字符串_KMP
  14. 《无敌大冒险》技术支持
  15. IDCC2018|上海数据港股份有限公司副总裁、数据中心首席架构师王海峰:标杆管理驱动数据中心建设变革...
  16. 数资问题【抽屉问题】
  17. Git Commit 规范以及emoji 使用指南
  18. Learning Continuous Image Representation with Local Implicit Image Function解读
  19. 2020京东双十一【全民营业,瓜分十亿】自动做任务软件
  20. 笔记 | 初探Kotlin协程

热门文章

  1. c语言 字母赋值给变量,C++变量(变量定义和赋值)详解
  2. java nio 客户端_Java网络编程:Netty框架学习(二)---Java NIO,实现简单的服务端客户端消息传输...
  3. android 手机 与 python服务器_Python服务器与多种客户端(Python/Java/Android)之间的通信...
  4. 将堆栈异常返回前端显示
  5. mysql json数组拆分表_MaxCompute将json数组拆分成多行
  6. 机械设计电子版_非标机械设计有哪些设计过程??
  7. 开源文件管理服务器,GitHub - biiliwuiid/file-manager: 文件服务器管理系统
  8. php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目
  9. 网络编程之Tcp,udp
  10. python学习之random