超级玛丽:强化学习

2021-02-25 17:16:50 浏览数 (1)

视频地址

  • 测试通关视频: https://live.csdn.net/v/121855

深度强化学习

  • 深度神经网络提供了丰富的表示形式,可以使强化学习(RL)算法有效执行。

Actor Critic简述

  • 强化学习的分类可以分为以值函数为中心的和以策略为中心的算法
  • Actor Critic (演员评判家)是一种值函数为中心和以策略为中心算法的结合体,它合并了以值函数为基础 (比如 Q learning) 和 以动作概率为基础 (比如 Policy Gradients) 的两类强化学习算法。
  • 评估实现方式有很多种
  • A3C算法为了提升训练速度采用异步训练的思想,利用多个线程。每个线程相当于一个智能体在随机探索,多个智能体共同探索,并行计算策略梯度,对参数进行更新。或者说同时启动多个训练环境,同时进行采样,并直接使用采集的样本进行训练,这里的异步得到数据,相比DQN算法,A3C算法不需要使用经验池来存储历史样本并随机抽取训练来打乱数据相关性,节约了存储空间,并且采用异步训练,大大加倍了数据的采样速度,也因此提升了训练速度。与此同时,采用多个不同训练环境采集样本,样本的分布更加均匀,更有利于神经网络的训练。

超级玛丽

  • 本文是依据论文《Asynchronous Advantage Actor-Critic (A3C) for playing Super Mario Bros》复现。运用gym来搭建游戏环境,用pytorch 深度学习框架来实现。
  • 代理分为两个部分:演员和评论家。假设有一个顽皮的小孩子(演员)正在发现他周围的神奇世界,而他的父亲(评论家)则在监督他,以确保他不会做任何危险的事情。每当孩子做任何一件好事时,他的父亲都会称赞并鼓励他将来再做一次。当然,当孩子做任何有害的事情时,他会得到父亲的警告。孩子与世界互动越多,采取不同的行动,他从父亲那里得到的积极和消极反馈就越多。孩子的目标是,从父亲那里收集尽可能多的积极反馈,而父亲的目标是更好地评估儿子的行为。换句话说,我们的孩子和他的父亲之间,或者在演员和评论家之间,有着双赢的关系。

依赖环境

  • python 3.6
  • gym
  • cv2
  • pytorch
  • numpy

训练好的模型地址

  • Super Mario Bros A3C trained models

运行代码

    • 训练模型python train.py
    • 验证模型python test.py

核心模型

代码语言:javascript复制
import torch.nn as nn
import torch.nn.functional as F


class ActorCritic(nn.Module):
    def __init__(self, num_inputs, num_actions):
        super(ActorCritic, self).__init__()
        self.conv1 = nn.Conv2d(num_inputs, 32, 3, stride=2, padding=1)
        self.conv2 = nn.Conv2d(32, 32, 3, stride=2, padding=1)
        self.conv3 = nn.Conv2d(32, 32, 3, stride=2, padding=1)
        self.conv4 = nn.Conv2d(32, 32, 3, stride=2, padding=1)
        self.lstm = nn.LSTMCell(32 * 6 * 6, 512)
        self.critic_linear = nn.Linear(512, 1)
        self.actor_linear = nn.Linear(512, num_actions)
        self._initialize_weights()

    def _initialize_weights(self):
        for module in self.modules():
            if isinstance(module, nn.Conv2d) or isinstance(module, nn.Linear):
                nn.init.xavier_uniform_(module.weight)
                # nn.init.kaiming_uniform_(module.weight)
                nn.init.constant_(module.bias, 0)
            elif isinstance(module, nn.LSTMCell):
                nn.init.constant_(module.bias_ih, 0)
                nn.init.constant_(module.bias_hh, 0)

    def forward(self, x, hx, cx):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        hx, cx = self.lstm(x.view(x.size(0), -1), (hx, cx))
        return self.actor_linear(hx), self.critic_linear(hx), hx, cx

0 人点赞