首页 > 编程语言 >梯度下降算法原理 用python实现

梯度下降算法原理 用python实现

时间:2024-03-16 10:30:08浏览次数:29  
标签:loss plt python 梯度 list epoch 算法 data

1. 介绍

我们常常说阶梯要慢慢下,但是我们的计算机不这样认为,因为他们是人类智慧的结晶,我们已经知道了最优解,在某些方面,所以我们要找到最速梯度,这样梯度下降就被广泛运用。
梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。本文将从一个下山的场景开始,先提出梯度下降算法的基本思想,进而从数学上解释梯度下降算法的原理,解释为什么要用梯度,最后实现一个简单的梯度下降算法的实例!

2.梯度下降算法

2.1 真实情景

梯度下降法的基本思想可以类比为一个下山的过程。
在这里插入图片描述
描述的是我们在下山的时候,怎么样才可以以最快的路径到谷底,那么我们可以抽象的把这个山谷看作一个函数,那么找到到谷底的过程,就是我们梯度下降算法的作用,注意这里找的是最优路线,其实我们要计算的就是每两个或多个点之间的斜率,也就是现在人工智能所谓的梯度,这算法在人工智能领域运用非常广泛,当然毋庸置疑这些起源都是数学。

2.2 梯度下降 ---- 数学

梯度下降算法是一种优化算法,用于求解目标函数的最小值。其基本思想是通过迭代更新参数来逐步逼近最优解。

假设我们有一个目标函数f(x),其中x是参数向量,我们需要找到一组参数x使得f(x)最小化。在梯度下降算法中,我们首先需要计算目标函数关于参数向量的梯度,即导数向量。然后根据梯度的方向和大小,更新参数向量,直到满足停止条件为止。

具体来说,梯度下降算法的公式推导过程如下:
在这里插入图片描述

初始化参数向量x和学习率α;
计算目标函数关于参数向量的梯度g(x)=(h0(x)-y)*x(i);
根据梯度的方向和大小,更新参数向量x = x - α * g(x);
重复步骤2和3,直到满足停止条件为止。
其中,学习率α控制着参数更新的速度,过大可能导致振荡不收敛,过小可能导致收敛速度过慢。在实际使用中,可以通过调整学习率来平衡收敛速度和稳定性。

2.3 基于python实现梯度下降算法

关于 y = w*xw 的最优解完整代码:

import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0, 4.0, 5.0]
y_data = [2.0, 4.0, 6.0, 8.0, 10.0]
w = 1.0


def forward(x):
    return x * w


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


def gradient(x, y):
    return 2 * x * (x * w - y)


epoch_list = []
loss_list = []
print('predict(before training)', 4, forward(4))
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y)
        w = w - 0.01 * grad
        print('\tgrad:', x, y, grad)
        l = loss(x, y)
    print('progress:', epoch, 'w=', w, 'loss=', l)
    epoch_list.append(epoch)
    loss_list.append(l)
print('predict(after training)', 4, forward(4))
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

2.3.1 给定x,y值和初始化w:

x_data = [1.0, 2.0, 3.0, 4.0, 5.0]
y_data = [2.0, 4.0, 6.0, 8.0, 10.0]
w = 1.0

2.3.2 定义三个函数forwar(),loss(),gradient():
forwar()
返回的是xw的结果,也就是对整个函数y = xw 求解。
loss()
传入x,y 并返回y_pred-yd的平方,注意y_pred是由我们自定义的数据算出来的,y是给定的y_data的数据,loss就是求他们之间的平方差。
gradient()
它接受两个参数x和y。函数的主要目的是计算梯度值。在数学中,梯度是一个向量,表示一个标量场在某一点处的方向导数沿着该方向取得最大值。在这个例子中,梯度计算公式为:2 * x * (x * w - y)。其中,w是一个未在代码中定义的变量,可能是全局变量或者在其他地方定义的。这个函数可以用于计算某个函数在某个点的梯度值。


def forward(x):
    return x * w


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


def gradient(x, y):
    return 2 * x * (x * w - y)

以下这段代码是一个使用梯度下降法训练神经网络的示例。首先,它创建了两个空列表epoch_list和loss_list,用于存储每个epoch的损失值。然后,它打印出在训练开始之前对输入4进行预测的结果。
接下来,代码进入一个100次迭代的训练循环。在每次迭代中,它会遍历x_data和y_data中的所有数据点,并计算损失函数关于权重的梯度。然后,它更新权重w,使其朝着减小损失的方向移动。在每次迭代中,它还打印出当前的数据点、梯度和损失值。
在每个epoch结束时,代码将当前的epoch数和损失值添加到epoch_list和loss_list中,并打印出进度信息。最后,在训练结束后,它再次打印出对输入4进行预测的结果,并绘制了一个损失值随epoch变化的折线图。

epoch_list = []
loss_list = []
print('predict(before training)', 4, forward(4))
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y)
        w = w - 0.01 * grad
        print('\tgrad:', x, y, grad)
        l = loss(x, y)
    print('progress:', epoch, 'w=', w, 'loss=', l)
    epoch_list.append(epoch)
    loss_list.append(l)
print('predict(after training)', 4, forward(4))
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

第一次计算结果:
在这里插入图片描述

经过100次的求解得到w=2是这个方程的最优解:
在这里插入图片描述

在这里插入图片描述
由上图可以知道大概在3-4次的时候loss的值已经是0了,所有后面的计算是浪费资源,当然这是方程简单的情况,有很多复杂的方程需要考虑的东西更多,关于什么时间复杂度等一系列问题。

标签:loss,plt,python,梯度,list,epoch,算法,data
From: https://blog.csdn.net/whc15398305821/article/details/136751902

相关文章

  • 【笔记】Python爬虫之Xpath、BS4解析
    1、Bs4解析#安装bs4importrequestsfrombs4importBeautifulSoup#1url=""resp=requests.get(url)#2.将请求到的数据变成BeautifulSoup对象sp=BeautifulSoup(resp.text,'lxml')#↑加.text↑固定lxml#————————————————......
  • 【Python】什么是wsgi,uwsgi,uWSGI?
    WSGIWSGI(WebServerGatwayInterface)是一个python标准库,定义了web服务器和Python应用之间的接口。这个标准允许Web服务器(Apache或者nginx)将请求转发给Python应用(如Django或者Flask)然后将应用的响应返回给客户端。简单来说,WSGI充当了Web服务器和Python应用之间的桥梁......
  • python学习笔记-scarpy
    一、scrapy介绍Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架应用原理1、指定初始url 2、解析响应内容 -给调度器 -给item;pipeline;用于做格式化;持久化引擎(Scrapy)用来处理整个系统的数据流处理,触发事务(框架核心)调度器(Scheduler)用来接......
  • 深度学习入门:基于Python的理论与实践 笔记
    深度学习入门:基于Python的理论与实践笔记一,Python基础由于本人之前已经系统学习过Python,此处只总结有关深度学习的Python的库NumPy生成NumPy数组要生成NumPy数组,需要使用np.array()方法。np.array()接收Python列表作为参数,生成NumPy数组(numpy.ndarray)>>>x=np.array......
  • 【计算机网络】网络层——基本概述、路由选择算法
    网络层大纲网络层的功能主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。分组是由数据报切割来功能:路由选择与分组转发异构网络互联(路由器)拥塞控制:若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状......
  • 深度学习入门基于python的理论与实现-第四章神经网络的学习(个人向笔记)
    目录从数据中学习损失函数均方误差(MSE)交叉熵误差mini_batch学习mini_batch版交叉熵误差的实现从数据中学习神经网络的"学习"的学习是指从训练数据自动获取最有权重参数的过程。神经网络的特征就是可以从数据中学习即由数据自动决定权重参数的值。机器学习通常是认为确定一些......
  • 【机器学习】机器学习创建算法第2篇:K-近邻算法【附代码文档】
    机器学习(算法篇)完整教程(附代码资料)主要内容讲述:机器学习算法课程定位、目标,K-近邻算法,1.1K-近邻算法简介,1.2k近邻算法api初步使用定位,目标,学习目标,1什么是K-近邻算法,1Scikit-learn工具介绍,2K-近邻算法API,3案例,4小结。K-近邻算法,1.3距离度量学习目标,1欧式距离,2......
  • 算法进阶之路:十大经典排序算法详解与实践
    算法进阶之路:十大经典排序算法详解与实践在计算机科学的世界里,排序算法是基础且至关重要的一环。无论是数据库查询、数据分析还是日常的编程任务,高效的排序算法都能显著提升程序的性能。本文将带你深入了解十大经典排序算法,包括它们的原理、优缺点以及代码实现,帮助你在算法......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)
    摘要:本研究详述了一种采用深度学习技术的火焰检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别火焰目标或着火点等。文章深入阐述了YOLOv8算法......
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的番茄成熟度检测系统(Python+PySide6界面+训练代码)
    摘要:开发番茄成熟度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个番茄成熟度检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的对比,展示了不同模型间的性能指标如mAP、F1Score等......