基于 Paddle2.0 的强化学习新玩法 —— 通关超级马里奥兄弟

Paddle2.0强化学习实战:用PPO算法玩转超级马里奥兄弟
本文介绍了如何利用Paddle2.0实现基于PPO算法的强化学习,以通关超级马里奥兄弟游戏。通过预处理图像、设置奖励函数和并行训练提升模型效率,最终展示训练效果和通关视频。

基于 Paddle2.0 的强化学习新玩法 —— 通关超级马里奥兄弟

前言

超级马里奥兄弟作为几代人的童年回忆,陪伴了我们的成长。如今随着深度强化学习的发展,越来越多的游戏已经被 AI 征服,那么今天我们展示如何用深度强化学习,试着通关超级马里奥兄弟吧!

马里奥游戏环境简介

在这里插入图片描述
马里奥游戏环境链接:

https://pypi.org/project/gym-super-mario-bros/

游戏环境允许玩家或 AI 在 3 次尝试内通过游戏的 32 关。环境提供了 RIGHT_ONLY,SIMPLE_MOVEMENT,COMPLEX_MOVEMENT 三种难度的操作模式。只需要对环境输入各种动作所代表的数值,就能实现对马里奥的各种操作。

PPO 算法简介

PPO 算法论文链接:

https://arxiv.org/abs/1707.06347

相信了解强化学习的各位一定听说过近端策略优化 PPO 算法吧。

PPO 算法是一种新型的 Policy Gradient 算法,由于 Policy Gradient 算法对步长十分敏感,若没有选择到合适的步长,在训练过程中新旧策略的变化可能会出现差异如果过大的现象,不利于模型的收敛。PPO 提出了新的目标函数可以在多个训练步骤中实现小幅度的更新,解决了 Policy Gradient 算法中步长难以确定的问题。

作为强化学习领域的 SOTA 算法,PPO 是每一个学习者最常用的算法。OpenAI 也早已把 PPO 作为自己的默认算法。

基于 Paddle2.0 实现 PPO

下面就让我们用 Paddle2.0 实现 PPO 算法吧。

不过在此之前,先让我们看看模型结构。我们的模型是 Actor-Critic 结构,但是对模型结构做了一点简化,Actor 和 Critic 只在输出层有所区别 。由于模型处理的是图像信息,故在全连接层前加入了卷积层。

class MARIO(Layer):
    def __init__(self, input_num, actions):
        super(MARIO, self).__init__()
        self.num_input = input_num
        self.channels = 32
        self.kernel = 3
        self.stride = 2
        self.padding = 1
        self.fc = 32 * 6 * 6
        self.conv0 = Conv2D(out_channels=self.channels, 
                                    kernel_size=self.kernel, 
                                    stride=self.stride, 
                                    padding=self.padding, 
                                    dilation=[1, 1], 
                                    groups=1, 
                                    in_channels=input_num)
        self.relu0 = ReLU()
        self.conv1 = Conv2D(out_channels=self.channels, 
                                    kernel_size=self.kernel, 
                                    stride=self.stride, 
                                    padding=self.padding, 
                                    dilation=[1, 1], 
                                    groups=1, 
                                    in_channels=self.channels)
        self.relu1 = ReLU()
        self.conv2 = Conv2D(out_channels=self.channels, 
                                    kernel_size=self.kernel, 
                                    stride=self.stride, 
                                    padding=self.padding, 
                                    dilation=[1, 1], 
                                    groups=1, 
                                    in_channels=self.channels)
        self.relu2 = ReLU()
        self.conv3 = Conv2D(out_channels=self.channels, 
                                    kernel_size=self.kernel, 
                                    stride=self.stride, 
                                    padding=self.padding, 
                                    dilation=[1, 1], 
                                    groups=
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值