首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现深度强化学习(DQN)?

如何实现深度强化学习(DQN)?

提问于 2018-10-09 21:35:29
回答 7关注 0查看 3.4K

DQN(Deep Q-Learning)可谓是深度强化学习(Deep Reinforcement Learning,DRL)的开山之作,是将深度学习与强化学习结合起来从而实现从感知(Perception)到动作( Action )的端对端(End-to-end)学习的一种全新的算法 ,该如何实现深度强化学习(DQN)呢?

回答 7

印度陆军医院

发布于 2018-10-10 04:43:45

DQN实现DEMO

找了很多DQN的例子,有原版的实现Atari的,也有Flappy Bird的,但是最简单的还是莫烦大神的Demo,github地址是:https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow。

其中,红色的方块代表寻宝人,黑色的方块代表陷阱,黄色的方块代表宝藏,我们的目标就是让寻宝人找到最终的宝藏。

这里,我们的状态可以用横纵坐标表示,而动作有上下左右四个动作。使用tkinter来做这样一个动画效果。宝藏的奖励是1,陷阱的奖励是-1,而其他时候的奖励都为0。

接下来,我们重点看一下我们DQN相关的代码。

定义相关输入

这了,我们用s代表当前状态,用a代表当前状态下采取的动作,r代表获得的奖励,s_代表转移后的状态。

代码语言:javascript
运行
AI代码解释
复制
self.s = tf.placeholder(tf.float32,[None,self.n_features],name='s')
self.s_ = tf.placeholder(tf.float32,[None,self.n_features],name='s_')
self.r = tf.placeholder(tf.float32,[None,],name='r')
self.a = tf.placeholder(tf.int32,[None,],name='a')

经验池

代码语言:javascript
运行
AI代码解释
复制
    def store_transition(self,s,a,r,s_):
        if not hasattr(self, 'memory_counter'):
            self.memory_counter = 0
        # hstack:Stack arrays in sequence horizontally
        transition = np.hstack((s,[a,r],s_))
        index = self.memory_counter % self.memory_size
        self.memory[index,:] = transition
        self.memory_counter += 1

双网络结构

target_net和eval_net的网络结构必须保持一致,这里我们使用的是两层全链接的神经网络,值得注意的一点是对于eval_net来说,网络的输入是当前的状态s,而对target_net网络来说,网络的输入是下一个状态s_,因为target_net的输出要根据贝尔曼公式计算q-target值,即

代码如下:

代码语言:javascript
运行
AI代码解释
复制
w_initializer, b_initializer = tf.random_normal_initializer(0., 0.3), tf.constant_initializer(0.1)

# ------------------ build evaluate_net ------------------
with tf.variable_scope('eval_net'):
    e1 = tf.layers.dense(self.s,20,tf.nn.relu,kernel_initializer=w_initializer,
                         bias_initializer=b_initializer,name='e1'
                         )

    self.q_eval = tf.layers.dense(e1,self.n_actions,kernel_initializer=w_initializer,
                                  bias_initializer=b_initializer,name='q')

# ------------------ build target_net ------------------

with tf.variable_scope('target_net'):
    t1 = tf.layers.dense(self.s_, 20, tf.nn.relu, kernel_initializer=w_initializer,
                         bias_initializer=b_initializer, name='t1')
    self.q_next = tf.layers.dense(t1, self.n_actions, kernel_initializer=w_initializer,
                                  bias_initializer=b_initializer, name='t2')

每隔一定的步数,我们就要将target_net中的参数复制到eval_net中:

代码语言:javascript
运行
AI代码解释
复制
t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,scope='target_net')
e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,scope='eval_net')

with tf.variable_scope('soft_replacement'):
      self.target_replace_op = [tf.assign(t,e) for t,e in zip(t_params,e_params)]

计算损失并优化

首先,对于eval_net来说,我们只要得到当前的网络输出即可,但是我们定义的网络输出是四个动作对应的q-eval值,我们要根据实际的a来选择对应的q-eval值,这一部分的代码如下:

代码语言:javascript
运行
AI代码解释
复制
with tf.variable_scope('q_eval'):
    # tf.stack
    #a = tf.constant([1,2,3])
    # b = tf.constant([4,5,6])
    # c = tf.stack([a,b],axis=1)
    # [[1 4]
    #  [2 5]
    # [3 6]]
    a_indices = tf.stack([tf.range(tf.shape(self.a)[0], dtype=tf.int32), self.a], axis=1)
    # 用indices从张量params得到新张量
    # indices = [[0, 0], [1, 1]]
    # params = [['a', 'b'], ['c', 'd']]
    # output = ['a', 'd']
    # 这里self.q_eval是batch * action_number,a_indices是batch * 1,也就是说选择当前估计每个动作的Q值
    self.q_eval_wrt_a = tf.gather_nd(params=self.q_eval, indices=a_indices)

中间有几个函数不太了解的,上面都有详细的注释,如果还不是很理解的话,大家可以百度或者阅读相应函数的源码。

对于target_net网络来说,我们要根据下面的式子来计算q-target值:

第一部分的R我们是已经得到了的,剩下的就是根据贪心策略选择四个输出中最大的一个即可:

代码语言:javascript
运行
AI代码解释
复制
with tf.variable_scope('q_target'):
    q_target = self.r + self.gamma * tf.reduce_max(self.q_next,axis=1,name='Qmax_s_')
    # 一个节点被 stop之后,这个节点上的梯度,就无法再向前BP了
    self.q_target = tf.stop_gradient(q_target)

接下来,我们就可以定义我们的损失函数并选择优化器进行优化:

代码语言:javascript
运行
AI代码解释
复制
with tf.variable_scope('loss'):
    self.loss = tf.reduce_mean(tf.squared_difference(self.q_target,self.q_eval_wrt_a,name='TD_error'))

with tf.variable_scope('train'):
    self._train_op = tf.train.RMSPropOptimizer(self.lr).minimize(self.loss)

网络的训练

每隔一定的步数,我们就要将eval_net中的参数复制到target_net中,同时我们要从经验池中选择batch大小的数据输入到网络中进行训练。

代码语言:javascript
运行
AI代码解释
复制
def learn(self):
    if self.learn_step_counter % self.replace_target_iter == 0:
        self.sess.run(self.target_replace_op)
        print('\ntarget_params_replaced\n')

    if self.memory_counter > self.memory_size:
        sample_index = np.random.choice(self.memory_size,size=self.batch_size)
    else:
        sample_index = np.random.choice(self.memory_counter,size = self.batch_size)

    batch_memory = self.memory[sample_index,:]

    _,cost = self.sess.run(
        [self._train_op,self.loss],
        feed_dict={
            self.s:batch_memory[:,:self.n_features],
            self.a:batch_memory[:,self.n_features],
            self.r:batch_memory[:,self.n_features+1],
            self.s_:batch_memory[:,-self.n_features:]
        }
    )

也许

发布于 2018-10-10 05:45:40

定义超参数 我们首先定义网络中的超参数,比如经验池的大小,两个网络的学习率等等:

代码语言:javascript
运行
AI代码解释
复制
MAX_EPISODES = 200
MAX_EP_STEPS = 200
LR_A = 0.001    # learning rate for actor
LR_C = 0.002    # learning rate for critic
GAMMA = 0.9     # reward discount
TAU = 0.01      # soft replacement
MEMORY_CAPACITY = 10000
BATCH_SIZE = 32

RENDER = False
ENV_NAME = 'Pendulum-v0'

定义网络输入 我们需要定义的placeholder包括当前的状态S,下一时刻的状态S',以及对应的奖励R,而动作A由Actor得到,因此不需要再定义:

代码语言:javascript
运行
AI代码解释
复制
self.S = tf.placeholder(tf.float32, [None, s_dim], 's')
self.S_ = tf.placeholder(tf.float32, [None, s_dim], 's_')
self.R = tf.placeholder(tf.float32, [None, 1], 'r')

构建两个网络 两个网络都是两层全链接的神经网络,Actor输出一个具体的动作,而Critic网络输出一个具体的Q值

代码语言:javascript
运行
AI代码解释
复制
def _build_a(self, s, scope, trainable):
    with tf.variable_scope(scope):
        net = tf.layers.dense(s, 30, activation=tf.nn.relu, name='l1', trainable=trainable)
        a = tf.layers.dense(net, self.a_dim, activation=tf.nn.tanh, name='a', trainable=trainable)
        return tf.multiply(a, self.a_bound, name='scaled_a')

def _build_c(self, s, a, scope, trainable):
    with tf.variable_scope(scope):
        n_l1 = 30
        w1_s = tf.get_variable('w1_s', [self.s_dim, n_l1], trainable=trainable)
        w1_a = tf.get_variable('w1_a', [self.a_dim, n_l1], trainable=trainable)
        b1 = tf.get_variable('b1', [1, n_l1], trainable=trainable)
        net = tf.nn.relu(tf.matmul(s, w1_s) + tf.matmul(a, w1_a) + b1)
        return tf.layers.dense(net, 1, trainable=trainable)  # Q(s,a)

soft模式参数更新 可以看到,我们这里进行的是soft模式的参数更新,每次在原来target-net参数的基础上,改变一丢丢,增加一点点eval-net的参数信息。

代码语言:javascript
运行
AI代码解释
复制
# networks parameters
self.ae_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Actor/eval')
self.at_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Actor/target')
self.ce_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Critic/eval')
self.ct_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Critic/target')

# target net replacement
self.soft_replace = [[tf.assign(ta, (1 - TAU) * ta + TAU * ea), tf.assign(tc, (1 - TAU) * tc + TAU * ec)]
                     for ta, ea, tc, ec in zip(self.at_params, self.ae_params, self.ct_params, self.ce_params)]

定义两个网络的损失 关于两个网络的损失,我们之前已经详细介绍过了,这里只是对刚才思路的一个代码实现。

代码语言:javascript
运行
AI代码解释
复制
q_target = self.R + GAMMA * q_
# in the feed_dic for the td_error, the self.a should change to actions in memory
td_error = tf.losses.mean_squared_error(labels=q_target, predictions=q)
self.ctrain = tf.train.AdamOptimizer(LR_C).minimize(td_error, var_list=self.ce_params)

a_loss = - tf.reduce_mean(q)    # maximize the q
self.atrain = tf.train.AdamOptimizer(LR_A).minimize(a_loss, var_list=self.ae_params)

学习 我们首先要从经验池中取出一个batch的数据,然后训练我们的Actor和Critic

代码语言:javascript
运行
AI代码解释
复制
def learn(self):
    # soft target replacement
    self.sess.run(self.soft_replace)

    indices = np.random.choice(MEMORY_CAPACITY, size=BATCH_SIZE)
    bt = self.memory[indices, :]
    bs = bt[:, :self.s_dim]
    ba = bt[:, self.s_dim: self.s_dim + self.a_dim]
    br = bt[:, -self.s_dim - 1: -self.s_dim]
    bs_ = bt[:, -self.s_dim:]

    self.sess.run(self.atrain, {self.S: bs})
    self.sess.run(self.ctrain, {self.S: bs, self.a: ba, self.R: br, self.S_: bs_})

存储经验

代码语言:javascript
运行
AI代码解释
复制
def store_transition(self, s, a, r, s_):
    transition = np.hstack((s, a, [r], s_))
    index = self.pointer % MEMORY_CAPACITY  # replace the old memory with new memory
    self.memory[index, :] = transition
    self.pointer += 1

咕噜sasa

发布于 2018-10-10 02:50:24

使用DQN训练“接砖块”游戏

深度学习的开源类库比较多,比较著名的有tensorlow、caffe等。此处我们使用Tensorflow来训练游戏“接砖块”。

游戏截图如下:

通过点击鼠标左键、右键控制滑块的左右移动来接住小球,如果球碰到底面,则游戏结束

主要python代码如下(游戏本身的代码省略,此处主要关注算法代码):

代码语言:javascript
运行
AI代码解释
复制
#Game的定义类,此处Game是什么不重要,只要提供执行Action的方法,获取当前游戏区域像素的方法即可
class Game(object):
    def __init__(self):  #Game初始化
    # action是MOVE_STAYMOVE_LEFTMOVE_RIGHT  
    # ai控制棒子左右移动;返回游戏界面像素数和对应的奖励。(像素->奖励->强化棒子往奖励高的方向移动)  
    def step(self, action):

# learning_rate
LEARNING_RATE = 0.99
# 跟新梯度
INITIAL_EPSILON = 1.0
FINAL_EPSILON = 0.05
# 测试观测次数
EXPLORE = 500000 
OBSERVE = 500
# 记忆经验大小
REPLAY_MEMORY = 500000
# 每次训练取出的记录数
BATCH = 100
# 输出层神经元数。代表3种操作-MOVE_STAY:[1, 0, 0]  MOVE_LEFT:[0, 1, 0]  MOVE_RIGHT:[0, 0, 1] 
output = 3  # MOVE_STAY:[1, 0, 0]  MOVE_LEFT:[0, 1, 0]  MOVE_RIGHT:[0, 0, 1]
input_image = tf.placeholder("float", [None, 80, 100, 4])  # 游戏像素
action = tf.placeholder("float", [None, output])     # 操作
#定义CNN-卷积神经网络
def convolutional_neural_network(input_image):
    weights = {'w_conv1':tf.Variable(tf.zeros([8, 8, 4, 32])),
               'w_conv2':tf.Variable(tf.zeros([4, 4, 32, 64])),
               'w_conv3':tf.Variable(tf.zeros([3, 3, 64, 64])),
               'w_fc4':tf.Variable(tf.zeros([3456, 784])),
               'w_out':tf.Variable(tf.zeros([784, output]))}

    biases = {'b_conv1':tf.Variable(tf.zeros([32])),
              'b_conv2':tf.Variable(tf.zeros([64])),
              'b_conv3':tf.Variable(tf.zeros([64])),
              'b_fc4':tf.Variable(tf.zeros([784])),
              'b_out':tf.Variable(tf.zeros([output]))}

    conv1 = tf.nn.relu(tf.nn.conv2d(input_image, weights['w_conv1'], strides = [1, 4, 4, 1], padding = "VALID") + biases['b_conv1'])
    conv2 = tf.nn.relu(tf.nn.conv2d(conv1, weights['w_conv2'], strides = [1, 2, 2, 1], padding = "VALID") + biases['b_conv2'])
    conv3 = tf.nn.relu(tf.nn.conv2d(conv2, weights['w_conv3'], strides = [1, 1, 1, 1], padding = "VALID") + biases['b_conv3'])
    conv3_flat = tf.reshape(conv3, [-1, 3456])
    fc4 = tf.nn.relu(tf.matmul(conv3_flat, weights['w_fc4']) + biases['b_fc4'])

    output_layer = tf.matmul(fc4, weights['w_out']) + biases['b_out']
    return output_layer

#训练神经网络
def train_neural_network(input_image):
    predict_action = convolutional_neural_network(input_image)

    argmax = tf.placeholder("float", [None, output])
    gt = tf.placeholder("float", [None])

    action = tf.reduce_sum(tf.mul(predict_action, argmax), reduction_indices = 1)
    cost = tf.reduce_mean(tf.square(action - gt))
    optimizer = tf.train.AdamOptimizer(1e-6).minimize(cost)

    game = Game()
    D = deque()

    _, image = game.step(MOVE_STAY)
    image = cv2.cvtColor(cv2.resize(image, (100, 80)), cv2.COLOR_BGR2GRAY)
    ret, image = cv2.threshold(image, 1, 255, cv2.THRESH_BINARY)
    input_image_data = np.stack((image, image, image, image), axis = 2)
    #print ("IMG2:%s" %input_image_data)

    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())

        saver = tf.train.Saver()

        n = 0
        epsilon = INITIAL_EPSILON
        while True:
            #print("InputImageData:", input_image_data)
            action_t = predict_action.eval(feed_dict = {input_image : [input_image_data]})[0]

            argmax_t = np.zeros([output], dtype=np.int)
            if(random.random() <= INITIAL_EPSILON):
                maxIndex = random.randrange(output)
            else:
                maxIndex = np.argmax(action_t)
            argmax_t[maxIndex] = 1
            if epsilon > FINAL_EPSILON:
                epsilon -= (INITIAL_EPSILON - FINAL_EPSILON) / EXPLORE

            reward, image = game.step(list(argmax_t))

            image = cv2.cvtColor(cv2.resize(image, (100, 80)), cv2.COLOR_BGR2GRAY)
            ret, image = cv2.threshold(image, 1, 255, cv2.THRESH_BINARY)
            image = np.reshape(image, (80, 100, 1))
            input_image_data1 = np.append(image, input_image_data[:, :, 0:3], axis = 2)

            D.append((input_image_data, argmax_t, reward, input_image_data1))

            if len(D) > REPLAY_MEMORY:
                D.popleft()

            if n > OBSERVE:
                minibatch = random.sample(D, BATCH)
                input_image_data_batch = [d[0] for d in minibatch]
                argmax_batch = [d[1] for d in minibatch]
                reward_batch = [d[2] for d in minibatch]
                input_image_data1_batch = [d[3] for d in minibatch]

                gt_batch = []

                out_batch = predict_action.eval(feed_dict = {input_image : input_image_data1_batch})

                for i in range(0, len(minibatch)):
                    gt_batch.append(reward_batch[i] + LEARNING_RATE * np.max(out_batch[i]))

                print("gt_batch:", gt_batch, "argmax:", argmax_batch)
                optimizer.run(feed_dict = {gt : gt_batch, argmax : argmax_batch, input_image : input_image_data_batch})

            input_image_data = input_image_data1
            n = n+1
            print(n, "epsilon:", epsilon, " " ,"action:", maxIndex, " " ,"reward:", reward)

train_neural_network(input_image)
和开发者交流更多问题细节吧,去 写回答
相关文章
深度强化学习 ( DQN ) 初探
1. Google的DQN论文 2015年2月,Google在Nature上发表了一篇论文(见附件):Human-level control through deep reinforcement learning。文章描述了如何让电脑自己学会打Atari 2600电子游戏。 Atari 2600是80年代风靡美国的游戏机,总共包括49个独立的游戏,其中不乏我们熟悉的Breakout(打砖块),Galaxy Invaders(小蜜蜂)等经典游戏。Google算法的输入只有游戏屏幕的图像和游戏的得分,在没有人
程序你好
2018/07/20
6000
深度强化学习 ( DQN ) 初探
本文介绍了强化学习的基本概念、适用场景以及实现方法。作者通过一个游戏例子,讲解了强化学习在实际应用中的实现流程。同时,文章还对强化学习的现状和未来发展方向进行了探讨。
罗晖
2017/05/04
4.4K4
深度强化学习 ( DQN ) 初探
深度强化学习之DQN实战
今天我们会将我们上一篇文章讲解的DQN的理论进行实战,实战的背景目前仍然是探险者上天堂游戏,不过在下一次开始我们会使用OpenAI gym的环境库,玩任何我们想玩的游戏。
CristianoC
2020/05/31
1.5K1
深度强化学习——从DQN到DDPG
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说深度强化学习——从DQN到DDPG,希望能够帮助大家进步!!!
Java架构师必看
2022/07/06
1.4K0
深度强化学习——从DQN到DDPG
深度强化学习之DQN-深度学习与强化学习的成功结合
原因:在普通的Q-Learning中,当状态和动作空间是离散且维数不高的时候可以使用Q-Table来存储每个状态动作对应的Q值,而当状态和动作空间是高维连续时,使用Q-Table不现实。一是因为当问题复杂后状态太多,所需内存太大;二是在这么大的表格中查询对应的状态也是一件很耗时的事情。
CristianoC
2020/05/31
1.3K0
实战深度强化学习DQN-理论和实践
1、Q-learning回顾 Q-learning 的 算法过程如下图所示: 在Q-learning中,我们维护一张Q值表,表的维数为:状态数S * 动作数A,表中每个数代表在当前状态S下可以采用动作
石晓文
2018/04/11
2.9K0
实战深度强化学习DQN-理论和实践
强化学习-DQN
之前两篇文章介绍的内容其实都属于策略网络,即用神经网络去模拟在给定状态s下,每个动作a的执行概率。这篇用到的DQN则属于值函数网络,在这一大类里又可以分为:状态值函数和状态-动作值函数,DQN属于后者,即用神经网络去模拟在给定状态s和动作a的情况下,回报的期望。
luxuantao
2021/02/24
8750
【David Silver 深度强化学习教程代码实战07】 DQN的实现
点击上方“专知”关注获取更多AI知识! 【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值网络和策略网络整合为一个架构,3天训练后就以100比0击败了上一版本的AlphaGo。Alpha Zero的背后核心技术是深度强化学习,为此,专知有幸邀请到叶强博士根据DeepMind AlphaGo的研究人员David Silver《深度强化学习》视频公开课进行创作的中文学习笔记,在专知发布推荐给大家!(关注
WZEARW
2018/04/10
3.6K0
【David Silver 深度强化学习教程代码实战07】 DQN的实现
深度强化学习 | DQN训练超级玛丽闯关
本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
NewBeeNLP
2021/03/03
1.5K0
深度强化学习 | DQN训练超级玛丽闯关
【深度强化学习】DQN训练超级玛丽闯关
上一期 MyEncyclopedia公众号文章 通过代码学Sutton强化学习:从Q-Learning 演化到 DQN,我们从原理上讲解了DQN算法,这一期,让我们通过代码来实现DQN 在任天堂经典的超级玛丽游戏中的自动通关吧。本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
黄博的机器学习圈子
2020/12/11
1.4K0
【深度强化学习】DQN训练超级玛丽闯关
强化学习:DQN与Double DQN讨论
强化学习逐渐引起公众的注意要归功于谷歌的DeepMind公司。DeepMind公司最初是由Demis Hassabis, Shane Legg和Mustafa Suleyman于2010年创立的。创始人Hassabis有三重身份:游戏开发者,神经科学家以及人工智能创业者。Hassabis游戏开发者的身份使人不难理解DeepMind在Nature上发表的第一篇论文是以雅达利(atari)游戏为背景的。同时,Hassabis又是国际象棋高手,他在挑战完简单的雅达利游戏后再挑战深奥的围棋游戏也就不难理解了。这就有了AlphaGo和李世石的2016之战,以及他在Nature发表的第二篇论文。一战成名之后,深度强化学习再次博得世人的眼球。当然,DeepMind的成功离不开近几年取得突破进展的深度学习技术。本节主要讲解DQN,也就是DeepMind发表在Nature上的第一篇论文,名字是Human-level Control throughDeep Reinforcement Learning。
博文视点Broadview
2020/06/11
1.4K0
强化学习:DQN与Double DQN讨论
强化学习(十二) Dueling DQN
    在强化学习(十一) Prioritized Replay DQN中,我们讨论了对DQN的经验回放池按权重采样来优化DQN算法的方法,本文讨论另一种优化方法,Dueling DQN。本章内容主要参考了ICML 2016的deep RL tutorial和Dueling DQN的论文<Dueling Network Architectures for Deep Reinforcement Learning>(ICML 2016)。
刘建平Pinard
2018/12/10
1.3K0
强化学习(十二) Dueling DQN
论文结果难复现?本文教你完美实现深度强化学习算法DQN
选自arXiv 作者:Melrose Roderick等 机器之心编译 论文的复现一直是很多研究者和开发者关注的重点,近日有研究者详细论述了他们在复现深度 Q 网络所踩过的坑与训练技巧。本论文不仅重点标注了实现过程中的终止条件和优化算法等关键点,同时还讨论了实现的性能改进方案。机器之心简要介绍了该论文,更详细的实现细节请查看原论文。 过去几年来,深度强化学习逐渐流行,因为它在有超大状态空间(state-spaces)的领域上要比先前的方法有更好的表现。DQN 几乎在所有的游戏上超越了之前的强化学习方法,并在
机器之心
2018/05/10
1.6K0
强化学习(十一) Prioritized Replay DQN
    在强化学习(十)Double DQN (DDQN)中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。今天我们在DDQN的基础上,对经验回放部分的逻辑做优化。对应的算法是Prioritized Replay DQN。
刘建平Pinard
2018/10/22
1K0
强化学习(十一) Prioritized Replay DQN
【强化学习】DQN 的各种改进
DQN 发表于 NIPS 2013,在此之后 DeepMind 不断对 DQN 进行改进,首先在 2015 年初发布了 Nature 文章,提出了 Nature 版本的 DQN,然后接下来在 2015 年一年内提出了 Double DQN,Prioritied Replay,还有 Dueling Network 三种主要方法,又极大的提升了 DQN 的性能,目前的改进型 DQN 算法在 Atari 游戏的平均得分是 Nature 版 DQN 的三倍之多。因此,在本文中,我们将介绍一下各个改进的方法,并在最后给出用 Nature-DQN 的实现方法。
阿泽 Crz
2020/11/17
3.5K0
【强化学习】DQN 的各种改进
MATLAB强化学习 DQN 算法
强化学习 DQN 算法将状态和动作当成神经网络的输入, 然后经过神经网络分析后得到动作的 Q 值, 这样不需要在表格中记录 Q 值, 而是直接使用神经网络生成 Q 值.也可以只输入状态值, 输出所有的动作值, 然后按照 Q learning 的原则, 直接选择拥有最大值的动作当做下一步要做的动作.
万木逢春
2019/11/18
4.5K1
强化学习 12 - 什么是 DQN
前面我们有一篇文章介绍了 q learning, 也用 Deep Q Network 做了一个小游戏, 但是还没有详细的讲DQN的理论,今天我们就来看一下它的概念。
杨熹
2018/12/27
1.4K0
强化学习(十)Double DQN (DDQN)
    在强化学习(九)Deep Q-Learning进阶之Nature DQN中,我们讨论了Nature DQN的算法流程,它通过使用两个相同的神经网络,以解决数据样本和网络训练之前的相关性。但是还是有其他值得优化的点,文本就关注于Nature DQN的一个改进版本: Double DQN算法(以下简称DDQN)。
刘建平Pinard
2018/10/15
3.1K0
【强化学习】DQN:Flappy Bird实例分析
在本专栏【强化学习】理论知识整理汇总中提到了DQN的原理和创新点,本篇来通过Flappy Bird这个游戏实例来分析DQN的代码构成。 主要所用框架/库:pytorch、pygame、opencv 程序代码参考了github上的项目Playing-Flappy-Bird-by-DQN-on-PyTorch
zstar
2022/06/08
1.6K0
【强化学习】DQN:Flappy Bird实例分析
TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
本文中我们将一起创建一个深度Q网络(DQN)。它基于我们系列文章中(0)的单层Q网络,如果你是强化学习的初学者,我推荐你到文末跳转到(0)开始阅读。尽管简单的Q网路已经可以在简单的问题上和Q表表现一样出色,但是深度Q网络可以使其变得更强。要将简单的Q网络转化为深度Q网路,我们需要以下改进:
ArrayZoneYour
2018/03/01
8K1
TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展

相似问题

小白如何快速上手机器学习(深度学习)?

0320

关于“深度学习引擎”?

1356

强化学习真的能解决实际的排班问题吗?

1386

灰度图像彩色化利用opencv以及深度学习神经网络实现的步骤?

0225

跑深度学习代码的时候遇到的?

12.3K
相关问答用户
高级数据分析师擅长5个领域
擅长4个领域
萃橙科技 | 合伙人擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档