前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用强化学习通关超级马里奥!

用强化学习通关超级马里奥!

作者头像
Datawhale
发布于 2022-05-29 02:40:04
发布于 2022-05-29 02:40:04
83300
代码可运行
举报
文章被收录于专栏:Datawhale专栏Datawhale专栏
运行总次数:0
代码可运行

作者:肖遥,华中农业大学,Datawhale优秀学习者

DQN算法实践之速通超级马里奥

作为强化学习(Reinforce Learning,RL)的初学者,常常想将RL的理论应用于实际环境,以超级马里奥为例,当看着自己训练的AI逐渐适应环境,得分越来越高,到最后能完美躲避所有障碍,快速通关时,你肯定能体会到算法的魅力,成就感十足!本文不拘泥于DQN(Deep Q Learning Network)算法的深层原理,主要从代码实现的角度,为大家简洁直白的介绍DQN以及其改进方法,接着,基于Pytorch官方强化学习教程,应用改进后的DQN算法训练超级马里奥,并得到更为优秀的结果。

本文主要内容:

主要参考与项目地址: 算法理论参考:https://datawhalechina.github.io/easy-rl 算法代码参考:https://github.com/datawhalechina/easy-rl/tree/master/codes 书籍:Datawhale强化学习教程 Pytorch官方强化学习示例: https://pytorch.org/tutorials/intermediate/mario_rl_tutorial.html https://github.com/yfeng997/MadMario 本文项目地址:https://github.com/likemango/DQN-mario-xiaoyao

一、Basic DQN

DQN用一个神经网络替换Q-Learning中的最优动作价值函数Q*表格,弥补了Q-Learning只能表示有限个状态的缺陷。训练DQN网络模型常见的代码流程如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train(cfg, env, agent):
    ''' 训练
    '''
    print('开始训练!')
    print(f'环境:{cfg.env_name}, 算法:{cfg.algo_name}, 设备:{cfg.device}')
    rewards = []  # 记录所有回合的奖励
    ma_rewards = []  # 记录所有回合的滑动平均奖励
    for i_ep in range(cfg.train_eps):
        ep_reward = 0  # 记录一回合内的奖励
        state = env.reset()  # 重置环境,返回初始状态
        while True:
            action = agent.choose_action(state)  # 选择动作
            next_state, reward, done, _ = env.step(action)  # 更新环境,返回transition
            agent.memory.push(state, action, reward,
                              next_state, done)  # 保存transition
            state = next_state  # 更新下一个状态
            agent.update()  # 更新智能体
            ep_reward += reward  # 累加奖励
            if done:
                break
        rewards.append(ep_reward)
        if ma_rewards:
            ma_rewards.append(0.9 * ma_rewards[-1] + 0.1 * ep_reward)
        else:
            ma_rewards.append(ep_reward)
        if (i_ep + 1) % 10 == 0:
            print('回合:{}/{}, 奖励:{}'.format(i_ep + 1, cfg.train_eps, ep_reward))
    print('完成训练!')
    env.close()
    return rewards, ma_rewards

其中cfg表示训练过程中的参数,env表示训练的交互环境,agent表示一个DQN的类对象。DQN类中的核心内容有:经验缓存(memory)、动作选择(choose_action)和模型参数更新(update)这三个部分:memory用于存储训练过程中的经验五元组(state,action,reward,next_state,done);choose_action方法实现了输入状态state,输出相应的动作结果,一般采用ε-greedy方法,探索概率为ε,网络选择动作概率为1-ε,这是DQN训练中重要的超参数之一;在update方法中,采样memory中的五元组信息,使用TD(temporary difference)算法进行计算出TD target和TD Error,再通过做反向梯度计算,最后做模型参数更新(https://datawhalechina.github.io/easy-rl/#/chapter3/chapter3?id=temporal-difference)。

Basic DQN能够解决一些简单的离散动作问题,例如gym环境中的“CartPole”,然而对于稍微复杂的环境却难以得到好的效果。DQN方法的缺点是存在非均匀的高估问题(OverEstimate),在多轮学习更新中,会造成最优动作价值函数Q*偏离真实值,使得网络无法输出正确的结果(https://datawhalechina.github.io/easy-rl/#/chapter7/chapter7)。

高估发生在两个地方: 1.Update中计算TD target时取最大化操作。 2.Update中的自举(bootstraping)操作。

一些常见的改进办法是对Update方法以及网络模型进行优化,尽可能的减小高估问题,下面介绍一些易于实现且高效的改进方法。

二、Nature DQN

所谓自举,即利用网络模型自己去更新自己,既然自举会造成高估问题,那么可以不用网络本身去更新自己——一个直接的想法是使用另一个新的网络去更新DQN网络。新网络的模型结构与DQN本身一样,在计算TD target时使用该网络的计算结果,因而也称该网络为目标网络(target network)。结合上面介绍的Basic DQN,NatureDQN的实现如下(policy_net为DQN网络,target_net为目标网络):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DQN:
    def __init__(self, state_dim, action_dim, cfg):
        self.action_dim = action_dim  # 总的动作个数
        self.device = cfg.device  # 设备,cpu或gpu等
        self.gamma = cfg.gamma  # 奖励的折扣因子
        # e-greedy策略相关参数
        self.frame_idx = 0  # 用于epsilon的衰减计数
        self.epsilon = lambda frame_idx: cfg.epsilon_end + (cfg.epsilon_start - cfg.epsilon_end) * \
            math.exp(-1. * frame_idx / cfg.epsilon_decay)
        self.batch_size = cfg.batch_size
        self.policy_net = MLP(state_dim, action_dim,hidden_dim=cfg.hidden_dim).to(self.device)
        self.target_net = MLP(state_dim, action_dim,hidden_dim=cfg.hidden_dim).to(self.device)
        # 复制参数到目标网路targe_net
        for target_param, param in zip(self.target_net.parameters(),self.policy_net.parameters()): 
            target_param.data.copy_(param.data)
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=cfg.lr) # 优化器
        self.memory = ReplayBuffer(cfg.memory_capacity) # 经验回放

    def choose_action(self, state):
        ''' 选择动作
        '''
        self.frame_idx += 1
        if random.random() > self.epsilon(self.frame_idx):
            with torch.no_grad():
                state = torch.tensor([state], device=self.device, dtype=torch.float32)
                q_values = self.policy_net(state)
                action = q_values.max(1)[1].item() # 选择Q值最大的动作
        else:
            action = random.randrange(self.action_dim)
        return action
    def update(self):
        if len(self.memory) < self.batch_size: # 当memory中不满足一个批量时,不更新策略
            return
        # 从经验回放中(replay memory)中随机采样一个批量的转移(transition)
        state_batch, action_batch, reward_batch, next_state_batch, done_batch = self.memory.sample(
            self.batch_size)
        # 转为张量
        state_batch = torch.tensor(state_batch, device=self.device, dtype=torch.float)
        action_batch = torch.tensor(action_batch, device=self.device).unsqueeze(1)  
        reward_batch = torch.tensor(reward_batch, device=self.device, dtype=torch.float)  
        next_state_batch = torch.tensor(next_state_batch, device=self.device, dtype=torch.float)
        done_batch = torch.tensor(np.float32(done_batch), device=self.device)
        # 计算当前状态(s,a)对应的Q(s, a)
        q_values = self.policy_net(state_batch).gather(dim=1, index=action_batch) 
        # 计算下一时刻的状态(s_t,a)对应的Q值
        next_q_values = self.target_net(next_state_batch).max(1)[0].detach() 
        # 计算期望的Q值,对于终止状态,此时done_batch[0]=1, 对应的expected_q_value等于reward
        expected_q_values = reward_batch + self.gamma * next_q_values * (1-done_batch)
        loss = nn.MSELoss()(q_values, expected_q_values.unsqueeze(1))  # 计算均方根损失
        # 优化更新模型
        self.optimizer.zero_grad()  
        loss.backward()
        for param in self.policy_net.parameters():  # clip防止梯度爆炸
            param.grad.data.clamp_(-1, 1)
        self.optimizer.step()

在一定更新回合后需要将DQN网络参数复制给目标网络,只需要在训练中增加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        if (i_ep + 1) % cfg.target_update == 0:  # 智能体目标网络更新
            agent.target_net.load_state_dict(agent.policy_net.state_dict())

三、Double DQN

在NatureDQN中,执行网络参数更新方法update时,用target_net计算next_q_values用到了取最大值操作,其目的是获得在状态next_state时,target_net取最大值的动作a*_target,并输出该最大值Q*_max_target值,这一步同样会造成高估问题。既然如此,不采用a*_target并减小Q*_max_target值,那么高估问题就能在一定程度得到缓解。

Double DQN的做法是利用policy_net在next_state时,policy_net取最大值的动作为a*_policy,然后再将该动作带入target_net中进行计算获得新的Q*_max_target^值。由于最优动作选自policy_net而不是target_net,所以容易得出target_net(next_state)[a*_target] >= target_net(next_state)[a*_policy],因此有Q*_max_target^ <=Q*_max_target,这样一定程度减小Q估计,缓解因自举高估带来的不稳定问题。在update方法中对expected_q_values的计算做如下修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        # 计算当前状态(s,a)对应的Q(s, a)
        q_values = self.policy_net(state_batch).gather(dim=1, index=action_batch) 
        # next_q_values = self.target_net(next_state_batch).max(1)[0].detach() 
        # 用policy_net计算下一个状态s_t的最优动作a*
        next_action_batch = torch.argmax(self.policy_net(state_batch),axis=1).unsueeze(1)
        # 用target_net计算下一时刻的状态(s_t_,a)对应的Q值
        next_q_values = self.target_net(next_state_batch).gather(dim=1,index=next_action_batch)
        # 计算期望的Q值,对于终止状态,此时done_batch[0]=1, 对应的expected_q_value等于reward
        expected_q_values = reward_batch + self.gamma * next_q_values * (1-done_batch)
        loss = nn.MSELoss()(q_values, expected_q_values.unsqueeze(1))  # 计算均方根损失
        # 优化更新模型
        self.optimizer.zero_grad()  
        loss.backward()
        for param in self.policy_net.parameters():  # clip防止梯度爆炸
            param.grad.data.clamp_(-1, 1)
        self.optimizer.step()

四、Dueling DQN

Dueling DQN与上述两种优化方式不同,它直接修改网络模型,用一个A*网络和V*网络去表示Q*,其中A*表示为最优优势函数(optimal advantage function),V*表示最优状态价值函数(optimal state value function ),它们三者的关系为A* = Q* - V*(https://datawhalechina.github.io/easy-rl/#/chapter7/chapter7?id=dueling-dqn)。 Dueling DQN与原始DQN网络结构的对比如下图所示:

同时为了降低采用不同动作时Q*值的方差,实际中常用Q* = V* + A* - mean(A*)来进一步优化网络,加速收敛。在代码角度上,常见的 Dueling网络模型实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DuelingNet(nn.Module):
    def __init__(self, state_dim, action_dim,hidden_size=128):
        super(DuelingNet, self).__init__()
        
        # 隐藏层
        self.hidden = nn.Sequential(
            nn.Linear(state_dim, hidden_size),
            nn.ReLU()
        )
        
        # 优势函数
        self.advantage = nn.Sequential(
            nn.Linear(hidden_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, action_dim)
        )
        
        # 价值函数
        self.value = nn.Sequential(
            nn.Linear(hidden_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, 1)
        )
        
    def forward(self, x):
        x = self.hidden(x)
        advantage = self.advantage(x)
        value     = self.value(x)
 # Q* = A* + V* - mean(A*) 
        return value + advantage  - advantage.mean()

五、官方代码及模型分析

  本文在DQN训练超级马里奥的项目中,参考了pytorch官方的强化学习教程,该教程代码耦合度低,逻辑结构清晰,非常值得初学者学习。核心代码及其功能如下图所示:

超级马里奥的训练环境来自

gym_super_mario_bros(https://github.com/flexpad/gym-super-mario-bros),代理(agent)与环境(env)交互返回的是游戏当前的RGB图像,因而在开始训练之前需要对图像做一系列的预处理操作,该教程的这部分工作做的十分完善,非常值得学习和借鉴。在完成预处理数据后,我们就集中精力在DQN的算法实现上。官方代码的具体分析可以在这篇文章中找到:https://zhuanlan.zhihu.com/p/402519441?utm_source=wechat_session&utm_medium=social&utm_oi=951210242982260736.

笔者应用该代码在实际训练中还发现一些问题:

  1. 首先是直接训练该模型对硬件设备要求高,很可能会出现显存不足的问题(报错:”CUDA out of memory”);
  2. 其次是训练结果模型效果不佳,根据官方提供的已训练完成的模型去测试(官方给出训练时间为GPU约20小时,CPU约80小时,但未说明具体设备),发现通关率仍然较低(笔者测试每回合累积奖励大约在1300~2000之间,小概率能够通关;笔者对模型修改后训练测试结果是稳定通关且每回合累积奖励3032);
  3. 最后是探索率设置不够合理,DQN模型训练完成后,在实际使用时应该将探索率ε设置为0,然而原作者依然给出了0.1的探索率,将该探索率设置为0后会出现每次agent都在同一地方失败(例如“卡墙角”)等现象,推测原作者之所以这样做,目的是防止agent总是在同样决策下走向相同的失败结局而有意增加了随机性,这有悖于DQN的算法原理。DQN算法的决策过程决定了它是一种确定性的策略,也就是说,对给定的输入状态,每次的输出结果都是相同的,如果在训练完成后,实际测试时还需要增加探索率去避免“卡墙角”或者“碰壁”等情况,那只能说明模型没有训练好,有待于对模型做进一步改进,最终训练好的结果一定是agent每次都会以相同的策略通关而不存在随机性;如果想得到每回合游戏有不一样的通关方式,那么就需要考虑采用其他算法,例如策略学习算法,每一次的动作做概率抽样。

六、模型改进

针对上述问题,笔者对官方模型做出如下修改:

  1. 修改经验缓存memory的大小。原则上来说,经验缓存越大,那么能够存储更加久远的对局信息,是有助于模型学习与改进的,然而受限于硬件显存空间的问题,可以考虑降低经验缓存的大小;而且基于直觉判断,超级马里奥第一关的环境也并没有太过复杂,因而适当降低缓存大小,在较为低配的硬件设备上依然可以得到不错的训练效果。(笔者机器配置为i7-9750H和GTX1660Ti,显存6G,笔者在本机和Colab上均做过尝试,将memory从100000调整为18000可以完成训练。如果不更改配置至少需要20G显存,读者可更具机器硬件情况进行调整)。
  2. 模型改进。将官方给出D2QN(Nature DQN + Double DQN)改为D3QN(Nature DQN + Double DQN + Dueling DQN).DQN算法本身不可避免的存在高估等问题,使用这些DQN变体能够大幅提高DQN算法的准确性和稳定性(https://zhuanlan.zhihu.com/p/98784255?utm_source=wechat_session&utm_medium=social&utm_oi=951210242982260736)。在官方代码基础上,使用Dueling network对原文件中”neural.py”的网络模型进行修改。
  3. 调整超参数。将探索率ε的最小值设置为0,设置更大的BatchSize并减小的学习率,DQN调参可以参考(https://zhuanlan.zhihu.com/p/345353294)

七、训练结果

笔者使用笔记本训练,总时间为24+13+10=47小时,根据不同的硬件环境,训练时间可能会有较大变化。0~24小时、24~37小时、37~47小时三个阶段每百回合平均奖励的变化如图所示:

训练第一阶段的每百回合平均奖励

训练第二阶段的每百回合平均奖励

训练的第三阶段的每百回合平均奖励

从图中可以看出,在局部区域奖励波动较大,一般属于正常情况,总体上看,平均奖励是随着训练的进行而上升的,说明模型的表现已经越来越好。在训练之余,还可以通过replay.py对已经训练出来的模型进行测试,以验证模型学习的进步(最后一个阶段的奖励虽然在升高,但是还没有达到测试时的3032,原因是此时依然有较低的概率在做随机探索。同时,强化学习的模型并不是训练的越久越好,选择训练阶段中奖励更高的模型往往会是一种更优的选择)。测试模型结果:

八、总结

DQN算法作为强化学习的入门算法之一,将强化学习的核心理论(马尔科夫决策过程、贝尔曼方程等)清晰的融入到算法的实现中,基于DQN算法中的问题,又催生出各式各样DQN算法变体,大幅提高了算法的有效性。在解决离散动作空间的问题上,D3QN(Dueling DDQN)通常都具有不错的表现。大家可以结合实际游戏环境或者参考项目源代码,训练出属于你自己的超级马里奥!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Datawhale 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到了Nature DQN(即Volodymyr Mnih发表的Nature论文)这里才算是基本完善。DQN主要改动的点有三个:
汀丶人工智能
2023/06/24
5310
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
MADQN:多代理合作强化学习
处理单一任务是强化学习的基础,它的目标是在不确定的环境中采取最佳行动,产生相对于任务的最大长期回报。但是在多代理强化学习中,因为存在多个代理,所以代理之间的关系可以是合作的,也可以是对抗,或者两者的混合。多代理的强化学习引入了更多的复杂性,每个代理的状态不仅包括对自身的观察,还包括对其他代理位置及其活动的观察。
deephub
2024/03/20
3720
MADQN:多代理合作强化学习
强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战
OpenAI Gym中其实集成了很多强化学习环境,足够大家学习了,但是在做强化学习的应用中免不了要自己创建环境,比如在本项目中其实不太好找到Qlearning能学出来的环境,Qlearning实在是太弱了,需要足够简单的环境才行,因此本项目写了一个环境,大家感兴趣的话可以看一下,一般环境接口最关键的部分即使reset和step。
汀丶人工智能
2023/06/27
2670
强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战
【RL】基于迁移学习的强化学习(RL-TL)算法
基于迁移学习的强化学习(Reinforcement Learning with Transfer Learning,简称 RL-TL)是将迁移学习(Transfer Learning)的概念应用于强化学习(Reinforcement Learning,简称 RL)中的一种方法。其核心思想是在强化学习的环境中,利用已有的经验或在其他任务中学到的知识来提升学习效率和表现。这样可以减少从零开始学习的时间和样本需求,尤其在数据稀缺或任务复杂的场景中。
不去幼儿园
2024/12/03
1810
【RL】基于迁移学习的强化学习(RL-TL)算法
强化学习算法总结(一)——从零到DQN变体
中对应价值最大的动作的Q值进行更新,注意这里只是更新,并不会真的执行这个价值最大的动作。这里的更新策略(评估策略)与我们的行为策略(
CristianoC
2021/04/16
2.7K0
强化学习算法总结(一)——从零到DQN变体
智能限速算法:基于强化学习的动态请求间隔控制
在爬取抖音(https://www.douyin.com)精选视频标题与评论的过程中,频繁的固定速率请求往往导致 IP 被封禁或返回 429 限速错误,为此我们引入了基于强化学习的动态请求间隔控制算法,通过智能地调整请求间隔来在最大化吞吐量与避免封禁之间找到平衡。本文将以「技术故事型」的叙事方式呈现真实经历→问题线索追踪→技术突破→反思成长,并给出完整的 Python 实现代码示例,代码中使用了爬虫代理设置,以及基于 DQN 的强化学习智能限速模块。
jackcode
2025/05/08
950
智能限速算法:基于强化学习的动态请求间隔控制
【强化学习】Soft Actor-Critic (SAC) 算法
Soft Actor-Critic(SAC) 是一种最先进的强化学习算法,属于 Actor-Critic 方法的变体。它特别适合处理 连续动作空间,并通过引入最大熵(Maximum Entropy)强化学习的思想,解决了许多传统算法中的稳定性和探索问题。
不去幼儿园
2025/01/08
1.4K0
【强化学习】Soft Actor-Critic (SAC) 算法
DDPG强化学习的PyTorch代码实现和逐步讲解
来源:Deephub Imba本文约4300字,建议阅读10分钟本文将使用pytorch对其进行完整的实现和讲解。 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network启发的无模型、非策略深度强化算法,是基于使用策略梯度的Actor-Critic,本文将使用pytorch对其进行完整的实现和讲解。 DDPG的关键组成部分是 Replay Buffer Actor-Critic neural network Explorati
数据派THU
2023/04/05
8790
DDPG强化学习的PyTorch代码实现和逐步讲解
PyTorch专栏(二十三): 强化学习(DQN)教程
本教程介绍如何使用PyTorch从OpenAI Gym(https://gym.openai.com/)中的 CartPole-v0 任务上训练一个Deep Q Learning (DQN) 代理。
磐创AI
2019/12/10
2.8K0
PyTorch专栏(二十三): 强化学习(DQN)教程
【DRL】深度强化学习介绍
随着深度学习的迅猛发展,深度强化学习(Deep Reinforcement Learning, DRL)将深度学习与强化学习相结合,使得处理高维状态空间成为可能。
不去幼儿园
2024/12/03
2040
【DRL】深度强化学习介绍
【强化学习】Double DQN(Double Deep Q-Network)算法
强化学习中的深度Q网络(DQN)是一种将深度学习与Q学习结合的算法,它通过神经网络逼近Q函数以解决复杂的高维状态问题。然而,DQN存在过估计问题(Overestimation Bias),即在更新Q值时,由于同时使用同一个网络选择动作和计算目标Q值,可能导致Q值的估计偏高。
不去幼儿园
2025/01/08
1.9K0
【强化学习】Double DQN(Double Deep Q-Network)算法
Hands on Reinforcement Learning 08 Deep Q Network Advanced
DQN 算法敲开了深度强化学习的大门,但是作为先驱性的工作,其本身存在着一些问题以及一些可以改进的地方。于是,在 DQN 之后,学术界涌现出了非常多的改进算法。本章将介绍其中两个非常著名的算法:Double DQN 和 Dueling DQN,这两个算法的实现非常简单,只需要在 DQN 的基础上稍加修改,它们能在一定程度上改善 DQN 的效果。如果读者想要了解更多、更详细的 DQN 改进方法,可以阅读 Rainbow 模型的论文及其引用文献。
一只野生彩色铅笔
2023/04/08
6980
Hands on Reinforcement Learning 08 Deep Q Network Advanced
【RL Latest Tech】离线强化学习:保守Q学习 (CQL) 算法
Conservative Q-Learning (CQL) 是由Sergey Levine及其团队于2020年提出的一种针对离线强化学习的算法。CQL旨在解决离线强化学习中的两个主要问题:分布偏移(Distributional Shift) 和 过度乐观的值函数估计(Overestimation of Q-Values)。CQL通过对Q值的保守约束,确保学习到的策略更为稳健,避免过度依赖于离线数据中的稀有样本或未充分探索的区域。
不去幼儿园
2024/12/03
6780
【RL Latest Tech】离线强化学习:保守Q学习 (CQL) 算法
深度强化学习 | DQN训练超级玛丽闯关
本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
NewBeeNLP
2021/03/03
1.5K0
深度强化学习 | DQN训练超级玛丽闯关
【深度强化学习】DQN训练超级玛丽闯关
上一期 MyEncyclopedia公众号文章 通过代码学Sutton强化学习:从Q-Learning 演化到 DQN,我们从原理上讲解了DQN算法,这一期,让我们通过代码来实现DQN 在任天堂经典的超级玛丽游戏中的自动通关吧。本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
黄博的机器学习圈子
2020/12/11
1.4K0
【深度强化学习】DQN训练超级玛丽闯关
【RL Latest Tech】分层强化学习:Option-Critic架构算法
分层强化学习(Hierarchical Reinforcement Learning, HRL)通过将复杂问题分解为更小的子问题,显著提高了强化学习算法在解决高维状态空间和长期目标任务中的效率。Option-Critic架构是分层强化学习中一种非常有影响力的方法,专门用于自动发现和优化子策略(称为“Option”)。它是在经典的Options框架基础上提出的,用来处理分层决策问题,特别是可以在没有明确的子目标定义的情况下自动学习子策略。
不去幼儿园
2024/12/03
2961
【RL Latest Tech】分层强化学习:Option-Critic架构算法
探索Python中的强化学习:DQN
强化学习是一种机器学习方法,用于训练智能体(agent)在与环境的交互中学习如何做出最优决策。DQN(Deep Q-Network)是强化学习中的一种基于深度神经网络的方法,用于学习最优策略。本文将详细介绍DQN的原理、实现方式以及如何在Python中应用。
Echo_Wish
2024/04/02
6250
机器学习——强化学习与深度强化学习
近年来,强化学习(Reinforcement Learning, RL)在多个领域取得了巨大的进展。从早期简单的迷宫导航问题到今天 AlphaGo 击败围棋世界冠军,强化学习的潜力得到了充分展现。而随着深度学习的引入,深度强化学习(Deep Reinforcement Learning, DRL)更是将这一技术推向了前所未有的高度。本篇文章将深入探讨强化学习与深度强化学习的基本原理、常见算法以及应用场景,旨在为读者提供一个详尽的学习路线图。
hope kc
2024/10/09
2.2K0
深度学习(七)深度强化学习:融合创新的智能之路(7/10)
深度强化学习作为一种融合了深度学习和强化学习的新技术,在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力,能够处理复杂的任务和环境。例如,在游戏领域,深度强化学习模型如 AlphaGo 等在围棋领域战胜了世界冠军,展现出了超越人类的智能水平。在机器人控制方面,深度强化学习可以让机器人通过与环境的交互,学习到优化的控制策略,从而在复杂环境下执行任务和决策,为工业自动化和智能家居等领域带来了新的发展机遇。
正在走向自律
2024/12/18
3190
深度学习(七)深度强化学习:融合创新的智能之路(7/10)
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
Breakout是一款经典的雅达利游戏,也就是我们所熟知的“打砖块”。玩家需要左右移动在屏幕下方的短平板子将一颗不断弹跳的小球反弹回屏幕上方,使其将一块块矩形砖块组成的六行砖块墙面打碎,并防止小球从屏幕底部掉落。在Atari 2600版本的Breakout中,玩家共有5次小球掉落机会,一旦用完就标志游戏结束,每打掉一块砖块得1分,全部打掉则游戏胜利结束。
Ranlychan
2024/01/10
1.1K0
推荐阅读
相关推荐
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验