【强化学习】小项目分析:DQN玩游戏2048

DQN玩游戏《2048》

用DQN玩小游戏,可分为游戏环境部分模型部分,最后有源码地址

1.《2048》2048游戏

应该没有人不会玩吧
2048环境python代码
操作:上下左右
要点:每次都要在空地方随机产生一个新的(2或4)的块块
环境奖励机制:
1.如果有消去的滑块:+消去滑块的大小(比如32+32变成64,就加64分
2.存活:+1分
3.不能移动(即没有消去滑块或产生新滑块):-5分(需要避免模型陷入死路
4.死局:-20

2. Q Learning

Q表:Q[s, a]记录某状态s下对应的行为a的分数
优化(训练)Q表方法:即优化每个状态s下所执行的行为a,若在s下执行了a得到了下一个状态s_和奖励r,当前分数则为Q[s, a],下一步能得到的最好分数为maxQ[s_, ],那么对未来的估计分数就是r+gamma*maxQ[s_,](这里的gamma指的是未来奖励衰减reward
如果没有衰减,那么Q表可以看到无限远的奖励,但很多情况下会导致环境发生变化,那么之前所训练的Q表中对于较远的情况就不再适用,同时模型也会面临难以收敛的情况。所以设gamma<1,这样Q表就会着重考虑中近状态的情况,也有利于快速收敛)

用公式:Q[s, a] = rl * (r * gamma * maxQ[s_,] - Q[s, a]) 即可完成优化。在此公式中,r * gamma * maxQ[s_,]是Q估计(意思就是我还没有到s_状态,所以我估计在s_状态下能得到的估计奖励),Q[s, a]是Q现实(意思就是我在当前状态确确实实地执行了行为a后得到的现实奖励)。
Q Learning的更新算法思路就是:通过未来得到的估计奖励分数和目前手头的分数的差,来评估这个行为是否“好”。

  • 比如:在状态s执行行为a后,能在未来得到很大一笔奖励,那么久加大Q[s, a]的值,下次执行时,又到状态s时能更大可能地执行a。反之如果收益很小,则下次到状态s时减少执行a的概率

3. DQN

当环境中的状态数量非常多时,用Q表就不再适合,我们考虑用神经网络来代替Q表,但是训练的核心思路还是Q Learning
网络模型:
分为评估网络(evaluate net)和目标网络(target net)网络结构:简单的CNN
结构一样,但训练时,评估网络拥有最新参数,所以得到的是现实奖励。而目标网络是老参数(通常每10代训练同步一次参数),只能基于过去的视角得到对未来的估计奖励,通过两个奖励的差值来实现模型的训练。

记忆库:
存储【当前状态,下一个状态,采取行为,奖励】(s, s_, a, r)

训练网络:
每次从记忆库中选择batch_size=512批数据进行学习,损失函数也可以仿照Q Learning定义为:TD error = (Q估计 - Q现实)2

q_next = self.q_target_model.predict(s_)  # 现实网络的输出
## 下面是一个训练技巧
q_eval = self.q_eval_model.predict(s)  
q_target = q_eval.copy()
batch_index = np.arange(self.batch_size, dtype=np.int32)  # 0-512的下标
# 下面是Q估计
q_target[batch_index, a] = r + self.gamma * np.max(q_next, axis=1)
## 把q_eval_model的输出复制一份,并把所有下标的行为a的那一位维修改为Q估计
self.q_eval_model.fit(s, q_target, epochs=self.train_epochs, verbose=0)

在fit时,q_eval_model.fit(s, q_target)被keras执行为:loss_fun(q_eval_model(s), q_target) = (q_eval_model(s) - q_target)2
比如:某学习数据批中,状态s=[[x1], [x2]], q_eval_model.predict(s) =
[[2,5,1,-2],
[3,8,6,10]](状态x1在现实网络中输出是四个行为的分数为[2,5,1,-2], x2同理)
执行行为是[1,3],下一个状态s_[[x3], [x4]]。经过计算,Q估计为[8,1],所以q_target =
[[2,8,1,-2],
[3,8,6,1]]
那么TD_error = [[0,5-8,0,0],[0,0,0,10-1]]2,无关的行为都是0,只有相关的行为会被训练,即实现了对状态s下行为a的训练。

4. 训练技巧

归一化:因为2048游戏中是0-2048的数字,对于模型来说难以处理,所以考虑处理成0-1直接是最好的,我们使用对数进行压缩,由于大部分数字是2-1024,所以考虑用公式:

s = log(s+1) / 16

tbc…

5. 展示结果

获得奖励的图reward
tbc…
ps. 源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值