Python神经模型评估微分方程图算法

🎯要点

🎯神经网络映射关联图 | 🎯执行时间分析 | 🎯神经网络结构降维 | 🎯量化图结构边作用 | 🎯数学评估算法实现

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python随机梯度下降算法

随机梯度下降是梯度下降算法的一种变体,用于优化机器学习模型。它解决了传统梯度下降方法在处理机器学习项目中的大型数据集时计算效率低下的问题。在随机梯度下降中,每次迭代不会使用整个数据集,而是只选择一个随机训练示例(或一个小批量)来计算梯度并更新模型参数。这种随机选择将随机性引入优化过程,因此在随机梯度下降中出现了“随机”一词。

使用随机梯度下降的优势在于其计算效率,尤其是在处理大型数据集时。与需要处理整个数据集的传统梯度下降方法相比,通过使用单个示例或小批量,每次迭代的计算成本显著降低。

步骤:

  • 初始化:随机初始化模型的参数。
  • 设置参数:确定更新参数的迭代次数和学习率。
  • 随机梯度下降循环:重复以下步骤,直到模型收敛或达到最大迭代次数。
  • 返回优化参数:一旦满足收敛条件或达到最大迭代次数,返回优化模型参数。

在随机梯度下降中,由于每次迭代只从数据集中随机选择一个样本,因此算法达到最小值的路径通常比典型的梯度下降算法更嘈杂。但这并不重要,因为只要我们达到最小值并且训练时间明显缩短,算法所采用的路径就无关紧要。

需要注意的一点是,由于随机梯度下降通常比典型的梯度下降更嘈杂,因此由于其下降的随机性,通常需要更多次迭代才能达到最小值。尽管它需要比典型的梯度下降更多的迭代次数才能达到最小值,但它在计算上仍然比典型的梯度下降便宜得多。因此,在大多数情况下,与批量梯度下降相比,随机梯度下降更适合用于优化学习算法。

我们将使用更新参数、拟合训练数据集和预测新测试数据时使用的方法创建一个随机梯度下降类。我们将使用的方法如下:

  • SGD 类封装了用于训练线性回归模型的随机梯度下降算法。
  • 然后我们初始化 SGD 优化器参数,例如学习率、轮数、批量大小和容差。它还将权重和偏差初始化为 None。
  • 预测函数:该函数使用当前权重和偏差计算输入数据 X 的预测。它在输入 X 和权重之间执行矩阵乘法,然后添加偏差项。
  • mean_squared_error 函数:该函数计算真实目标值 y_true 和预测值 y_pred 之间的均方误差。
  • 梯度函数:使用均方误差损失函数的梯度公式计算损失函数相对于权重和偏差的梯度。
  • 拟合方法:此方法使用随机梯度下降将模型拟合到训练数据。它会迭代指定的次数,打乱数据并更新每个时期的权重和偏差。它还会定期打印损失并根据容差检查收敛情况。

算法实现:

import numpy as npclass SGD:def __init__(self, lr=0.01, epochs=1000, batch_size=32, tol=1e-3):self.learning_rate = lrself.epochs = epochsself.batch_size = batch_sizeself.tolerance = tolself.weights = Noneself.bias = Nonedef predict(self, X):return np.dot(X, self.weights) + self.biasdef mean_squared_error(self, y_true, y_pred):return np.mean((y_true - y_pred) ** 2)def gradient(self, X_batch, y_batch):y_pred = self.predict(X_batch)error = y_pred - y_batchgradient_weights = np.dot(X_batch.T, error) / X_batch.shape[0]gradient_bias = np.mean(error)return gradient_weights, gradient_biasdef fit(self, X, y):n_samples, n_features = X.shapeself.weights = np.random.randn(n_features)self.bias = np.random.randn()for epoch in range(self.epochs):indices = np.random.permutation(n_samples)X_shuffled = X[indices]y_shuffled = y[indices]for i in range(0, n_samples, self.batch_size):X_batch = X_shuffled[i:i+self.batch_size]y_batch = y_shuffled[i:i+self.batch_size]gradient_weights, gradient_bias = self.gradient(X_batch, y_batch)self.weights -= self.learning_rate * gradient_weightsself.bias -= self.learning_rate * gradient_biasif epoch % 100 == 0:y_pred = self.predict(X)loss = self.mean_squared_error(y, y_pred)print(f"Epoch {epoch}: Loss {loss}")if np.linalg.norm(gradient_weights) < self.tolerance:print("Convergence reached.")breakreturn self.weights, self.bias

我们将创建一个包含 100 行和 5 列的随机数据集,并在此数据上拟合随机梯度下降类。 另外,我们将使用此算法的预测方法

X = np.random.randn(100, 5)
y = np.dot(X, np.array([1, 2, 3, 4, 5]))\+ np.random.randn(100) * 0.1
model = SGD(lr=0.01, epochs=1000,batch_size=32, tol=1e-3)
w,b=model.fit(X,y)
y_pred = w*X+b

输出

Epoch 0: Loss 64.66196845798673
Epoch 100: Loss 0.03999940087439455
Epoch 200: Loss 0.008260358272771882
Epoch 300: Loss 0.00823731979566282
Epoch 400: Loss 0.008243022613956992
Epoch 500: Loss 0.008239370268212335
Epoch 600: Loss 0.008236363304624746
Epoch 700: Loss 0.00823205131002819
Epoch 800: Loss 0.00823566681302786
Epoch 900: Loss 0.008237441485197143

这种获取值并根据不同参数调整它们以减少损失函数的循环称为反向传播。

TensorFlow实现此算法

import tensorflow as tf
import numpy as npclass SGD:def __init__(self, lr=0.001, epochs=2000, batch_size=32, tol=1e-3):self.learning_rate = lrself.epochs = epochsself.batch_size = batch_sizeself.tolerance = tolself.weights = Noneself.bias = Nonedef predict(self, X):return tf.matmul(X, self.weights) + self.biasdef mean_squared_error(self, y_true, y_pred):return tf.reduce_mean(tf.square(y_true - y_pred))def gradient(self, X_batch, y_batch):with tf.GradientTape() as tape:y_pred = self.predict(X_batch)loss = self.mean_squared_error(y_batch, y_pred)gradient_weights, gradient_bias = tape.gradient(loss, [self.weights, self.bias])return gradient_weights, gradient_biasdef fit(self, X, y):n_samples, n_features = X.shapeself.weights = tf.Variable(tf.random.normal((n_features, 1)))self.bias = tf.Variable(tf.random.normal(()))for epoch in range(self.epochs):indices = tf.random.shuffle(tf.range(n_samples))X_shuffled = tf.gather(X, indices)y_shuffled = tf.gather(y, indices)for i in range(0, n_samples, self.batch_size):X_batch = X_shuffled[i:i+self.batch_size]y_batch = y_shuffled[i:i+self.batch_size]gradient_weights, gradient_bias = self.gradient(X_batch, y_batch)# Gradient clippinggradient_weights = tf.clip_by_value(gradient_weights, -1, 1)gradient_bias = tf.clip_by_value(gradient_bias, -1, 1)self.weights.assign_sub(self.learning_rate * gradient_weights)self.bias.assign_sub(self.learning_rate * gradient_bias)if epoch % 100 == 0:y_pred = self.predict(X)loss = self.mean_squared_error(y, y_pred)print(f"Epoch {epoch}: Loss {loss}")if tf.norm(gradient_weights) < self.tolerance:print("Convergence reached.")breakreturn self.weights.numpy(), self.bias.numpy()X = np.random.randn(100, 5).astype(np.float32)
y = np.dot(X, np.array([1, 2, 3, 4, 5], dtype=np.float32)) + np.random.randn(100).astype(np.float32) * 0.1model = SGD(lr=0.005, epochs=1000, batch_size=12, tol=1e-3)
w, b = model.fit(X, y)
y_pred = np.dot(X, w) + b

输出

Epoch 0: Loss 52.73115158081055
Epoch 100: Loss 44.69907760620117
Epoch 200: Loss 44.693603515625
Epoch 300: Loss 44.69377136230469
Epoch 400: Loss 44.67509460449219
Epoch 500: Loss 44.67082595825195
Epoch 600: Loss 44.674285888671875
Epoch 700: Loss 44.666194915771484
Epoch 800: Loss 44.66718292236328
Epoch 900: Loss 44.65559005737305

算法优劣对比:

优势:

  • 速度:随机梯度下降比梯度下降的其他变体(例如批量梯度下降和小批量梯度下降)更快,因为它只使用一个示例来更新参数。
  • 内存效率:由于随机梯度下降一次更新每个训练示例的参数,因此内存效率很高,并且可以处理无法放入内存的大型数据集。
  • 避免局部极小值:由于随机梯度下降中的噪声更新,它有能力逃离局部极小值并收敛到全局极小值。

劣势:

  • 有噪声的更新:随机梯度下降中的更新有噪声并且具有很高的方差,这会使优化过程不太稳定并导致在最小值附近振荡。
  • 收敛缓慢:随机梯度下降可能需要更多迭代才能收敛到最小值,因为它一次更新每个训练示例的参数。
  • 对学习率的敏感性:学习率的选择在随机梯度下降中至关重要,因为使用高学习率会导致算法超出最小值,而低学习率会使算法收敛缓慢。
  • 不太准确:由于更新的噪声,随机梯度下降可能无法收敛到精确的全局最小值,并可能导致解决方案次优。这可以通过使用学习率调度和基于动量的更新等技术来缓解。

👉参阅&更新:计算思维 | 亚图跨际

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab仿真 通信信号和系统分析(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 一、离散傅里叶变换 clear all n0:30;%信号的时间范围 xsin(0.2*n).*exp(-0.1*n); k0:30;%频率范围 N31; Wnkexp(-j*2*pi/N).…

解决本地操作云服务器上的Redis

方案一&#xff1a;开放Redis默认端口&#xff0c;本地通过公网IP端口号的形式访问。 方案二&#xff1a;每次将本地编写好的Java代码打包&#xff0c;放在云服务器上运行。 方案三&#xff1a;配置ssh端口转发&#xff0c;把云服务器的redis端口&#xff0c;映射到本地主机。 …

【大模型】微调实战—使用 ORPO 微调 Llama 3

ORPO 是一种新颖微调&#xff08;fine-tuning&#xff09;技术&#xff0c;它将传统的监督微调&#xff08;supervised fine-tuning&#xff09;和偏好对齐&#xff08;preference alignment&#xff09;阶段合并为一个过程。这减少了训练所需的计算资源和时间。此外&#xff0…

使用微pe装系统

本文仅作为记录&#xff0c;不作为教程。 今天心血来潮想下点游戏玩玩&#xff0c;一看之前分的200gc盘已经红了&#xff0c;再加上大学之后这个笔记本已经用得很少了&#xff0c;于是打算重装电脑。 参考: 微PE辅助安装_哔哩哔哩_bilibil… 1.下载微pe和win10系统到U盘 我这…

Xilinx zc706 USB电路解析

作者 QQ群&#xff1a;852283276 微信&#xff1a;arm80x86 微信公众号&#xff1a;青儿创客基地 B站&#xff1a;主页 https://space.bilibili.com/208826118 参考 USB OTG检测原理 USB3320 USB_ID为低电平时候&#xff0c;为host模式&#xff0c;USB_ID为悬空&#xff08;高…

python-23-零基础自学python open()和replace()函数运用

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版练习10-2 知识点&#xff1a; 打开文件&#xff0c;replace()替换文件内容&#xff0c;open(), 练习内容&#xff1a; 练习10-2:C语言学习笔记 可使用方法replace()将字符串中的特定单词都替换为另一个单…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

6.824/6.5840 的Debugging by Pretty Printing配置

TA的原文在&#xff1a;Debugging by Pretty Printing (josejg.com) 为了在WSL2中配置好打印运行日志&#xff0c;我可是忙活了一下午。可恶的log配置 首先是安装rich库Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal. …

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video&#xff08;对视频数据微调&#xff09;Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完&#xff0c;切分子流程过程数不超25 &#xff0c;A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…

后端——全局异常处理

一、老办法try-catch 当我们执行一些错误操作导致程序报错时&#xff0c;程序会捕捉到异常报错&#xff0c;这个异常会存在一个Exception对象里 那我们在spring boot工程开发时&#xff0c;当我们执行一个sql查询时报错了&#xff0c;那就会从最底层的Mapper层捕捉到Exceptio…

Android应用程序调试Logcat的使用

Android的程序调试主要使用Logcat进行&#xff0c;本节主要介绍Logcat的使用。 开启调试模式 使用Android Studio进行程序调试&#xff0c;首先需要连接虚拟Android设备或真实Android设备&#xff0c;设备上需要启用调试功能。 虚拟Android设备默认情况下会启用调试功能。对…

微软清华提出全新预训练范式,指令预训练让8B模型实力暴涨!实力碾压70B模型

现在的大模型训练通常会包括两个阶段&#xff1a; 一是无监督的预训练&#xff0c;即通过因果语言建模预测下一个token生成的概率。该方法无需标注数据&#xff0c;这意味着可以利用大规模的数据学习到语言的通用特征和模式。 二是指令微调&#xff0c;即通过自然语言指令构建…

通过高德地图 JS API实现单击鼠标进行标注

效果图: 核心代码: <template><a-modal title="选择地图所在位置" :width="width" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="关闭"><div class="location-…

场外期权有交割日吗?场外期权应该怎么交割?

今天带你了解场外期权有交割日吗&#xff1f;场外期权应该怎么交割&#xff1f;场外个股期权是一种非标准化的金融衍生品&#xff0c;它允许投资者在未来某一特定日期以特定价格买入或卖出某一特定股票。 交割日就是买卖双方进行交割的日期,期权合约具有到期日,到期日的后一天…

C电池 和 D 电池的作用和类型详解及其之间的区别

C 和 D 电池是我们日常生活中必不可少的部件。它们通常用于高功率设备。例如手电筒和玩具。 D 型电池和 C 型电池是两种常见的电池类型。它们是一次性圆柱形电池。您可以在很多设备上使用它们。虽然它们有很多相似之处&#xff0c;但它们也有不同的特点。这些特点使它们适合某…

如何用qq邮箱注册outlook邮箱

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ​ 目录 第一步输入qq邮箱 第二步…

数据类型及数据块认知

西门子STEP7编程语言 梯形图(LAD) 功能块图(FBD) 语句表(STL) 其中梯形图和功能块图可以相互转换 CPU常用数据区 信号输入区 I 信号输出区 Q 程序中表现形式&#xff0c;IX.X/QX.X;IWX/QWX-访问的是CPU输出输入过程映像区 另一种形式IWX:P/QWX:P-访问的是信号端口地址&#xf…

深度整合全球资源,分贝通打造高效、合规的海外差旅管理平台

在全球化商业活动的背景下,中国企业出海已成为常态。然而,随着海外差旅市场的全面增长,企业在海外支出管理上面临诸多挑战。据2023年数据显示,分贝通出海差旅业务GMV同比增长高达500倍,这一增长背后隐藏着企业对于更省钱、更高效管控方式的迫切需求。 面对与日俱增的开支,企业开…

Websocket 替代方案:如何使用 Firestore 监听实时事件

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 ​在现代 Web 开发中,实时更新功能对于许多应用程序(如聊天应用、协作工具和在线游戏)都是必不可少的。虽然 WebSocket 是一种常用的实时通信技术,但 Google 的 Firestore 也提供了一种强大的替代方案,使得实时监听变得…