【问题标题】:Policy Gradient algorithm gets worse over time随着时间的推移,策略梯度算法变得更糟
【发布时间】:2018-07-31 14:41:25
【问题描述】:

我尝试为视频游戏 Pong 编写策略梯度算法。 这是代码:

import tensorflow as tf
import gym
import numpy as np
import matplotlib.pyplot as plt
from os import getcwd

num_episodes = 1000
learning_rate = 0.01

rewards = []

env_name = 'Pong-v0'
env = gym.make(env_name)

x = tf.placeholder(tf.float32,(None,)+env.observation_space.shape)
y = tf.placeholder(tf.float32,(None,env.action_space.n))

def net(x):
    layer1 = tf.layers.flatten(x)
    layer2 = tf.layers.dense(layer1,200,activation=tf.nn.softmax)
    layer3 = tf.layers.dense(layer2,env.action_space.n,activation=tf.nn.softmax)

    return layer3

logits = net(x)
loss = tf.losses.sigmoid_cross_entropy(y,logits)
train = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
saver = tf.train.Saver()
init = tf.global_variables_initializer()
sess = tf.Session()

with tf.device('/device:GPU:0'):
    sess.run(init)

    for episode in range(num_episodes):
        print('episode:',episode+1)

        total_reward = 0
        losses = []
        training_data = []
        observation = env.reset()
        while True:
            if max(0.1, (episode+1)/num_episodes) > np.random.uniform():
                probs = sess.run(logits,feed_dict={x:[observation]})[0]
                action = np.argmax(probs)
            else:
                action = env.action_space.sample()

            onehot = np.zeros(env.action_space.n)
            onehot[action] = 1
            training_data.append([observation,onehot])
            observation, reward, done, _ = env.step(action)
            total_reward += reward

            if done:
                break

        if total_reward >= 0:
            learning_rate = 0.01
        else:
            learning_rate = -0.01

        for sample in training_data:
            l,_ = sess.run([loss,train],feed_dict={x:[sample[0]], y:[sample[1]]})
            losses.append(l)
            print('loss:',l)
        print('average loss:',sum(losses)/len(losses))

        saver.save(sess,getcwd()+'/model.ckpt')

        rewards.append(total_reward)
        plt.plot(range(episode+1),rewards)
        plt.ylabel('total reward')
        plt.xlabel('episodes')
        plt.savefig(getcwd()+'/reward_plot.png')

但在我训练了我的网络之后,脚本制作的情节似乎表明网络在接近尾声时变得更糟。同样在上一集中,所有训练示例的损失都是相同的(~0.68),当我尝试测试网络时,玩家的桨只是一动不动地坐在那里。有什么方法可以改进我的代码?

【问题讨论】:

    标签: python tensorflow neural-network reinforcement-learning


    【解决方案1】:

    我会要求您熟悉如何使用 tensorflow 编写神经网络,因为问题出在哪里。您在应该是终端层的两个 nn 层中都提供activation=tf.nn.softmax(因为您试图找到最大动作概率)。您可以在第二层将其更改为tf.nn.relulearning_rate有一个更大的问题:

    if total_reward >= 0:
        learning_rate = 0.01
    else:
        learning_rate = -0.01
    

    Negative learning rate makes absolutely no sense。您希望学习率是正的(您现在可以使用常数 0.01)。

    另外,另一个评论,你没有提到observation_space 形状,但我假设它是一个二维矩阵。然后您可以在将其输入x 之前对其进行整形。所以你不需要不必要地使用tf.flatten

    【讨论】:

    • 我不明白为什么我的学习率不应该是负数。您链接的帖子说,负学习率的唯一问题是,它将使损失最大化。但这正是我想做的。
    • 你为什么要最大化你的损失?损失函数是折扣奖励乘以动作概率的对数。现在,如果奖励是积极的,那么行动变得更有可能,而如果奖励是消极的,那么行动的可能性就会降低。如果您在奖励为正时最小化损失,在奖励为负时最大化损失,最终结果将是网络无法学习您案例中发生的任何关键特征。
    • 不,我很确定我不是。
    • 我想你是,deep q learningpolicy gradient
    • 好。祝你好运。
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多