nature-DQN
首先是主程序:
1、通过对游戏截图,得到当前状态,DQN思想是通过一定维数数据输入到神经网络中,输出当前状态下的动作(该神经网络的参数在分程序Agent中进行不断学习调整)
2、学习循环:用while接一个循环,得到一盘游戏中的所有state reward信息,并输入到网络的learn模块进行学习
3、跳出循环后,将贪婪概率epsion随着学习次数降低(前期贪婪有利于寻找到全局最优解)
4、给定运行次数后进行测试,记录其中获得的奖励(其中有while循环,同2一样,直到游戏结束,从实际env获得奖励)
分程序Agent解读:
1、def init:这部分生成了主网络和目标网络,设置经验池、优化器(Adam)、损失函数(MSE);
2、def action:主要分成两部分,if语句用于贪心概率做出动作;另一部分是通过网络输入状态输出动作;
3、def learn:前面三个if都是用来调整经验池的数据;第4个if用来将主网络的权重参数到目标网络中同步更新;最后一部分是随即取样,并用贝尔曼方程得到目标价值函数,并用梯度下降法对参数修正。
分程序net.py util.py见注释
import torch
import torch.nn as nn
from collections import deque
import numpy as np
import gym
import random
from net import AtariNet
from util import preprocess
import matplotlib.pyplot as plt # plt 用于显示图片
BATCH_SIZE = 32
LR = 0.001
START_EPSILON = 1.0 # 贪婪程度随时间变化,前期尽可能贪婪,后期弱化
FINAL_EPSILON = 0.1
EPSILON = START_EPSILON
EXPLORE = 1000000
GAMMA = 0.99 # 折扣比例
TOTAL_EPISODES = 10000000
MEMORY_SIZE = 1000000
MEMORY_THRESHOLD = 100000
UPDATE_TIME = 10000
TEST_FREQUENCY = 1
env = gym.make('Pong-v0')
env = env.unwrapped # 打开包装
ACTIONS_SIZE = env.action_space.n # action的个数
class Agent(object):
def __init__(self):
self.network, self.target_network = AtariNet(ACTIONS_SIZE), AtariNet(ACTIONS_SIZE)
# 设计了两个策略,主网络(Action-Value)和目标网络(Target Action-Value)
self.memory = deque() # 啥都没有
self.learning_count = 0
self.optimizer