Python(PyTorch)物理变化可微分神经算法

🎯要点

🎯使用受控物理变换序列实现可训练分层物理计算 | 🎯多模机械振荡、非线性电子振荡器和光学二次谐波生成神经算法验证 | 🎯训练输入数据,物理系统变换产生输出和可微分数字模型估计损失的梯度 | 🎯多模振荡对输入数据进行可控卷积 | 🎯物理神经算法数学表示、可微分数学模型 | 🎯MNIST和元音数据集评估算法

🍪语言内容分比

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

🍇PyTorch可微分优化

假设张量 x x x是元参数, a a a是普通参数(例如网络参数)。我们有内部损失 L in  = a 0 ⋅ x 2 L ^{\text {in }}=a_0 \cdot x^2 Lin =a0x2 并且我们使用梯度 ∂ L in  ∂ a 0 = x 2 \frac{\partial L ^{\text {in }}}{\partial a_0}=x^2 a0Lin =x2 更新 a a a a 1 = a 0 − η ∂ L in  ∂ a 0 = a 0 − η x 2 a_1=a_0-\eta \frac{\partial L ^{\text {in }}}{\partial a_0}=a_0-\eta x^2 a1=a0ηa0Lin =a0ηx2。然后我们计算外部损失 L out  = a 1 ⋅ x 2 L ^{\text {out }}=a_1 \cdot x^2 Lout =a1x2。因此外部损失到 x x x 的梯度为:
∂ L out  ∂ x = ∂ ( a 1 ⋅ x 2 ) ∂ x = ∂ a 1 ∂ x ⋅ x 2 + a 1 ⋅ ∂ ( x 2 ) ∂ x = ∂ ( a 0 − η x 2 ) ∂ x ⋅ x 2 + ( a 0 − η x 2 ) ⋅ 2 x = ( − η ⋅ 2 x ) ⋅ x 2 + ( a 0 − η x 2 ) ⋅ 2 x = − 4 η x 3 + 2 a 0 x \begin{aligned} \frac{\partial L ^{\text {out }}}{\partial x} & =\frac{\partial\left(a_1 \cdot x^2\right)}{\partial x} \\ & =\frac{\partial a_1}{\partial x} \cdot x^2+a_1 \cdot \frac{\partial\left(x^2\right)}{\partial x} \\ & =\frac{\partial\left(a_0-\eta x^2\right)}{\partial x} \cdot x^2+\left(a_0-\eta x^2\right) \cdot 2 x \\ & =(-\eta \cdot 2 x) \cdot x^2+\left(a_0-\eta x^2\right) \cdot 2 x \\ & =-4 \eta x^3+2 a_0 x \end{aligned} xLout =x(a1x2)=xa1x2+a1x(x2)=x(a0ηx2)x2+(a0ηx2)2x=(η2x)x2+(a0ηx2)2x=4ηx3+2a0x
鉴于上述分析解,让我们使用 TorchOpt 中的 MetaOptimizer 对其进行验证。MetaOptimizer 是我们可微分优化器的主类。它与功能优化器 torchopt.sgdtorchopt.adam 相结合,定义了我们的高级 API torchopt.MetaSGDtorchopt.MetaAdam

首先,定义网络。

from IPython.display import displayimport torch
import torch.nn as nn
import torch.nn.functional as Fimport torchoptclass Net(nn.Module):def __init__(self):super().__init__()self.a = nn.Parameter(torch.tensor(1.0), requires_grad=True)def forward(self, x):return self.a * (x**2)

然后我们声明网络(由 a 参数化)和元参数 x。不要忘记为 x 设置标志 require_grad=True

net = Net()
x = nn.Parameter(torch.tensor(2.0), requires_grad=True)

接下来我们声明元优化器。这里我们展示了定义元优化器的两种等效方法。

optim = torchopt.MetaOptimizer(net, torchopt.sgd(lr=1.0))
optim = torchopt.MetaSGD(net, lr=1.0)

元优化器将网络作为输入并使用方法步骤来更新网络(由a参数化)。最后,我们展示双层流程的工作原理。

inner_loss = net(x)
optim.step(inner_loss)outer_loss = net(x)
outer_loss.backward()
# x.grad = - 4 * lr * x^3 + 2 * a_0 * x
#        = - 4 * 1 * 2^3 + 2 * 1 * 2
#        = -32 + 4
#        = -28
print(f'x.grad = {x.grad!r}')

输出:

x.grad = tensor(-28.)

让我们从与模型无关的元学习算法的核心思想开始。该算法是一种与模型无关的元学习算法,它与任何使用梯度下降训练的模型兼容,并且适用于各种不同的学习问题,包括分类、回归和强化学习。元学习的目标是在各种学习任务上训练模型,以便它仅使用少量训练样本即可解决新的学习任务。

更新规则定义为:

给定微调步骤的学习率 α \alpha α θ \theta θ 应该最小化
L ( θ ) = E T i ∼ p ( T ) [ L T i ( θ i ′ ) ] = E T i ∼ p ( T ) [ L T i ( θ − α ∇ θ L T i ( θ ) ) ] L (\theta)= E _{ T _i \sim p( T )}\left[ L _{ T _i}\left(\theta_i^{\prime}\right)\right]= E _{ T _i \sim p( T )}\left[ L _{ T _i}\left(\theta-\alpha \nabla_\theta L _{ T _i}(\theta)\right)\right] L(θ)=ETip(T)[LTi(θi)]=ETip(T)[LTi(θαθLTi(θ))]
我们首先定义一些与任务、轨迹、状态、动作和迭代相关的参数。

import argparse
from typing import NamedTupleimport gym
import numpy as np
import torch
import torch.optim as optimimport torchopt
from helpers.policy import CategoricalMLPPolicyTASK_NUM = 40
TRAJ_NUM = 20
TRAJ_LEN = 10STATE_DIM = 10
ACTION_DIM = 5GAMMA = 0.99
LAMBDA = 0.95outer_iters = 500
inner_iters = 1

接下来,我们定义一个名为 Traj 的类来表示轨迹,其中包括观察到的状态、采取的操作、采取操作后观察到的状态、获得的奖励以及用于贴现未来奖励的伽玛值。

class Traj(NamedTuple):obs: np.ndarrayacs: np.ndarraynext_obs: np.ndarrayrews: np.ndarraygammas: np.ndarray

评估函数用于评估策略在不同任务上的性能。它使用内部优化器来微调每个任务的策略,然后计算微调前后的奖励。

def evaluate(env, seed, task_num, policy):pre_reward_ls = []post_reward_ls = []inner_opt = torchopt.MetaSGD(policy, lr=0.1)env = gym.make('TabularMDP-v0',num_states=STATE_DIM,num_actions=ACTION_DIM,max_episode_steps=TRAJ_LEN,seed=args.seed,)tasks = env.sample_tasks(num_tasks=task_num)policy_state_dict = torchopt.extract_state_dict(policy)optim_state_dict = torchopt.extract_state_dict(inner_opt)for idx in range(task_num):for _ in range(inner_iters):pre_trajs = sample_traj(env, tasks[idx], policy)inner_loss = a2c_loss(pre_trajs, policy, value_coef=0.5)inner_opt.step(inner_loss)post_trajs = sample_traj(env, tasks[idx], policy)pre_reward_ls.append(np.sum(pre_trajs.rews, axis=0).mean())post_reward_ls.append(np.sum(post_trajs.rews, axis=0).mean())torchopt.recover_state_dict(policy, policy_state_dict)torchopt.recover_state_dict(inner_opt, optim_state_dict)return pre_reward_ls, post_reward_ls

在主函数中,我们初始化环境、策略和优化器。策略是一个简单的 MLP,它输出动作的分类分布。内部优化器用于在微调阶段更新策略参数,外部优化器用于在元训练阶段更新策略参数。性能通过微调前后的奖励来评估。每次外部迭代都会记录并打印训练过程。

def main(args):torch.manual_seed(args.seed)torch.cuda.manual_seed_all(args.seed)env = gym.make('TabularMDP-v0',num_states=STATE_DIM,num_actions=ACTION_DIM,max_episode_steps=TRAJ_LEN,seed=args.seed,)policy = CategoricalMLPPolicy(input_size=STATE_DIM, output_size=ACTION_DIM)inner_opt = torchopt.MetaSGD(policy, lr=0.1)outer_opt = optim.Adam(policy.parameters(), lr=1e-3)train_pre_reward = []train_post_reward = []test_pre_reward = []test_post_reward = []for i in range(outer_iters):tasks = env.sample_tasks(num_tasks=TASK_NUM)train_pre_reward_ls = []train_post_reward_ls = []outer_opt.zero_grad()policy_state_dict = torchopt.extract_state_dict(policy)optim_state_dict = torchopt.extract_state_dict(inner_opt)for idx in range(TASK_NUM):for _ in range(inner_iters):pre_trajs = sample_traj(env, tasks[idx], policy)inner_loss = a2c_loss(pre_trajs, policy, value_coef=0.5)inner_opt.step(inner_loss)post_trajs = sample_traj(env, tasks[idx], policy)outer_loss = a2c_loss(post_trajs, policy, value_coef=0.5)outer_loss.backward()torchopt.recover_state_dict(policy, policy_state_dict)torchopt.recover_state_dict(inner_opt, optim_state_dict)# Loggingtrain_pre_reward_ls.append(np.sum(pre_trajs.rews, axis=0).mean())train_post_reward_ls.append(np.sum(post_trajs.rews, axis=0).mean())outer_opt.step()test_pre_reward_ls, test_post_reward_ls = evaluate(env, args.seed, TASK_NUM, policy)train_pre_reward.append(sum(train_pre_reward_ls) / TASK_NUM)train_post_reward.append(sum(train_post_reward_ls) / TASK_NUM)test_pre_reward.append(sum(test_pre_reward_ls) / TASK_NUM)test_post_reward.append(sum(test_post_reward_ls) / TASK_NUM)print('Train_iters', i)print('train_pre_reward', sum(train_pre_reward_ls) / TASK_NUM)print('train_post_reward', sum(train_post_reward_ls) / TASK_NUM)print('test_pre_reward', sum(test_pre_reward_ls) / TASK_NUM)print('test_post_reward', sum(test_post_reward_ls) / TASK_NUM)

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

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

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

相关文章

Nacos微服务注册管理中心与服务通信

参照springboot-alibaba-ribbon项目学习 E:\Codes\Idea_java_works\apesource\springboot\微服务\springboot_alibaba_ribbon Nacos 微服务注册中心-discover Nacos 是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中⼼ 配置…

Java入门:06.Java中的方法--进阶02.03

2 可变参数 方法调用时, 传递的实参数量,是由被调用方法的参数列表数列决定的。 一般来讲,传递的实参数量必须与形参变量数量相同,但是也有一种特殊的参数,允许调用时传递的实参数量是可变,这种参数就称为…

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…

AI 时代的编程革命:如何在挑战中抓住机遇?

AI 发展对软件开发的挑战与机遇&#xff1a;程序员应对策略 随着人工智能&#xff08;AI&#xff09;技术的快速进步&#xff0c;软件开发领域正经历深刻的变革。AI 不仅改变了编程的方式&#xff0c;也对程序员的职业发展产生了重要影响。在这个背景下&#xff0c;我们既看到…

HTML5休闲小游戏《砖块破坏者》源码,引流、刷广告利器

HTML5休闲小游戏《砖块破坏者》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468802.html

Linux:Bash中的命令介绍(简单命令、管道以及命令列表)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 在Bash中&#xff0c;命令执行的方式可以分为简单命令、管道和命令列表组成。这些结构提供了强大的工具&#xff0c;允许用户组合命令并精确控制其执行方式。以下是对这…

2024年【电气试验】找解析及电气试验模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电气试验找解析根据新电气试验考试大纲要求&#xff0c;安全生产模拟考试一点通将电气试验模拟考试试题进行汇编&#xff0c;组成一套电气试验全真模拟考试试题&#xff0c;学员可通过电气试验模拟考试全真模拟&#…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

B/S架构和C/S架构的区别

B/S架构、C/S架构区别 1. B/S架构 1.1 什么是B/S架构 B/S架构的全称为Browser/Server&#xff0c;即浏览器/服务器结构。Browser指的是Web浏览器&#xff0c;极少数事务逻辑在前端实现&#xff0c;但主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装&#xff0c;只需要…

动态内存管理-经典笔试题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目一&#xff1a; 结果&#xff1a;程序崩溃 原因&#xff1a; 1、函数是传值调用&#xff0c;出了函数p不存在&#xff0c;str未改变&#xff0c;依旧为空指针&#xff0c;运行时发…

【CTF Web】CTFShow 版本控制泄露源码2 Writeup(目录扫描+.svn泄漏)

版本控制泄露源码2 10 版本控制很重要&#xff0c;但不要部署到生产环境更重要。 解法 用 dirsearch 扫描。 dirsearch -u https://8d22223d-dc2c-419c-b82d-a1d781eda427.challenge.ctf.show/找到 .svn 仓库。 访问&#xff1a; https://8d22223d-dc2c-419c-b82d-a1d781eda…

ubuntu安装minio

# 下载MinIO的可执行文件 curl -O https://dl.min.io/server/minio/release/linux-amd64/minio # 添加执行权限 chmod x minio # 运行MinIO (需要先创建存储数据和存储存储桶的目录) nohup ./minio server /home/lighthouse/minioDir/data /home/lighthouse/minioDir/bucke…

修复线上问题,又造成了个Bug

项目场景 这是一位朋友给我分享的实际线上问题&#xff0c;看似简单却害了项目再次造出一个bug来。 场景&#xff1a;线上环境中&#xff0c;需要查询某某业务数据&#xff0c;条件是状态&#xff0c;之前产品只要求查两个状态的&#xff0c;但现在让他再多查一个状态的。 自…

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…

Go Convey测试框架入门(go convey gomonkey)

Go Convey测试框架入门 介绍 GoConvey是一款针对Golang的测试框架&#xff0c;可以管理和运行测试用例&#xff0c;同时提供了丰富的断言函数&#xff0c;并支持很多 Web 界面特性。 Golang虽然自带了单元测试功能&#xff0c;并且在GoConvey框架诞生之前也出现了许多第三方测…

OSPF路由原理详解与关键点

目录 一. OSPF简介: 二. OSPF原理描述: 三. OSPF的核心内容: 四. OSPF的邻居关系和邻接 五. LSA在各区域中传播的支持情况 一. OSPF简介: 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&…

技术债务已接管经济

“技术债务”一词通常指软件开发过程中的捷径或次优方法。它表现为设计不良的代码、缺乏文档和过时的组件。虽然正确编写的代码和文档是永恒的&#xff0c;但组件和方法却不是。随着时间的推移&#xff0c;软件及其组件可能会成为技术债务。自 40 年前的 20 世纪 80 年代软件行…

【嵌入式开发之网络编程】TCP端口和UDP端口

目录 网络端口的定义及作用 运输层的作用 运输层的两个主要协议 用户数据报协议UDP (User Datagram Protocol) 传输控制协议TCP (Transmission Control Protocol) 运输层的端口及分类 按照端口号分类 按照协议类型分类 BSD端口 网络端口的定义及作用 在网络技术中…