从PyTorch官方的一篇教程说开去(3.1 - GD 梯度下降法)

在openAI以前,我们所讨论的“人工智能”基本上都是“人工智障”,即时在某些方面表现得非常出色,击败了世界冠军,但最多算个某领域的“专才”而不是“通才”。

那么这些“智障”程序们,究竟是靠什么才能做到“专才”呢?

答案就是多次迭代,不断优化,向目标收敛。

回到教程中,我们需要给AI程序(agent)准备大脑(Q网络,本例是3层的神经网络,用于储存,以及匹配输入和输出)以及策略(Q函数,这个函数用于给出在状态S下的动作A,并计算误差L以及预期回报R)。算法初始化时候,基本上是使用类似于醉汉”随机游走“的策略,笨的不要不要的,而用来化腐朽为神奇的策略的关键点,就是能够让误差L最小,并且最快收敛。

于是问题转化为了,对于L的函数,求极(小)值。

而GD梯度下降法本身,就是数学家创造出来,用来解决一般函数的极值问题的。

为了让大家放心食用,这里先给出实例程序运行的动图,以体现逐渐逼近极值的过程。

实例采用大家熟悉的二次函数y=x^2。

我们人类是初中学习了解析几何,得知它的函数图像有对称轴并向上开口,所以在x属于实数域时,有最(极)小值;另外,如果x的取值受到限制,因为有图像辅助,那么在某一段区间上,也很容易找到一个极小值。

只是,人天然是善于利用图形的,但计算机却不需要也不擅长这个;另外,如果碰到一个陌生的或者特别复杂的函数,显然图像就不是那么容易得到。这个时候你跺你也麻,该怎么来寻找极值呢?

是时候请出GD方法了。数学上的严格证明比较绕,我们就直接说结论 - 下山最快的路径,很可能就是在每一个位置上,都沿着坡度最陡的方向(法线方向),然后一路这么下降的走。用数学语言呢,这个”坡度最陡的方向“,就是梯度,也就是某点上,该函数的各个偏导数的极值。

Show me the code,此处直接上一个实例程序 -

【问题】对于y=x^2,求在区间[0,10]上的极小值。

这个示例很容易推广到其他函数,或者其他区间,并且直接生成动图,是所见即所得的代码:

import matplotlib.pyplot as plt
from PIL import Image, ImageSequence
import numpy as npdef f(x):# 目标函数return x**2def df(x):# 目标函数的导数return 2 * x# 初始参数值
x = 10
learning_rate = 0.1
iterations = 50# 初始化图形和坐标轴
fig, ax = plt.subplots()
plt.xlabel('x value')
plt.ylabel('f(x) value')
plt.title('Gradient Descent Optimization')
plt.grid(True)# 用于保存每一帧的列表
frames = []# 梯度下降过程
for i in range(iterations):grad = df(x)new_x = x - learning_rate * gradx = new_x# 绘制当前的梯度下降路径# ax.clear()  # 清除之前的图形ax.plot([x], [f(x)], 'r.')  # 绘制当前点# ax.plot(range(iterations), [f(j * learning_rate) for j in range(iterations)], 'b-')  # 绘制路径# 调整坐标轴范围以确保所有点都在视图中ax.set_xlim([min(iterations * learning_rate - 1, x - 5), max(10, x + 5)])ax.set_ylim([min(f(iterations * learning_rate), f(x) - 5), max(f(x) + 5, 100)])# 保存当前帧fig.canvas.draw()canvas = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)canvas = canvas.reshape((fig.canvas.get_width_height()[1], fig.canvas.get_width_height()[0], 3))frames.append(Image.fromarray(canvas))print(f"Iteration {i+1}: x = {x:.2f}, gradient = {grad:.2f}, new x = {new_x:.2f}")# 保存动画为文件
frames[0].save('gradient_descent.gif', format='GIF', append_images=frames[1:], save_all=True, duration=100, loop=0)print(f"Minimum found at x = {x:.2f}")

您的进步和反馈是我最大的动力,小伙伴来个三连呗!共勉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249225.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.

问题现象 源码编译安装nginx时,执行./configure …… --with-http_ssl_module 命令安装https模块,需要用到openssl,由于机器缺少openssl库,报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下: IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

MySQL(5)表的查询

目录 1.表的查询 1.表的查询: 1.1创建表: 语法: create table 表名( 字段 类型 约束, 字段 类型 约束, ... 字段 类型 约束 ); 1.2 单行数据全行插入: 🌰 表的字段都插入数据: insert into student values(100, 1000, 唐三藏, null); 1.3 多行数据 指定列插入:…

Go网络编程-RPC程序设计

gRPC 通信 RPC 介绍 RPC, Remote Procedure Call,远程过程调用。与 HTTP 一致,也是应用层协议。该协议的目标是实现:调用远程过程(方法、函数)就如调用本地方法一致。 如图所示: 说明: Servi…

STM32智能安防系统教程

目录 引言环境准备智能安防系统基础代码实现:实现智能安防系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:家庭与企业安防管理问题解决方案与优化收尾与总结 1. 引言 智能安防系统通过STM32…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素:网络抖动、网络延时、音视频同步 网络抖动:视频帧在网络上传输,会受到网络抖动的影响,不能收到立刻播放,需要进行适当的平滑 网络延时:一些报文在…

鱼眼相机变普通相机,利用Transform进行球面变换

Abstract 高分辨率广角鱼眼图像在自动驾驶等机器人应用中变得越来越重要。然而,使用普通的卷积神经网络或视觉变换器处理这类数据时会遇到问题,因为在将其投影到平面上的矩形网格时会引入投影和失真损失。为了解决这个问题,我们引入了HEAL-S…

雷达组网拼图3.0数据掌握和python解析处理

废话不多说,先展示雷达图 以反射率为例: 核对数据格式 Z_RADA_C_BABJ_20240705043615_P_DOR_ACHN_CREF_20240705_043000.bin数据分析认识 1. 组网产品分类:组网产品包括组网混合扫描反射率(HSR),组网组…

Qt-事件与信号

事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写,它是Android SDK 中的一个调试工具,允许开发者通过命令行界面与设备进行交互,执行各种操作,如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

鸿蒙语言基础类库:【@system.mediaquery (媒体查询)】

媒体查询 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.mediaquery]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import mediaquery from sy…

PySide在Qt Designer中使用QTableView 显示表格数据

在 PySide6 中,可以使用 Qt Model View 架构中的 QTableView 部件来显示和编辑表格数据。 1、创建ui文件 在Qt Designer中新建QMainWindow,命名为csvShow.ui。QMainWindow上有两个部件:tableview和btn_exit。 2、使用pyuic工具将ui文件转换为…

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

从零开始读RocketMq源码(五)Consumer消费Message流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确实分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…

TikTok用户必看:代理IP的优缺点深度剖析

在咱们这庞大的网络世界里,TikTok就像是夜空中最亮的星星,吸引着全世界的人们。它不仅仅是个让大家开心的地方,更是个能让不同地方的人互相了解、分享生活的神奇平台。但你有没有想过,要是能让这个连接更顺畅,让TikTok…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

【CSS in Depth 2 精译_019】3.2 CSS 的盒模型

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

LLaMA 数据集

LLaMA的训练数据集来源多样&#xff0c;涵盖了多个不同的数据集和预处理步骤。以下是详细的描述&#xff1a; 公开数据来源和预处理 CommonCrawl [67%]&#xff1a; 使用CCNet管道&#xff08;Wenzek等人&#xff0c;2020年&#xff09;对2017年至2020年间的五个CommonCrawl转…

Vue3 + uni-app 微信小程序:仿知乎日报详情页设计及实现

引言 在移动互联网时代&#xff0c;信息的获取变得越来越便捷&#xff0c;而知乎日报作为一款高质量内容聚合平台&#xff0c;深受广大用户喜爱。本文将详细介绍如何利用Vue 3框架结合微信小程序的特性&#xff0c;设计并实现一个功能完备、界面美观的知乎日报详情页。我们将从…

生成式AI的未来:对话的艺术与代理的实践

生成式 AI 的发展方向&#xff0c;是 Chat 还是 Agent&#xff1f; 随着生成式AI技术的不断进步&#xff0c;关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统&#xff08;Chat&#xff09;中展现智慧&#xff0c;还是在自主代理&#xff08;Agent&#x…