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

2024-08-20 18:44

本文主要是介绍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)

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

这篇关于Python(PyTorch)物理变化可微分神经算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090875

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp