上一篇讲了什么是 DQN,今天来看看如何用代码实现:
算法来自:Volodymyr Mnih,Playing Atari with Deep Reinforcement Learning
根据下面这个图看代码会更容易理解:
图片来自:Resource Management with Deep Reinforcement Learning
1. 首先我们需要建立一个 DQN agent:
import gym
from collections import deque
class DQNAgent():
def __init__(self, env_id, path, episodes, max_env_steps, win_threshold, epsilon_decay,
state_size=None, action_size=None, epsilon=1.0, epsilon_min=0.01,
gamma=1, alpha=.01, alpha_decay=.01, batch_size=16, prints=False):
self.memory = deque(maxlen=100000)
self.env = gym.make(env_id)
if state_size is None:
self.state_size = self.env.observation_space.n
else:
self.state_size = state_size
if action_size is None:
self.action_size = self.env.action_space.n
else:
self.action_size = action_size
self.episodes = episodes
self.env._max_episode_steps = max_env_steps
self.win_threshold = win_threshold
self.epsilon = epsilon
self.epsilon_decay = epsilon_decay
self.epsilon_min = epsilon_min
self.gamma = gamma
self.alpha = alpha
self.alpha_decay = alpha_decay
self.batch_size = batch_size
self.path = path #location where the model is saved to
self.prints = prints #if true, the agent will print his scores
self.model = self._build_model()
模型的输入是 states,维度可以由 env.observation_space.n
获得。
模型的输出是每个 state 的所有 action 的 Q-value,维度由 env.action_space.n
获得。
模型可以用 Keras 的 sequence 建立,可以是 FFW,也可以是 CNN,根据环境任务的类型决定。
episodes:是指每一次玩游戏,就是从游戏开始到游戏结束算一次episode,这个结束可能是因为失败,也可能是因为达到了设定的结束的标准。
epsilon,epsilon_decay,epsilon_min:这三个是用来进行 exploration-exploitation trade off 的,其中 epsilon_decay 越大的话,agent 就会更多地 explore 环境,相仿就会更多地 exploit 已有的信息。
gamma 代表着我们有多么看重长期收益,它越大说明agent会更重视未来的收益,它越小说明agent会更重视短期的利益,一般我们都是希望长期结果是高收益的,可以放弃一些短期利益。
网友评论