Python 策略梯度算法会随着时间的推移变得更糟
我试图为视频游戏Pong编写一个策略梯度算法。 代码如下:Python 策略梯度算法会随着时间的推移变得更糟,python,tensorflow,neural-network,reinforcement-learning,Python,Tensorflow,Neural Network,Reinforcement Learning,我试图为视频游戏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.p
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),当我尝试测试网络时,球员的球拍只是静止不动。有什么方法可以改进我的代码吗
我想请您熟悉如何使用tensorflow对神经网络进行编码,因为问题就在这里。您在两个nn层中都提供了
activation=tf.nn.softmax
,这两个nn层都应该是终端层(因为您试图找到最大的动作概率)。您可以在第二层中将其更改为tf.nn.relu
。学习率有一个更大的问题
:
if total_reward >= 0:
learning_rate = 0.01
else:
learning_rate = -0.01
。您希望学习速率为正(现在可以使用常数0.01)
另外,还有一条评论,您没有提到
观察空间
形状,但我假设它是一个2D矩阵。然后,您可以在将其输入到x
之前对其进行重塑。因此,您不需要不必要地使用tf.flatte
我不明白为什么我的学习率不应该是负的。你链接的帖子说,负学习率的唯一问题是,它会使损失最大化。但这正是我想做的。你为什么要最大限度地增加你的损失?损失函数是贴现报酬乘以行动概率的对数。现在,如果奖励是正面的,那么行为发生的可能性就更大,而如果奖励是负面的,那么发生的可能性就更小。如果你在奖励为正时将损失最小化,在奖励为负时将损失最大化,那么最终结果将是网络没有学习到你案例中发生的任何关键功能。不,我很确定我没有。我认为你是,很好。祝你好运。