gpt4 book ai didi

python - 如何创建深度 Q 学习神经网络来解决像贪吃蛇这样的简单游戏?

转载 作者:行者123 更新时间:2023-11-30 09:15:06 25 4
gpt4 key购买 nike

过去四天我一直在努力尝试创建一个简单的可学习的工作神经网络(NN)。我从汉诺塔开始,但这非常棘手(可以使用 Q-table 完成),而且没有人真正在网上找到好的例子,所以我决定用蛇游戏来代替,那里有很多例子和教程。长话短说,我做了一个新的 super 简单的游戏,你有 [0,0,0,0],通过选择 0、1、2 或 3,你可以将 0 更改为 1,反之亦然。因此,选择 1 将给出 [0,1,0,0] 的输出,再次选择 1 将返回 [0,0,0,0]。非常简单

尽管游戏非常简单,但由于我没有接受过编码方面的教育,所以我很难从概念到实践。

现在的最终目标是让下面的代码能够多次完成游戏。 (目前已经运行了大约600次,一次也没有完成4步问题)

当前的网络架构是第一个隐藏层中的 4 个输入、4 个节点和 4 个输出,即使隐藏层是冗余的,我也想保持这种方式,这样我就可以学习如何正确地解决其他问题。

如果你懒得阅读代码并且我不怪你,我会把我的心理伪代码放在这里:

  1. 设置变量、占位符和导入库
  2. 运行程序 200 次,给它一个学习的机会,每次运行 20 轮
  3. 以“状态”作为输入运行神经网络,并得到定义为“输出”的输出以供将来使用
  4. 游戏代码
  5. 这个特定游戏的新奖励只是一组新的状态(我刚刚想到这是错误的方式([0,1,0,0] 对于状态应该有奖励 [1 ,0,1,1]) 但我已经尝试过翻转它,但它仍然不起作用,所以这不是问题)
  6. 我的想法是,我只需通过神经网络运行新状态即可获得下一个 Q 值
  7. 这个方程直接取自互联网上的任何深度 q 学习教程,我想也许我的这个或其中一个组件是错误的。
  8. 运行梯度下降优化函数
import tensorflow as tf             ## importing libraries
import random
import numpy as np

epsilon = 0.1 ## create non tf variables
y = 0.4
memory = []
memory1 = []

input_ = tf.placeholder(tf.float32, [None, 4], name='input_')
W1 = tf.Variable(tf.random_normal([4, 4], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([4]), name='b1')
hidden_out = tf.add(tf.matmul(input_, W1), b1, name='hidden_out') ## W for weights
hidden_out = tf.nn.relu(hidden_out) ## b for bias'

W2 = tf.Variable(tf.random_normal([4, 4], stddev=0.03), name='W2')
b2 = tf.Variable(tf.random_normal([4]), name='b2')
Qout = tf.add(tf.matmul(hidden_out, W2), b2, name='Qout')
sig_out = tf.sigmoid(Qout, name='out')


Q_target = tf.placeholder(shape=(None,4), dtype=tf.float32)
loss = tf.reduce_sum(tf.square(Q_target - Qout))
optimiser = tf.train.GradientDescentOptimizer(learning_rate=y).minimize(loss)

init_op = tf.global_variables_initializer()

with tf.compat.v1.Session() as sess:
sess.run(init_op)
for epoch in range(200): ## run game 200 times
states = [0,0,0,0]
for _ in range(20): ## 20 turns to do the correct 4 moves
if _ == 19:
memory1.append(states)
output = np.argmax(sess.run(sig_out, feed_dict={input_: [states]}))
## sig_out is the output put through a sigmoid function
if random.random() < epsilon: ## this is the code for the game
output = random.randint(0,3) ## ...
if states[output] == 0: ## ...
states[output] = 1 ## ...
else: ## ...
states[output] = 0 ## ...
reward = states
Qout1 = sess.run(sig_out, feed_dict={input_: [states]})
target = [reward + y*np.max(Qout1)]
sess.run([optimiser,loss], feed_dict={input_: [states], Q_target: target})

我已经有一段时间没有收到任何错误消息了,理想情况下每次的实际结果都是 [1,1,1,1]。

预先感谢您的所有帮助

附:我想不出一个客观的标题,抱歉

最佳答案

奖励值应该是采取行动后的目标值。在您的情况下,您已设置reward=states。由于您的函数试图最大化奖励,因此您的状态越接近 [1, 1, 1, 1],您的 AI 应该获得的奖励就越多。

也许诸如reward = sum(states)之类的奖励函数可以解决您的问题。

关于python - 如何创建深度 Q 学习神经网络来解决像贪吃蛇这样的简单游戏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57813278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com