深度强化学习实战例子:PPO实现控制倒立摆

【强化学习】PPO算法调参实战:从理论到代码优化倒立摆控制 本文深入探讨了PPO算法在倒立摆控制中的调参实战,从理论到代码优化提供了详细指导。重点解析了学习率、GAE参数和策略裁剪范围等关键超参数的影响,并分享了训练过程优化、网络结构设计和可视化调试的实用技巧,帮助开发者高效实现强化学习算法的工程应用。 阅读详情

PPO算法实现控制倒立摆

完整代码在文章结尾。

PPO算法

PPO算法是TRPO算法的改进版本,也属于策略梯度算法,其价值估计是使用时序差分算法估计,故可视为策略梯度算法下的Actor-Critic算法的范畴。

On-Policy

PPO算法和TRPO算法都是On-Policy(同策略)的,虽然它们都引入了重要性采样,即使用其他策略采样得到的经验样本,但只是为了提高样本利用效率,是工程上的优化。

不过这里两个算法中的其他策略指的是更新前的旧策略。

PPO-截断

PPO算法可分为PPO-惩罚和PPO-截断两种类型。

  • PPO-惩罚是使用拉格朗日乘数法直接将TRPO中的KL散度约束条件放入目标函数,使其变为无约束的优化问题。
  • PPO-截断是直接在目标函数中进行限制,保证新旧策略的参数差距不会过大

且大量实验表明,PPO-截断总是比PPO-惩罚表现得更好,因此下面使用PPO-截断实现控制倒立摆。

策略梯度

对于策略梯度算法,其策略梯度可统一表达为:
∇θJ(θ)=E[∇θln⁡π(A∣S,θ)qπ(S,A)]\nabla_\theta J(\theta) = E[\nabla_\theta \ln \pi(A|S,\theta)q_\pi(S,A)]∇θ​J(θ)=E[∇θ​lnπ(A∣S,θ)qπ​(S,A)]
引入baseline,即基准函数,来降低在使用随机样本近似真实梯度时的近似方差。
可使用基准函数为b(S)=vπ(s)b(S)=v_\pi(s)b(S)=vπ​(s),虽然这并不是最优的基准函数,是移除权重后的次优基准,即状态值函数。

引入基准函数的策略梯度:
∇θJ(θ)=E[∇θln⁡π(A∣S,θ)(qπ(S,A)−vπ(S))]\nabla_\theta J(\theta) = E[\nabla_\theta \ln \pi(A|S,\theta)(q_\pi(S,A)-v_\pi(S))]∇θ​J(θ)=E[∇θ​lnπ(A∣S,θ)(qπ​(S,A)−vπ​(S))]
可定义优势函数A(S,A)=qπ(S,A)−vπ(S)A(S,A) = q_\pi(S,A)-v_\pi(S)A(S,A)=qπ​(S,A)−vπ​(S)

优势函数的迭代近似

由贝尔曼公式可得:
qπ(st,at)−vπ(st)=E[Rt+1+γvπ(St+1)−vπ(St)∣St=st,At=at]q_\pi(s_t,a_t)-v_\pi(s_t)=E[R_{t+1}+\gamma v_\pi(S_{t+1})-v_\pi(S_t)|S_t=s_t,A_t=a_t]qπ​(st​,at​)−vπ​(st​)=E[Rt+1​+γvπ​(St+1​)−vπ​(St​)∣St​=st​,At​=at​]
使用随机近似算法,RM算法对该期望值进行估计:
qt+1(st,at)−vt+1(st)=qt(st,at)−vt(st)−α⋅(qt(st,at)−vt(st)−(rt+1+γvt(st+1)−vt(st)))q_{t+1}(s_t,a_t)-v_{t+1}(s_t)=q_{t}(s_t,a_t)-v_{t}(s_t)-\alpha\cdot(q_{t}(s_t,a_t)-v_{t}(s_t)-(r_{t+1}+\gamma v_t(s_{t+1})-v_t(s_t)))qt+1​(st​,at​)−vt+1​(st​)=qt​(st​,at​)−vt​(st​)−α⋅(qt​(st​,at​)−vt​(st​)−(rt+1​+γvt​(st+1​)−vt​(st​)))
通过上述不断增量式迭代,最终优势函数便可收敛到qπ(S,A)−vπ(S)q_\pi(S,A)-v_\pi(S)qπ​(S,A)−vπ​(S)。

PPO-截断算法的策略梯度

由于引入了重要性采样,策略梯度修改为:
∇θJ(θ)=E[π(A∣S,θ)β(A∣S)∇θln⁡π(A∣S,θ)(qπ(S,A)−vπ(S))]\nabla_\theta J(\theta) = E[\dfrac{\pi(A|S,\theta)}{\beta(A|S)}\nabla_\theta \ln \pi(A|S,\theta)(q_\pi(S,A)-v_\pi(S))]∇θ​J(θ)=E[β(A∣S)π(A∣S,θ)​∇θ​lnπ(A∣S,θ)(qπ​(S,A)−vπ​(S))]
其中β(A∣S)\beta(A|S)β(A∣S)即为经验样本采样时使用的旧策略,这里可表示为π(A∣S,θ′)\pi(A|S,\theta')π(A∣S,θ′)
使用随机梯度方法来近似该真实梯度:
∇θJ(θ)≈π(at∣st,θt)β(at∣st)∇θln⁡π(at∣st,θt)(qπ(st,at)−vπ(st))\nabla_\theta J(\theta) \approx \dfrac{\pi(a_t|s_t,\theta_t)}{\beta(a_t|s_t)}\nabla_\theta \ln \pi(a_t|s_t,\theta_t)(q_\pi(s_t,a_t)-v_\pi(s_t))∇θ​J(θ)≈β(at​∣st​)π(at​∣st​,θt​)​∇θ​lnπ(at​∣st​,θt​)(qπ​(st​,at​)−vπ​(st​))
但是其中优势函数,即动作价值函数和状态价值函数仍是未知的,因此需要对该优势函数进行估计。
可使用时序差分误差来估计该优势函数:
qt(st,at)−vt(st)≈rt+1+γvt(st+1)−vt(st)q_{t}(s_t,a_t)-v_{t}(s_t) \approx r_{t+1}+\gamma v_t(s_{t+1})-v_t(s_t)qt​(st​,at​)−vt​(st​)≈rt+1​+γvt​(st+1​)−vt​(st​)
使用时序差分误差近似可只需使用一个神经网络来表征状态价值函数即可,只用维护一个Critic(状态价值函数)即可。
在时刻t刚开始时,上述的近似是不太准确的,但随着Critic不断更新迭代(优势函数的迭代近似部分),优势函数近似值会不断收敛到真正的优势函数值。

  • 因此最终PPO-截断的Actor策略梯度可表示为:
    ∇θJ(θ)≈π(at∣st,θt)β(at∣st)∇θln⁡π(at∣st,θt)(qt(st,at)−vt(st))\nabla_\theta J(\theta) \approx \dfrac{\pi(a_t|s_t,\theta_t)}{\beta(a_t|s_t)}\nabla_\theta \ln \pi(a_t|s_t,\theta_t)(q_t(s_t,a_t)-v_t(s_t))∇θ​J(θ)≈β(at​∣st​)π(at​∣st​,θt​)​∇θ​lnπ(at​∣st​,θt​)(qt​(st​,at​)−vt​(st​))

一般实际使用时将该策略梯度化简:
∇θJ(θ)≈1β(at∣st)∇θπ(at∣st,θt)(qt(st,at)−vt(st))\nabla_\theta J(\theta) \approx \dfrac{1}{\beta(a_t|s_t)}\nabla_\theta \pi(a_t|s_t,\theta_t)(q_t(s_t,a_t)-v_t(s_t))∇θ​J(θ)≈β(at​∣st​)1​∇θ​π(at​∣st​,θt​)(qt​(st​,at​)−vt​(st​))

PPO-截断存在截断步骤:
∇θJ(θ)=min⁡(∇θJ(θ),clip(∇θπ(at∣st)β(at∣st),1−ϵ,1+ϵ)⋅A(st))\nabla_\theta J(\theta) = \min(\nabla_\theta J(\theta),clip(\dfrac{\nabla_\theta \pi(a_t|s_t)}{\beta(a_t|s_t)},1-\epsilon,1+\epsilon)\cdot A(s_t))∇θ​J(θ)=min(∇θ​J(θ),clip(β(at​∣st​)∇θ​π(at​∣st​)​,1−ϵ,1+ϵ)⋅A(st​))

注意,策略更新的目标是使目标函数J(θ)J(\theta)J(θ)最大化,即价值最大化,这里需要使用梯度上升。因此使用Pytorch的反向传播时,需要在该策略梯度前加上负号,因为Pytorch的反向传播默认是梯度下降。

  • 而Critic的梯度表示为:
    ∇wJ(w)=(vt(st,wt)−(rt+1+γvt(st+1,wt)))∇wvt(st,wt)\nabla_wJ(w)=(v_t(s_t,w_t) - (r_{t+1}+\gamma v_t(s_{t+1},w_t)))\nabla_w v_t(s_t,w_t)∇w​J(w)=(vt​(st​,wt​)−(rt+1​+γvt​(st+1​,wt​)))∇w​vt​(st​,wt​)
    Critic使用梯度下降,最小化近似价值与真实价值之间的误差,因此实际使用Pytorch的反向传播时,无需添加负号。

PPO算法代码实践

Actor

演员使用一层隐藏层的神经网络

class Actor(nn.Module):
    """演员家"""
    def __init__(self,state_dim,hidden_dim,action_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,action_dim),
            nn.Softmax(dim=-1)
        )

    def forward(self,x):
        return self.net(x)
Critic

评论家也使用一层隐藏层的神经网络

class Critic(nn.Module):
    """评论家"""
    def __init__(self, state_dim,hidden_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,1)
        )

    def forward(self,x):
        return self.net(x).squeeze(1)

最后输出使用squeeze(1)是为了将输出变换为一维向量

PPO Agent

PPO算法为On-Policy,每完成一个回合,将采集到的样本用于PPO的策略优化迭代。

class PPO:
    """PPO算法"""
    def __init__(self,state_dim,action_dim,gamma,epochs,eps,device,hidden_dim=256):
        self.actor = Actor(state_dim,hidden_dim,action_dim).to(device)
        self.critic = Critic(state_dim,hidden_dim).to(device)
        self.optimizer_actor = torch.optim.AdamW(self.actor.parameters())
        self.optimizer_critic = torch.optim.AdamW(self.critic.parameters())
        self.device = device
        self.gamma = gamma # 折扣因子
        self.epochs = epochs # 每次策略优化迭代次数
        self.eps = eps # 策略可允许的更新的范围[1-eps,1+eps]
        self.initialize() # 对actor和critic网络的参数初始化

    def take_action(self,state):
        """
        输入状态,输出动作的索引
        """
        state = torch.tensor(state).to(self.device)
        action_prob = self.actor(state) # 生成各个动作的概率,如[0.4,0.6]
        categorical = torch.distributions.Categorical(action_prob) # 根据概率生成动作的概率分布对象
        action = categorical.sample() # 根据概率分布进行采样,得到动作的索引
        return action.cpu().item() # 输出动作的索引值
    
    def update(self,state,action,reward,next_state,done):
        """
        进行算法更新
        """

        # 对输入的量,转换为tensor类型,且由于反向传播需要float类型,而不是double类型,因此需要认为指定torch.float32。
        # 使用gather函数时,action需为int64类型
        # done用于1 - done时,需事先转换为torch.float32类型
        state = torch.tensor(state,dtype=torch.float32).to(self.device)
        action = torch.tensor(action,dtype=torch.int64).to(self.device)
        reward = torch.tensor(reward,dtype=torch.float32).to(self.device)
        next_state = torch.tensor(next_state,dtype=torch.float32).to(self.device)
        done = torch.tensor(done,dtype=torch.float32).to(self.device)

        state_value = self.critic(state)
        next_state_value = self.critic(next_state)
        TD_target = reward + self.gamma * next_state_value * (1 - done) # 计算TD目标,用于Critic loss的计算
        advantage = (TD_target - state_value).detach() # 注意优势函数中的变量不参与反向传播,作为常数参与计算
        old_prob = self.actor(state).gather(1,action.unsqueeze(1)).detach() # 旧策略的概率同理不参与反向传播,作为常数参与计算

        for _ in range(self.epochs):
            """
            对于每一批样本,进行多次策略优化迭代
            """
            new_prob = self.actor(state).gather(1,action.unsqueeze(1))
            ratio = new_prob / old_prob
            s1 = ratio * advantage
            s2 = torch.clamp(ratio,1-self.eps,1+self.eps) * advantage
            actor_loss = -torch.mean(torch.min(s1,s2))
            critic_loss = torch.mean(F.mse_loss(self.critic(state),TD_target.detach())) # TD目标也不参与反向传播,作为常数参与计算
            self.optimizer_actor.zero_grad()
            self.optimizer_critic.zero_grad()
            actor_loss.backward()
            critic_loss.backward()
            self.optimizer_actor.step()
            self.optimizer_critic.step()

    def initialize(self):
        def init_weights(m):
            if isinstance(m,nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                nn.init.zeros_(m.bias)
        self.actor.apply(init_weights)
        self.critic.apply(init_weights)

完整代码

import torch
import torch.nn.functional as F
import os
import numpy as np
import torch.nn as nn
import gym
import matplotlib.pyplot as plt


class Actor(nn.Module):
    """演员家"""
    def __init__(self,state_dim,hidden_dim,action_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,action_dim),
            nn.Softmax(dim=-1)
        )

    def forward(self,x):
        return self.net(x)


class Critic(nn.Module):
    """评论家"""
    def __init__(self, state_dim,hidden_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,hidden_dim),nn.LeakyReLU(),
            nn.Linear(hidden_dim,1)
        )

    def forward(self,x):
        return self.net(x).squeeze(1)

class PPO:
    """PPO算法"""
    def __init__(self,state_dim,action_dim,gamma,epochs,eps,device,hidden_dim=256):
        self.actor = Actor(state_dim,hidden_dim,action_dim).to(device)
        self.critic = Critic(state_dim,hidden_dim).to(device)
        self.optimizer_actor = torch.optim.AdamW(self.actor.parameters())
        self.optimizer_critic = torch.optim.AdamW(self.critic.parameters())
        self.device = device
        self.gamma = gamma
        self.epochs = epochs
        self.eps = eps

    def take_action(self,state):
        state = torch.tensor(state).to(self.device)
        action_prob = self.actor(state)
        categorical = torch.distributions.Categorical(action_prob)
        action = categorical.sample()
        return action.cpu().item()
    
    def update(self,state,action,reward,next_state,done):
        state = torch.tensor(state,dtype=torch.float32).to(self.device)
        action = torch.tensor(action,dtype=torch.int64).to(self.device)
        reward = torch.tensor(reward,dtype=torch.float32).to(self.device)
        next_state = torch.tensor(next_state,dtype=torch.float32).to(self.device)
        done = torch.tensor(done,dtype=torch.float32).to(self.device)

        state_value = self.critic(state)
        next_state_value = self.critic(next_state)
        TD_target = reward + self.gamma * next_state_value * (1 - done)
        advantage = (TD_target - state_value).detach()
        old_prob = self.actor(state).gather(1,action.unsqueeze(1)).detach()

        for _ in range(self.epochs):
            new_prob = self.actor(state).gather(1,action.unsqueeze(1))
            ratio = new_prob / old_prob
            s1 = ratio * advantage
            s2 = torch.clamp(ratio,1-self.eps,1+self.eps) * advantage
            actor_loss = -torch.mean(torch.min(s1,s2))
            critic_loss = torch.mean(F.mse_loss(self.critic(state),TD_target.detach()))
            self.optimizer_actor.zero_grad()
            self.optimizer_critic.zero_grad()
            actor_loss.backward()
            critic_loss.backward()
            self.optimizer_actor.step()
            self.optimizer_critic.step()


if __name__ == '__main__':
    os.system('cls')
    # env = gym.envs.registry
    gamma = 0.9
    epochs = 20 # 多次策略迭代,一般10~30之间
    eps = 0.2
    device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
    episode = 500

    # env = gym.make('CartPole-v1',render_mode='human')
    env = gym.make('CartPole-v1')
    state_dim = env.observation_space.shape[0]
    action_dim = env.action_space.n
    agent = PPO(state_dim,action_dim,gamma,epochs,eps,device)

    episode_return_list = []

    for _ in range(episode):
        trajectory = []
        episode_return = []
        state, info = env.reset()
        done = False
        while not done:
            action = agent.take_action(state)
            next_state, reward, done, _, __ = env.step(action)
            trajectory.append((state,action,reward,next_state,done))
            episode_return.append(reward)
            state = next_state
        state, action, reward, next_state, done = zip(*trajectory)
        agent.update(np.array(state),np.array(action),np.array(reward),np.array(next_state),np.array(done))
        res = 0
        for i in range(len(episode_return)-1,-1,-1):
            res = gamma * res + episode_return[i]
        print(f'回报:{res}')
        episode_return_list.append(res)

    epi = [x for x in range(episode)]
    plt.plot(epi, episode_return_list)
    plt.show()
    env.close()

回报收敛图:
在这里插入图片描述

PPO算法的基本原理 PPO算法与DDPG算法在水下自适应编码中均广泛的有应用,但两者之间略有区别,后续博主会继续更新基于强化学习的水声OFDM信道自适应调制方案论文的详细内容。 阅读详情

相关推荐

强化学习与控制论:从LQR到PPO的倒立摆实战解析

经典控制理论与强化学习看似分属不同技术路线,实则共享同一数学内核——最优决策。控制论通过状态空间方程与HJB方程描述系统,而强化学习则基于Bellman方程与马尔可夫决策过程,在未知环境中试错寻优。两者的核心差异在于对模型依赖程度:传统LQR需要精确线性化模型,而PPO、SAC等深度强化学习算法可端到端学习策略。在机器人、自动驾驶和工业自动化场景中,工程师常面临选型困惑:是用可解释但建模成本高的MPC,还是用灵活但缺乏安全保证的RL?本文以倒立摆为统一实验载体,分别用LQR和PPO/SAC实现稳定控制,对比

weixin_34242331的博客 328

【强化学习】PPO算法求解倒立摆问题 + Pytorch代码实战

Agent 必须在两个动作之间做出决定 - 向左或向右移动推车 - 以使连接到它的杆保持直立。近端策略优化 ( proximal policy optimization, PPO):避免在使用重要性采样时由于在θ\thetaθ下的pθ(at∣st)pθ​(at​∣st​)与在θ′θ′下的pθ′(at∣st)pθ′​(at​∣st​)相差太多, 导致重要性采样结果偏差较大而采取的算法。

知不足而奋进,望远山而前行 3万+

基于深度强化学习的游戏AI实战:从DQN到PPO

本文通过一个完整的实战案例,展示了如何使用DQN和PPO训练游戏AI。我们详细介绍了环境初始化、模型定义、训练和可视化的步骤,并提供了可运行的代码。希望本文能为读者在实际项目中应用深度强化学习提供实用的指导和启发。

Programming Talk 579

PPO算法 车杆环境 倒立摆环境

上一章介绍的TRPO算法在很多场景上的应用都很成功,但是它的计算过程非常复杂,每一步更新的运算量非常大。于是,TRPO算法的改进版–PPO算法在2017年被提出,PPO基于TRPO的思想,但是其算法实现更加简单。并且大量试验结果表明,与TRPO算法相比,PPO能学习得一样好(甚至更快),这使得PPO成为非常流行的强化学习算法。如果我们想要尝试在一个新的环境中使用强化学习算法,那么PPO就属于可以首先尝试的算法。

oceancoco的博客 1381

在Simulink中实现基于深度强化学习的控制算法仿真建模

通过上述步骤,你可以在Simulink中实现基于深度强化学习的控制算法仿真建模。这种方法适用于许多复杂的控制问题,尤其是当传统控制方法难以找到有效解决方案时。随着经验的积累,你可以进一步探索不同的深度强化学习算法及其变种,以适应更广泛的应用场景。此外,还可以结合其他先进技术(如迁移学习、多智能体协作等),提升模型的表现能力。

amy_mhd的博客 416

PPO算法的实际案例分析

1. 背景介绍 1.1 深度强化学习的崛起 近年来,深度强化学习(Deep Reinforcement Learning, DRL)在许多领域取得了显著的成功,如游戏、机器人控制、自动驾驶等。DRL结合了深度学习和强化学习的优势,使得计算机能够在复杂的环境中进行自主学习和决策。

AI天才研究院 357

五十二.PPO算法原理和实战

的,这要求从初始状态或从时刻。

weixin_36128607的博客 2050

【AI应用架构师必备】深度强化学习落地实战:从算法到生产系统全流程解析

为聚焦工程化流程,选择经典控制问题“倒立摆”作为案例:控制小车左右移动,使杆保持竖直平衡。业务抽象:可类比为机器人关节控制、无人机姿态调整等连续动作场景。

AI架构全栈开发实战笔记 1009

基于ElegantRL的PPO算法实战教程:从倒立摆到月球着陆器

在深度强化学习(Deep Reinforcement Learning, DRL)领域,Proximal Policy Optimization(PPO,近端策略优化)算法因其出色的稳定性、高效的采样利用率和相对简单的实现而广受欢迎。相比于传统的策略梯度方法,PPO通过引入裁剪机制和重要性采样,有效避免了训练过程中的策略崩溃问题。 ElegantRL作为一个轻量级、高效且稳定的深度强化学习框架,

gitblog_01091的博客 516

Matlab中用深度强化学习实时调参PID,实现一级倒立摆起摆+稳态控制(附传统PID对比)

这套资源包提供一套开箱即用的Matlab实现方案,专注解决一级倒立摆的起摆与直立平衡控制问题。核心是把深度强化学习(DRL)嵌入到经典PID控制框架中,让Kp、Ki、Kd三个参数在运行过程中动态调整,而不是固定不变。整个系统基于Matlab原生强化学习工具箱开发,包含倒立摆动力学建模、DQN或PPO智能体搭建、面向控制目标设计的奖励函数、训练脚本及收敛判断逻辑。运行后可一键生成DRL-PID联合控制下的角度响应、角速度变化、小车位置轨迹等曲线;同时内置同条件下的传统固定参数PID模块,自动输出两者在相同初始

k5l6m的博客 189

深度强化学习交易策略实战:从MDP建模到PPO训练避坑指南

强化学习在量化交易中的应用,本质是将投资决策转化为马尔可夫决策过程,通过环境交互学习最优交易策略。与人工规则策略相比,深度强化学习能自适应市场变化,统一处理特征筛选、信号生成与仓位控制。然而,算法选型、奖励设计、数据切分与特征归一化中的任何疏漏,都可能导致回测失真或实盘失效。从状态空间构建到PPO算法调参,从滚动标准化到换手惩罚,每一步都决定策略的真实盈利能力。本文以实际工程视角,梳理交易环境搭建、奖励函数设计、数据防泄漏处理及常见翻车点,帮助量化开发者理解深度强化学习交易系统的完整链路,并避开高频交易、过

weixin_29039773的博客 213

Proximal Policy Optimization(PPO)算法实现gym连续动作空间任务Pendulum-v0(pytorch)

目录 1.ppo算法概述 2.Pendulum-v0 3.代码实现 1.ppo算法概述 PG算法 视频参考李宏毅强化学习课程:李宏毅深度强化学习(国语)课程(2018)_哔哩哔哩_bilibili 上图表示actor与环境交互的一次经过,从开始的状态s1,actor输出a1到环境状态变为s2...直到st环境判断一次游戏结束。我们收集到了一次的游戏轨迹称为一个episode。 那么我们可以计算完成这...

qq_45590357的博客 1万+

强化学习_倒立摆_Matlab程序

MATLAB实现的强化学习程序,用于一级倒立摆控制。 程序调试正常运行,请放心下载。

告别“左右横跳”:深度强化学习PPO算法为何是训练AI的黄金准则?

PPO算法之所以如此出色,是因为它在性能与工程实现之间找到了一个完美的平衡点。它不像TRPO(置信域策略优化)那样需要复杂的二阶导数计算,通过简单的Clip操作实现了类似的稳定性。在稳定的前提下追求卓越。在实际实践中,如果只是停留在“了解大模型原理”,其实很难真正模拟模型能力的差异。我个人比较推荐直接上手做一次模型,比如用这种低功耗大模型校准平台,把自己的数据真正“喂”进模型里,生产出属于自己的独特模型。即使没有代码基础,也能轻松跑模型完成流程,在实践中理解怎么让模型“原来你想要的样子”。

kanna1209的博客 665

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2200

深度强化学习实战指南:从PPO、DQN到机器人控制

强化学习作为机器学习的重要分支,其核心在于智能体通过与环境的交互试错来学习最优策略。当面对高维状态空间时,深度强化学习通过神经网络强大的函数逼近能力,有效解决了传统方法的维度灾难问题。这一技术为智能决策系统提供了强大的框架,在机器人控制、游戏AI、自动驾驶等领域展现出巨大价值。本文聚焦于深度强化学习的工程实践,详细解析了PPO、DQN等核心算法,并提供了从环境配置、代码实现到调优部署的完整解决方案,旨在帮助开发者快速构建可用的智能体模型。

345

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 916

控制优化思想赋能深度强化学习:PPO算法在CartPole与Acrobot环境中的高效实践

深度强化学习(DRL)通过智能体与环境的交互试错来学习最优策略,但其样本效率低、训练不稳定的问题在复杂控制任务中尤为突出。其核心原理在于利用价值函数或策略梯度来指导策略更新,技术价值在于能够解决高维状态空间中的序列决策问题。然而,在如机器人控制等应用场景中,纯粹的试错学习往往收敛缓慢。为此,引入控制理论的优化思想成为关键,例如通过奖励塑形(Reward Shaping)将先验知识(如系统平衡点)编码为密集的学习信号,或利用近似动力学模型进行规划引导。这些方法能显著提升探索效率与策略质量,自然收敛到本文主题—

weixin_33692284的博客 671

SAP 货币类型和公司代码的货币设置

货币类型分为公司代码和集团货币,一般FI 10类型和集团货币 30,事务代码是8KEM; 设置货币类型的事务代码是OB22 在S/4 1809版本里编辑功能统合到事务代码FINSC_LEDGER 中了,这里集中了分类账和公司代码的设置; 设置多账簿的币种(会出现在BSEG和FAGLFLEXA表中) 汇率维护在TCURR表中,可通过BAPI_EXCHANGERATE_GETDETAIL函数获取。 CO货币的事务代码是成本控制范围货币:OKKP ,一般设置为货币码20和30; 另外, SCC4设置集团货币,

RichardYang2020的博客 1万+

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

使用ppo算法解决两足机器人的步行问题,该从什么开始学呢?

通过以上步骤,从基础理论到实践案例,逐步掌握使用PPO算法解决两足机器人步行问题的关键技术和实现方法。结合仿真平台和现有工具,进行实践操作,进一步深化理解和应用能力。2024年零基础AI学习路线部分新增内容。

Java_rich的博客 1523

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1805

深度强化学习在经典控制问题中的应用:Acrobot与Cartpole优化实践

深度强化学习(DRL)作为一种数据驱动的智能决策方法,通过智能体与环境的交互试错来学习最优策略。其核心原理在于利用神经网络逼近值函数或策略函数,以解决传统控制方法中模型依赖性强、鲁棒性不足的问题。在工程实践中,DRL通过奖励函数设计、状态归一化等技巧,将控制目标转化为可学习的优化问题,显著提升了在模型不确定或环境复杂场景下的适应性。特别是在连续控制任务中,近端策略优化(PPO)等算法因其稳定性和样本效率成为首选。本文以Acrobot和Cartpole这两个经典控制问题为切入点,详细探讨了如何通过奖励函数工程

weixin_30938149的博客 590

32位快速加法器设计

32位快速加法器设计

好好学习,天天向上 3290

各向同性、VTI、TTI以及双相介质波场数值模拟

各位读者,大家好!在今天的文章中,我将介绍关于波场数值模拟中的各向同性、VTI(垂直横向等参数介质)、TTI(倾斜横向等参数介质)以及双相介质的基本概念。同时,我也会提供一些基础的Fortran代码片段,供大家了解和学习。

qq_38334677的博客 1710
上一篇: 深度强化学习算法总结(二)
下一篇: SAC(Soft Actor-Critic)算法实现控制摆锤
自律小浮
博客等级 码龄5年 500粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值