论文笔记(五十七)Diffusion Model Predictive Control
Diffusion Model Predictive Control
- 文章概括
- 摘要
- 1. Introduction
- 2. Related work
- 3. 方法
- 3.1 模型预测控制
- 3.2. 模型学习
- 3.3. 规划(Planning)
- 3.4. 适应
- 4. 实验(Experiments)
- 4.1. 对于固定奖励,D-MPC 可与其他离线 RL 方法相媲美
- 4.2. 对新奖励的推广
- 4.3. 适应新动态
- 4.4. 消融研究
- 4.4.1. 扩散行动提案提高了性能并简化了规划算法。
- 4.4.2. 多步骤扩散行动建议有助于提高绩效
- 4.4.3. 多步扩散动力学模型有助于提高性能
- 4.5. D-MPC 可提炼为用于高频控制的快速反应策略
- 5. 结论
文章概括
引用:
@article{zhou2024diffusion,title={Diffusion Model Predictive Control},author={Zhou, Guangyao and Swaminathan, Sivaramakrishnan and Raju, Rajkumar Vasudeva and Guntupalli, J Swaroop and Lehrach, Wolfgang and Ortiz, Joseph and Dedieu, Antoine and L{\'a}zaro-Gredilla, Miguel and Murphy, Kevin},journal={arXiv preprint arXiv:2410.05364},year={2024}
}
Zhou, G., Swaminathan, S., Raju, R.V., Guntupalli, J.S., Lehrach, W., Ortiz, J., Dedieu, A., Lázaro-Gredilla, M. and Murphy, K., 2024. Diffusion Model Predictive Control. arXiv preprint arXiv:2410.05364.
原文:https://arxiv.org/abs/2410.05364
代码、数据和视频:https
系列文章:
请在 《 《 《文章 》 》 》 专栏中查找
摘要
我们提出了一种新颖的MPC方法——扩散模型预测控制(D-MPC),该方法学习了一个多步骤的动作提议和一个多步骤的动力学模型,两者都使用扩散模型,并将它们结合起来用于在线MPC。在流行的D4RL基准测试上,我们展示了明显优于现有基于模型的离线规划方法使用MPC的性能,并与最先进的(SOTA)基于模型和无模型的强化学习方法竞争。我们还展示了D-MPC在运行时优化新奖励函数和适应新动力学的能力,并突出了与现有基于扩散的规划基线相比的优势。
1. Introduction
模型预测控制(MPC),也称为滚动时域控制,使用动力学模型和行动选择机制(规划器)来构建能够通过最大化已知目标函数(参见例如[Sch+21]对MPC的回顾)解决各种任务的“代理”。更准确地说,我们希望设计一个代理,它能够最大化从当前时间步 t t t开始的规划范围 F F F内的目标函数 J ( a t : t + F − 1 , s t + 1 : t + F ) J(a_{t:t+F-1}, s_{t+1:t+F}) J(at:t+F−1,st+1:t+F)。
a t : t + F − 1 = arg max a t : t + F − 1 E p d ( s t + 1 : t + F ∣ s t , a t : t + F − 1 , h t ) [ J ( a t : t + F − 1 , s t + 1 : t + F ) ] (1) a_{t:t+F-1} = \arg \max_{a_{t:t+F-1}} \mathbb{E}_{p_d(s_{t+1:t+F} \mid s_t, a_{t:t+F-1},h_t)} \left[ J(a_{t:t+F-1}, s_{t+1:t+F}) \right] \tag{1} at:t+F−1=argat:t+F−1maxEpd(st+1:t+F∣st,at:t+F−1,ht)[J(at:t+F−1,st+1:t+F)](1)
这个公式表示在模型预测控制(MPC)中,动作序列 a t : t + F − 1 a_{t:t+F-1} at:t+F−1 是通过最大化期望目标函数 J J J 来选择的,其中 J J J 是关于未来状态 s t + 1 : t + F s_{t+1:t+F} st+1:t+F 和动作序列的函数。这里的期望是在给定当前状态 s t s_t st 和之前动作历史 a t − 1 a_{t-1} at−1 的情况下,对未来动作 a t : t + F − 1 a_{t:t+F-1} at:t+F−1 和状态 s t + 1 : t + F s_{t+1:t+F} st+1:t+F 的联合分布 p d p_d pd 进行积分计算得到的。
其中 h t ≡ { s 1 : t − 1 , a 1 : t − 1 } h_t \equiv \{s_{1:t-1}, a_{1:t-1}\} ht≡{s1:t−1,a1:t−1} 是历史信息。因此,MPC 将代理需要解决的问题分解为两部分:一个建模问题(表示动态模型 p d ( s t + 1 : t + F ∣ s 1 : t , a 1 : t + F − 1 ) p_d(s_{t+1:t+F} \mid s_{1:t}, a_{1:t+F-1}) pd(st+1:t+F∣s1:t,a1:t+F−1),在本文中我们从离线轨迹数据中学习)和一个规划问题(为给定的奖励函数找到最佳的行动序列)。一旦我们选择了行动序列,我们可以执行第一个行动 a t a_t at(或一系列行动的一部分),然后在观察到结果的下一个状态后重新规划,从而创建一个闭环策略。
与标准策略学习方法相比,这种MPC方法的优势在于,我们可以在测试时轻松适应新的奖励函数,只需寻找具有高奖励的状态-行动轨迹。这使得该方法比策略学习方法更加灵活,后者设计用来优化固定的奖励函数(目标条件化的强化学习(RL)可以增加策略的灵活性,但所请求的目标(或与之非常相似的目标)需要在训练集中已经被看到,因此它无法在运行时优化完全新颖的奖励函数。)。此外,学习动态模型通常比学习策略需要更少的数据,因为监督信号(下一个状态预测)是高维的,降低了样本复杂性。此外,如我们在实验中所示,动态模型通常比策略更容易适应新环境。
然而,要使MPC在实践中有效,我们必须解决两个主要问题。首先,动态模型需要足够准确,以避免累积错误问题,即随着轨迹的展开,下一状态预测的错误会随时间累积。其次,规划算法需要足够强大,能够选择一个好的行动序列,避免需要在庞大的可能行动空间中进行穷尽搜索。
我们通过使用扩散模型来学习以下内容的联合轨迹级表征,从而解决这两个问题(1) 世界动力学, p d ( s t + 1 : t + F ∣ s t , a t : t + F − 1 , h t ) p_d(s_{t+1:t+F} | s_t, a_{t:t+F-1}, h_t) pd(st+1:t+F∣st,at:t+F−1,ht),我们通过使用离线的“play”数据学习得到 [Cui+23]。以及(2)动作序列提案分布, ρ ( a t : t + F − 1 ∣ h t ) \rho(a_{t:t+F-1} | h_t) ρ(at:t+F−1∣ht),我们也可以通过在一些示范数据上使用行为克隆来进行离线学习。尽管这样的提案分布可能建议在训练中未见过的新奖励上采取并非最优的行动,我们展示了如何使用一种简单的“抽样、评分和排名”(SSR)方法来弥补这一点,这是随机射击方法的一个变体,使用在离线数据集上训练的多步扩散模型作为行动提议,并且是轨迹优化或交叉熵方法等更复杂方法的一个简单替代品。我们将这种整体方法称为扩散模型预测控制(D-MPC)。
我们在D4RL基准的多种基于状态的连续控制任务上通过实验展示,我们提出的D-MPC框架显著优于现有的基于模型的离线规划方法,例如MBOP [ADA21],它学习单步动力学模型和单步行动提案,因此遭受复合误差问题。相比之下,D-MPC学习更准确的轨迹级模型,避免了这一问题,并使我们的基于模型的方法能够匹敌(有时甚至超越)基于模型的离线强化学习方法的性能。我们还展示了我们的D-MPC方法能在测试时优化新奖励,并且我们能够在新环境中(在机器人的模拟电机缺陷后)使用少量数据微调动力学模型。最后我们对我们的方法进行了消融分析,并展示了不同部分——即使用随机多步动力学、多步行动提议和SSR规划器——每个部分都各自有价值,但结合起来时能产生更多的好处。
总结来说,我们的主要贡献是:
- 我们引入了扩散模型预测控制(D-MPC),结合了多步动作提案和使用扩散模型的动力学模型,用于在线MPC。
- 我们展示了D-MPC在D4RL基准[Fu+20]测试上超过了现有的基于模型的离线规划方法,并且与SOTA增强学习方法具有竞争力。
- 我们提出了一个“采样,评分和排名”(SSR)规划方法,使D-MPC能够在运行时优化新的奖励函数。
- 我们展示了D-MPC通过微调适应新动力学的能力。
- 通过消融,我们验证了我们方法的关键组成部分各自以及结合起来的好处。
2. Related work
相关工作可以按照表1中的层次结构进行划分。基于模型的方法假设一个特定的动力学模型,而无模型方法,无论是更传统的——行为克隆(BC)、保守Q学习(CQL)[Kum+20]、隐式Q学习(IQL)[KNL21]等——还是基于扩散的——扩散策略(DP)[Chi+23]、扩散BC(DBC)[Pea+23]——仅仅学习一个策略。这可以通过直接从专家数据回归或使用Q-学习的某种变体来完成。基于模型的方法可以根据它们如何使用模型进一步划分:Dyna式[Sut91]方法使用它学习策略,无论是在线的还是离线的,它们可以在运行时使用,而MPC式方法则在运行时使用完整模型进行规划,可能还会使用建议分布的指导(请注意,建议分布(我们用 𝜌(𝑎)表示)不同于政策(我们用 𝜋(𝑎)表示),因为它不是直接决定下一个最佳行动,而是帮助加速寻找最佳行动。)。
表1 | 三种分布的故事:比较离线强化学习方法的特性。我们提到的方法定义如下:MOREL等 [Kid+20; Yu+20; Yu+21; RLH22],Dreamer [Haf+20],DWMS(Diffusion World Models)[Alo+23],UniSim [Yan+24],SynthER [Lu+24],DWM(Diffusion World Model)[Din+24],PolyGRAD [RYP24],Diffuser [Jan+22],DT(决策转换器)[Che+21],TT(轨迹转换器)[JLL21],BC(行为克隆),CQL(保守Q学习)[Kum+20],IQL(隐式Q学习)[KNL21],DD(Decision Diffuser)[Aja+23],DP(Diffusion Policy)[Chi+23],IH(模仿人类)[Pea+23],DBC(Diffusion BC)[Wan+23]。
我们可以使用联合分布 p j ( s , a ) p_j(s, a) pj(s,a) 或分解分布 p d ( s ∣ a ) ρ ( a ) p_d(s|a)\rho(a) pd(s∣a)ρ(a) 来模拟模型的动力学和提议。后者提供了额外的灵活性,因为这两部分都可以被精细调整或甚至独立地重新学习。最后,我们可以将这些模型归类为单步(SS)或多步(MS)。单步方法将动力学建模为 p d ( s t + 1 ∣ h t , a t + 1 ) p_d(s_{t+1}|h_t, a_{t+1}) pd(st+1∣ht,at+1)(其中 h t = ( s t − H : t , a t − H : t ) h_t = (s_{t-H:t}, a_{t-H:t}) ht=(st−H:t,at−H:t) 是历史长度 H H H),提议为 ρ ( a t ∣ h t ) \rho(a_t|h_t) ρ(at∣ht),因此我们预测(一个分布在)下一个时间步,条件是过去的观察(和动力学的下一个动作)。我们通过将其以自回归形式组成,作为单步条件的乘积,扩展到整个长度为 F F F 的计划范围,即 p d ( s t + 1 : t + F ∣ s 1 : t , a 1 : t + F − 1 ) = ∏ t t + F − 1 p d ( s t + 1 ∣ s t , a t , h t ) p_d(s_{t+1:t+F}|s_{1:t}, a_{1:t+F-1}) = \prod_{t}^{t+F-1} p_d(s_{t+1}|s_t, a_t, h_t) pd(st+1:t+F∣s1:t,a1:t+F−1)=∏tt+F−1pd(st+1∣st,at,ht)。(注意,即使 h t h_t ht 包含整个过去的历史,即是非马尔可夫的,这也可能导致累积错误。)相比之下,多步方法在轨迹级别上模拟联合分布。因此,MS动力学模型表示 p d ( s t + 1 : t + F ∣ s t , h t , a t : t + F − 1 ) p_d(s_{t+1:t+F}|s_t, h_t, a_{t:t+F-1}) pd(st+1:t+F∣st,ht,at:t+F−1) 和 MS提议表示 ρ ( a t : t + F − 1 ∣ s t , h t ) \rho(a_{t:t+F-1}|s_t, h_t) ρ(at:t+F−1∣st,ht)。
一些近期的论文采用了SS Dyna框架。有些使用传统的动力学建模(例如,MOREL [Kid+20],MOPO [Yu+20],COMBO [Yu+21],RAMBO-RL [RLH22] 以及 Dreamer [Haf+20]),而其他则使用扩散模型。后者包括“Diffusion for World Modeling”论文 [Alo+24](之前称为“Diffusion World Models” [Alo+23]),“UniSim”论文 [Yan+24],以及“SynthER”论文 [Lu+24]。这些论文被用来在训练时从模型中生成样本,以便用比标准无模型强化学习(RL)方法更高的数据效率来训练策略。还有一些其他的近期论文,如“Diffusion World Model” [Din+24] 和 “PolyGRAD” [RYP24],提议使用扩散来创建联合多步(轨迹级)动力学模型。然而,作为Dyna框架的一部分,它们无法像D-MPC那样在运行时进行规划。
关于MPC的文献非常多。与我们的工作最为接近的可能是“Diffuser”[Jan+22],该论文使用扩散模型来拟合一个联合的(状态,行为)多步模型 p j ( s 1 : T , a 1 : T ) p_j(s_{1:T}, a_{1:T}) pj(s1:T,a1:T),利用离线轨迹数据。然后,他们使用分类器引导来驱动抽样过程,在测试时生成优化新奖励的联合序列。与我们的方法的主要区别在于,我们将联合表示为两个模型的乘积,即动态模型 p d ( s 1 : T ∣ a 1 : T ) p_d(s_{1:T} | a_{1:T}) pd(s1:T∣a1:T)和策略/行动提案 ρ ( a 1 : T ) \rho(a_{1:T}) ρ(a1:T)。正如我们在4.3节所展示的,这种因式分解使我们能够轻松适应世界的变化(例如,由于硬件缺陷)仅通过少量新数据,而Difrfuser在这方面则存在困难。此外,我们提出了一个简单的规划算法,该算法不依赖于分类器引导。其他使用带有联合提案的MS的工作包括决策转换器(DT)[Che+21]和轨迹转换器[JLL21]。
同样,“决策扩散”论文[Aja+23]学习了状态的轨迹分布,并使用无分类器引导生成预测奖励高的轨迹;然后使用单独训练的逆动力学模型(IDM)将状态序列转换为行动序列。然而,这种方法不允许在运行时指定新的奖励功能。
MPC也已应用于基于模型的强化学习,其中TD-MPC[HWS22]和TD-MPC2[HSW23]是代表性方法。D-MPC与TD-MPC的工作路线不同,D-MPC使用多步扩散模型用于行动提案和动力学模型,而TD-MPC的工作路线使用单步MLPs。此外,TD-MPC的工作重点是在线学习与环境互动,而在D-MPC中,我们专注于从离线数据中学习,然后在环境中使用学习到的模型进行MPC。
基于模型的离线规划或MBOP论文[ADA21]是我们方法的最初灵感。与之前的MPC方法相比,它将动力学模型和行动提案模型分解,这些模型分别学习并用于规划以优化新奖励。与我们的工作的主要区别在于,他们使用一系列一步确定性MLPs作为他们的动力学模型和行动模型,而我们使用单个随机轨迹级扩散模型。此外,他们使用一种有些复杂的轨迹优化方法来选择行动,而我们使用我们简单的SSR方法。最后,我们还研究了模型对新动力学的适应性。
D-MPC是MPC、分解动力学/行动提案和MS扩散建模的新颖结合。这使我们能够适应新的奖励和动力学,并避免复合误差。
3. 方法
我们现在将描述我们的新D-MPC方法。我们的方法可以看作是基于模型的离线规划(MBOP)论文[ADA21]的多步扩散扩展,同时也进行了一些其他的修改和简化。
3.1 模型预测控制
D-MPC首先在离线阶段学习动力学模型 p s ∣ a p_{s|a} ps∣a、行动提案 π \pi π和启发式价值函数 J J J(见下文),正如我们在3.2节中讨论的,然后继续在环境中执行一个行动,并使用规划器规划下一序列的行动,正如我们在3.3节中讨论的。整个MPC的伪代码在算法1中给出。
3.2. 模型学习
我们假设可以访问一个由(状态, 行动, 奖励)三元组组成的离线轨迹数据集: D = { s 1 : T 1 1 , a 1 : T 1 1 , r 1 : T 1 2 , s 1 : T 2 2 , a 1 : T 2 2 , r 1 : T 2 m , … , s 1 : T M M , a 1 : T M M , r 1 : T M M } \mathcal{D} = \{\mathbf{s}^1_{1:T_1}, \mathbf{a}^1_{1:T_1}, \mathbf{r}^2_{1:T_1}, \mathbf{s}^2_{1:T_2}, \mathbf{a}^2_{1:T_2}, \mathbf{r}^m_{1:T_2}, \ldots, \mathbf{s}^M_{1:T_M}, \mathbf{a}^M_{1:T_M}, \mathbf{r}^M_{1:T_M}\} D={s1:T11,a1:T11,r1:T12,s1:T22,a1:T22,r1:T2m,…,s1:TMM,a1:TMM,r1:TMM}。我们利用这些数据来拟合一个基于扩散的动态模型 p d ( s t + 1 : t + F ∣ s t , h t , a t : t + F − 1 ) p_d(\mathbf{s}_{t+1:t+F}|\mathbf{s}_t, \mathbf{h}_t, \mathbf{a}_{t:t+F-1}) pd(st+1:t+F∣st,ht,at:t+F−1) 和另一个基于扩散的行动提案 ρ ( a t : t + F − 1 ∣ s t , h t ) \rho(\mathbf{a}_{t:t+F-1}|\mathbf{s}_t, \mathbf{h}_t) ρ(at:t+F−1∣st,ht)。为了拟合这些模型,我们以常规方式最小化去噪得分匹配损失。我们在附录A中详细回顾了扩散模型训练,并且推荐读者参考例如[Kar+22]的额外讨论。
我们还定义了一个函数 J J J,该函数可以近似地计算出任何建议的状态和行动序列下的 “奖励-目标”(reward-to-go):
J ( s t : t + F , a t : t + F − 1 ) = E [ ∑ k = t t + F − 1 γ k − t R ( s k , a k ) + γ F V ( s t + F ) ] (2) J(s_{t:t+F}, a_{t:t+F-1}) = \mathbb{E} \left[ \sum_{k=t}^{t+F-1} \gamma^{k-t} R(s_k, a_k) + \gamma^F V(s_{t+F}) \right] \tag{2} J(st:t+F,at:t+F−1)=E[k=t∑t+F−1γk−tR(sk,ak)+γFV(st+F)](2)
这是一个模型预测控制中的价值函数,它累积未来奖励的期望值,其中 R ( s k , a k ) R(s_k, a_k) R(sk,ak) 是在状态 s k s_k sk 和行动 a k a_k ak 下获得的奖励, γ \gamma γ 是折扣因子, V ( s t + F ) V(s_{t+F}) V(st+F) 是终点状态的价值函数。
在这里, γ \gamma γ 是折扣因子, V ( s ) V(s) V(s) 表示从状态 s s s 的价值函数(即,这个搜索过程叶节点的未来奖励估计)。为了学习价值函数,我们使用一个 transformer 从 ( s t : t + F , a t : t + F − 1 ) (s_{t:t+F}, a_{t:t+F-1}) (st:t+F,at:t+F−1) 回归到方程(2)中的折扣未来奖励。我们使用 L2 损失进行回归。我们还使用变压器学习 J J J(尽管如果奖励函数 R R R 已知,我们也可以直接计算 J J J,并且我们使用 V V V 的一个可接受的下界(如 0))。我们在 MPC 中使用 J J J 作为优化的目标函数,并用来指定新颖的任务。关于模型架构和超参数的额外细节,请参见附录 E。
请注意,与 MBOP [ADA21] 不同,我们不需要训练集成,因为扩散模型足够表达各自分布的丰富性。此外,与 [ADA21] 相反,我们不需要训练一个单独的奖励函数:我们在规划视界开始时,针对一系列给定的状态和行动估计我们的价值函数。通过这种方式,我们的目标函数 J J J 已经包含了视界范围内的估计奖励。
3.3. 规划(Planning)
D-MPC与任何规划算法兼容。当动作空间是离散的,我们可以使用蒙特卡洛树搜索解决这个优化问题,如 MuZero 算法 [Sch+20] 中所使用的。这里我们只考虑连续动作空间。
我们提出了一个简单的算法,称为“采样,评分和排名”,表示为算法 2。为了规划,在给定当前状态 s t s_t st 和历史 h t h_t ht 的情况下,我们使用我们的扩散动作提案 ρ \rho ρ 来采样 N N N 个动作序列,我们使用 p s ∣ a p_{s|a} ps∣a 预测相应的状态序列,我们用目标函数 J J J 对这些状态/动作序列进行评分,我们对它们进行排名以选择最佳序列,最后我们返回最佳序列中的第一个动作,并重复整个过程。我们通过实验证明,这种方法优于更复杂的方法,如 MBOP 论文中使用的轨迹优化方法,我们在附录中详细描述了这一方法(算法 5)。我们认为这是因为扩散模型已经在轨迹层面进行推理,并且可以原生地生成一组多样化的合理候选者,无需额外的机制。
3.4. 适应
与所有模型预测控制(MPC)方法一样,我们提出的D-MPC在计算上比没有明确规划的反应式策略方法更加昂贵。然而,在离线环境中使用基于规划的方法的主要优势之一是,它们可以轻松地适应新的奖励函数,这些奖励函数可能与生成离线数据的行为策略优化的奖励函数不同。在D-MPC中,我们可以通过将算法2中的 V n V_n Vn 替换为 V n = κ J ( s 1 : F , A n , 1 : F ) + κ ~ J ~ ( s 1 : F , A n , 1 : F ) V_n = \kappa J(s_{1:F}, A_{n,1:F}) + \tilde{\kappa} \tilde{J}(s_{1:F}, A_{n,1:F}) Vn=κJ(s1:F,An,1:F)+κ~J~(s1:F,An,1:F) 来轻松地纳入新的奖励,其中新的目标函数 J ~ ( s 1 : F , A n , 1 : F ) = 1 F ∑ t = 1 F f novel ( s t , A n , t ) \tilde{J}(s_{1:F}, A_{n,1:F}) = \frac{1}{F} \sum_{t=1}^F f_\text{novel}(s_t, A_{n,t}) J~(s1:F,An,1:F)=F1∑t=1Ffnovel(st,An,t), f novel f_\text{novel} fnovel 是一种新的奖励函数, κ \kappa κ 和 κ ~ \tilde{\kappa} κ~ 分别是原始和新目标的权重。我们在第4.2节中展示了这种方法。当然,如果新任务与智能体以前见过的任何事物都非常不同,那么动作提案可能质量较低,可能需要更多的搜索。
如果世界的动态变化,我们可以在一小部分新分布的探索性“游戏”数据上使用监督式微调 p s ∣ a p_{s|a} ps∣a,然后像以前一样使用MPC。我们在第4.3节中展示了这一点。
4. 实验(Experiments)
在本节中,我们进行了多种实验来评估D-MPC的有效性。具体来说,我们希望通过实验回答以下问题:
- 我们提出的D-MPC是否提高了现有MPC方法(学习离线模型)的性能,并且它能否与标准的基于模型和无模型的离线强化学习方法竞争?
- D-MPC是否可以优化新奖励并在运行时快速适应新的环境动态?
- D-MPC的不同组件如何贡献于其性能的提升?
- 我们能否将D-MPC提炼成一个用于高频控制的快速反应策略?
4.1. 对于固定奖励,D-MPC 可与其他离线 RL 方法相媲美
在本小节中,我们将对固定奖励的情况下,D-MPC与其他离线RL方法进行比较。我们在各种D4RL [Fu+20]任务上评估了我们提出的D-MPC的性能。计划性方法在我们无法获得专家数据的情况下特别有益。因此,我们将比较集中在使用次优数据学习的情况。我们对半猎豹(Halfcheetah)、蹦跳者(Hopper)和2D行走者(Walker2D)的中等和中等复播级别的运动任务进行了实验,对使用克隆数据的Adroit任务中的笔、门和锤子,以及使用混合和部分数据的Franka Kitchen任务进行了实验。
我们的结果总结在表2中。我们看到我们的方法显著优于MBOP和行为克隆(BC)基线。它也略胜于Diffuser。我们还比较了其他流行的无模型离线RL方法,如保守Q学习(CQL)[Kum+20]和隐式Q学习(IQL)[KNL21],以及基于模型的RL方法如MOReL [Kid+20],和序列模型如决策变换器(DT)[Che+21]。这些方法无法在测试时适应新的奖励(不像D-MPC、MBOP和Diffuser),但我们包括它们是为了给出这个基准上的SOTA性能的感觉。我们看到,尽管我们的方法具有额外的灵活性,但仍能与这些现有的、更具限制性的方法的性能相匹配。
表2 | D-MPC与各种基于模型和无模型的离线RL方法在不同领域的性能比较。基准测试结果取自现有论文 [Aja+23; Tar+24]。性能使用标准化分数 [Fu+20] 来衡量。对于D-MPC,我们报告了在30个不同随机初始环境条件的情况下标准化分数的均值和标准误差。遵循 [KNL21],我们用粗体突出显示每项任务中最高分数的5%内的分数。来自 [Aja+23] 的基线数据没有关联的标准误差。当存在时,我们包括来自 [Tar+24] 的基线数据的标准误差。
4.2. 对新奖励的推广
在图1中,我们展示了如何使用新的奖励函数生成有趣的代理行为。我们首先在Walker2d medium-replay数据集上为D-MPC训练了动力学模型、行动建议模型和价值模型。然后,我们用一个新的目标函数 V n V_n Vn替换了训练好的价值模型,用于在我们的计划循环中评分和排名轨迹,使用的新奖励函数是 f novel ( s t , A t ) = 5 exp ( − ( h t − h target ) 2 / 2 σ 2 ) f_\text{novel}(s_t, \text{A}_t) = 5 \exp(-(h_t - h_\text{target})^2 / 2\sigma^2) fnovel(st,At)=5exp(−(ht−htarget)2/2σ2),其中 h t h_t ht是状态 s t s_t st中对应代理高度的维度, h target h_\text{target} htarget是目标高度, σ 2 = 5 × 1 0 − 4 \sigma^2 = 5 × 10^{-4} σ2=5×10−4, κ = 0 \kappa = 0 κ=0 和 κ ~ = 1 \tilde{\kappa} = 1 κ~=1(所以我们只使用新的 J ~ \tilde{J} J~并忽略原始的 J J J)。通过使用这种简单的方法,我们使代理前冲并保持头部向下( h target = 0.9 h_\text{target} = 0.9 htarget=0.9),保持平衡( h target = 1.2 h_\text{target} = 1.2 htarget=1.2),并反复跳跃( h target = 1.4 h_\text{target} = 1.4 htarget=1.4)。
图1 | 新颖的奖励函数可以产生有趣的代理行为。最左侧列展示了使用D-MPC在Walker2d中等重放数据集上训练得到的示例情节,该情节使用了规划器中的训练值函数。其余三列展示了使用基于高度的新颖目标在规划器中生成的行为的个别示例,每列对应一个不同的目标高度。每列的顶部行显示了情节中每个时间步的代理的高度。中间行显示每个情节的代理的两个快照,而底部行图显示了规划器针对的新颖奖励和代理在每个时间步获得的实际环境提供的奖励。此图作为如何使用新颖奖励产生有趣行为的定性展示。
4.3. 适应新动态
在本节中,我们展示了我们的模型在测试时如何能够用有限的经验适应新的动力学。在现实世界的机器人应用中,由于磨损或甚至是不完美的校准可能导致硬件缺陷和测试时的动态变化,因此对新动力学的适应是常见的需求。由于我们的分解公式,其中我们将动力学模型 p s ∣ a p_s|a ps∣a与策略模型 π a \pi_a πa分开,我们可以利用少量收集的具有硬件缺陷的“play”数据,用它来微调我们的多步扩散动力学模型,同时保持我们的行动建议和训练好的价值函数不变。
我们在Walker2D上展示了这一点。我们在中等数据集上训练原始模型,并通过限制作用在足关节上的动作扭矩(动作维度2)来模拟硬件缺陷。在没有缺陷的原始硬件上,训练好的D-MPC达到了76.21 (±2.67)的标准分数。当在有缺陷的硬件上执行这个模型时,性能降低到了只有22.74 (±1.41)。在同样的设置中,部署在有缺陷的硬件上的Diffuser的性能从72.91 (± 3.47)下降到了25.85 (±1.08)。
为了补偿系统动力学的变化,我们通过部署在中等重放数据集上训练的原始D-MPC,在有缺陷的硬件上收集了100集的“play”数据。 我们使用这个小型数据集来微调我们的多步扩散动力学模型,同时保持策略建议和价值模型不变。微调后,性能提高到30.65 (±1.89)。由于diffuser联合模拟状态和动作序列,没有办法独立地仅微调动力学模型。我们改为使用收集到的“play”数据对整个模型进行微调。微调后,diffuser的性能实际上降低到了6.8 (±0.86)。 请查看表3a以获取总结。
4.4. 消融研究
在本节中,我们进行了一系列详细的消融研究,以说明D-MPC中不同组件如何贡献于其良好的性能。 特别是,我们研究了用扩散方法生成行动提案的效果,以及对行动提案和动力学模型使用单步模型与多步模型的影响。我们在D4RL的运动任务上评估了所有变体。 详细结果请见表3b,表4提供了附录中不同D-MPC变体在单独的D4RL领域和级别上的详细性能。
4.4.1. 扩散行动提案提高了性能并简化了规划算法。
现有的基于模型的离线规划方法,如MBOP,通常使用单步确定性MLP策略进行行动提案,使用单步确定性MLP模型集合来模拟随机动力学,并依赖轨迹优化方法进行规划。这种MBOP方法在运动任务上的平均得分为33.13。
我们可以通过替换他们的单步MLP行动提案为单步扩散提案,并用我们更简单的SSR规划器替换他们的TrajOpt规划器,显著提高这一基线MBOP得分并简化算法。这提高了性能至52.93。用单步扩散动力学模型替换他们的MLP动力学模型进一步提供了微小的改进,至53.32。
4.4.2. 多步骤扩散行动建议有助于提高绩效
D-MPC采用多步扩散行动提案。在本节中,我们将展示与单步扩散行动提案相比,这是如何进一步提高性能的。
我们从第4.4.1节中同样的单步MLP动力学模型开始。然后,我们用一个能够联合采样一组行动的多步扩散行动提案替换单步扩散行动提案。这样做将平均性能从52.93提高到了57.14。然后我们在单步扩散动力学的基础上重复这个实验,将性能从53.32提升到了57.81。
表3 | (a) Walker2D在模拟硬件故障前后的表现,以及在使用“玩耍”数据微调(FT)后的表现。 (b) D-MPC各种变体在D4RL运动任务上的平均表现。完整的D-MPC方法在右下角。MS:多步,SS:单步,Diff:扩散,ART:自回归转换器。我们的基准MBOP使用集成和MPPI轨迹优化以及SS MLP动力学模型和SS MLP行动提案,获得了33.13的分数。
4.4.3. 多步扩散动力学模型有助于提高性能
整段翻译:
D-MPC使用多步扩散动力学模型。在本节中,我们将展示这种模型如何减少长期预测中的累积误差,并提升性能。
我们首先独立于规划循环,对单步扩散、多步扩散和自回归变换器(ART)动力学模型(详见附录E.3)进行长期动力学预测的准确性测量。我们在各自领域的中等数据集上训练动力学模型,并使用从中等(训练数据)、中等重放(质量较低的数据)和专家(质量更高的数据)数据集中采样的状态/行为序列,来测量长期动力学预测的准确性。具体来说,我们遵循 [Sch+23],通过计算非速度坐标上的轨迹长度增加的中位根均方偏差(RMSD)来进行。图2总结了结果。从图中我们可以看到,与单步和自回归替代方案相比,多步扩散动力学模型如何减少长期动力学预测中的累积错误,同时保持了优越的泛化能力,尤其是对于不太偏离训练分布的行为分布。
图2 | 长期动力学预测的准确性。我们在中等数据集上训练动力学模型,并在中等(训练数据)、中等重放(质量较低的数据)和专家(质量较高的数据)数据集上进行评估。预测错误通过在1024个采样的状态动作序列(长度为256)上的非速度坐标的中位根均方偏差(RMSD)来衡量。图表显示了中位数±10百分位数范围。多步扩散动力学模型在训练数据上产生显著较低的预测错误,同时保持了卓越的泛化能力,优于其他单步和自回归替代方案。自回归变换器(ART)动力学模型的表现优于单步扩散动力学模型。单步MLP动力学模型显示出迅速增长的累积错误,这在长期动力学预测中尤其明显。
然后,我们评估这些动力学模型在多步扩散动作提案下的D-MPC规划循环中的使用质量。当使用ART动力学模型时,我们获得了59.83的分数;但当使用多步扩散动力学模型时,我们获得了65.98的分数。我们认为这种差异是因为变换器动力学模型将序列级分布表示为一步(尽管非马尔可夫)条件的乘积,即 p d ( s t + 1 : t + F ∣ s 1 : t , a 1 : t + F − 1 ) = ∏ t t + F − 1 p d ( s t + 1 ∣ s 1 : t , a 1 : t − 1 , a t ) p_d (s_{t+1:t+F} | s_{1:t}, a_{1:t+F-1}) = \prod_{t}^{t+F-1} p_d (s_{t+1} | s_{1:t}, a_{1:t-1}, a_t) pd(st+1:t+F∣s1:t,a1:t+F−1)=∏tt+F−1pd(st+1∣s1:t,a1:t−1,at)。相比之下,扩散动力学模型是一种从噪声到清晰轨迹的“非因果”联合分布,而不是从左到右工作。我们推测这使得扩散能够更忠实地捕捉信号的全局属性(例如,预测最终状态是否对应于机器人跌倒)。
4.5. D-MPC 可提炼为用于高频控制的快速反应策略
由于使用了扩散模型,D-MPC的运行时间较慢。在附录J中,我们详细比较了D-MPC与其他方法的运行时间。然而,如果高频控制很重要,我们可以将D-MPC规划器简化为快速的特定任务的MLP策略,类似于MoREL[Kid+20]或MOPO[Yu+20]中的做法。具体来说,我们使用预训练D-MPC计划的动作作为监督,在离线数据集上训练一个MLP策略。我们对在剥离研究中使用的6个D4RL动作域和等级组合进行了这样的操作,并将性能与原始的MLP策略和D-MPC进行了比较。我们训练所有模型100万步,并评估最后的MLP策略检查点。
我们观察到,剥离后的MLP策略在6个D4RL动作域和等级组合中的平均标准化得分为65.08,仅略低于D-MPC的平均标准化得分65.98,并且大大优于原始MLP策略的平均标准化得分41.92。此外,剥离后我们只有一个MLP策略,并且它的运行速度与原始MLP策略相同。
5. 结论
我们提出了扩散模型预测控制(D-MPC),该方法利用扩散模型从离线数据集中学习多步骤动作提案和多步骤动力学,从而改进了MPC。D-MPC通过其多步骤公式减少了累积误差,达到了D4RL基准测试的竞争性能,并能在运行时优化新奇的奖励并适应新的动力学。详细的剥离研究展示了不同D-MPC组件的好处。
我们方法的一个缺点(所有MPC方法共有)是每一步都需要重新规划,这比使用反应策略慢得多。当使用扩散模型时,这一问题尤其突出,因为从扩散模型中抽样特别慢。未来,我们希望调查扩散文献中最近开发的加速方法,例如蒸馏(见[CKS23])。
D-MPC当前的另一个限制是我们只探索了直接访问低维状态的设置,如机器人上的本体感知传感器。未来,我们计划将这项工作扩展到处理像素观测,使用表示学习方法提取抽象潜在表征,这些可以作为我们动力学模型的输入,类似于现有的潜在空间世界建模方法,如Dreamer系列工作,但是在MPC情境下,而不是Dyna情境下。
像所有离线RL方法一样,D-MPC的性能受训练数据集中行为分布的影响。当离线数据集缺乏与目标任务相关的行为时,任何方法的泛化能力本质上受到限制,除非收集额外数据。虽然这对D-MPC来说是一个限制,但它不是我们方法独有的,而是离线RL中的一个基本挑战。在可用数据的范围内,D-MPC擅长优化和适应新奇的奖励和动力学,这代表了离线RL应用的现实场景。我们的方法能够有效地利用现有的行为分布,这是一个重要的优势。未来的工作可以探索技术,在离线数据的限制下鼓励更广泛的探索,可能会扩大D-MPC及类似方法的适用范围,应用于更广泛的场景。
相关文章:
论文笔记(五十七)Diffusion Model Predictive Control
Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划(Planning)3.4. 适应 4. 实验(Experiments)4.1. 对于固定奖励,D-MPC 可与其他离线 RL…...
【在Linux世界中追寻伟大的One Piece】多线程(三)
目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…...
eBay 基于 Celeborn RESTful API 进行自动化工具集成实践
作者:王斐,ebay Hadoop 团队软件工程师,Apache Kyuubi PMC member,Apache Celeborn Committer。 简介:Apache Celeborn 是一个统一的大数据中间服务,致力于提高不同MapReduce引擎的效率和弹性。为了Spark …...
Vue 前端 el-input 如何实现输入框内容始终添加在尾部%
要在 el-input 输入框的尾部添加 %,你可以通过两种方式来实现: 使用 suffix 插槽:这是最直接和最常用的方法。使用 append 插槽:如果你需要在输入框内或者右侧显示其他内容。 方法 1:使用 suffix 插槽 el-input 提供…...
如何通过轻易云实现泛微OA与金蝶云星空的数据无缝对接
FD003-非生产性付款申请 泛微>金蝶付款单-422 数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务流程顺畅运行的关键。本文将重点探讨如何通过轻易云数据集成平台,实现泛微OA-Http与金蝶云星空之间的数据无缝对接,…...
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
mysql 事务之LBCC与MVCC
一、事务 数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。 ACID,事务四个关键特性 1、原子性…...
记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...
大模型专栏--Spring Ai Alibaba介绍和功能演示
Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...
【GPT】为什么人需要睡觉?
睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...
【Linux】磁盘 | 文件系统 | inode
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊ÿ…...
A051-基于Spring Boot的网络海鲜市场系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
《企业级低代码开发平台技术要求》核心要点解析
一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...
AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化
随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...
AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
opencv 区域提取三种算法
opencv 区域提取三种算法 1.轮廓查找 findContours()函数,得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...
C++初阶(十六)--STL--list的模拟实现
目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)
本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
ESLint
代码规范 一套写代码的约定规则;比如赋值符号左右是否需要空格,一句话结束是否要加;.... 代码规范错误 如果你的代码不符合standard的要求,ESLint(脚手架里配的东西)会告诉你哪个文件第几行错了 解决代码…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
如何具体实现商品详情的提取?
在电商领域,获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取淘宝商品的详情信息,并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前,…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
C++设计模式(观察者模式)
一、介绍 1.动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵…...
【unity】WebSocket 与 EventSource 的区别
WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…...
从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
作者 | 白鲸开源 姜维 在数据集成和调度的领域,Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验,使其成为众多企业数据处理的核心工具。 然而,随着新一代大数据平台的迅速崛起,以及信创化改造的要求愈发严…...
第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放
文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...
vmware Ubuntu2004运行STAR-Searcher
github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...
04_JavaScript引入到文件
JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...
38 基于单片机的宠物喂食(ESP8266、红外、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...
Git仓库迁移到远程仓库(源码、分支、提交)
单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹,CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令:拉取旧Git仓库(包含提交、分支、源码) $ git clone --bare http://git.domain.cn/…...
Go语言压缩文件处理
目录 Go 语言压缩文件处理1. 压缩文件:Zip函数2. 解压文件:UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...
Vue3 v-if与v-show的区别
v-if 与 v-show 我们都可以在开发中用于条件渲染,在面试时也是个常考的题目 实现原理 v-if:是真正的条件渲染,当v-if true时,元素会被创建、渲染,并插入到dom树中,这个过程会耗费系统的资源,当…...
同时在github和gitee配置密钥
同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥(默认文件路径为 ~/.ssh/github_id_rsa) ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...
Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解
Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,数组是一种特殊的集合类型,可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中,不可变…...
Failed to find SV in PRN block of SINEX file (Name svnav.dat)
gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables,即可。...
H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
Ubuntu上使用自带python创建虚拟环境
虚拟环境让项目之间的依赖关系更加清晰,也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的,查看python版本及指向(使用的话python要换成python3): ls -l /usr/bin | grep python 2.安装python虚拟环境工…...
对智能电视直播App的恶意监控
首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...
网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...
微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...