php网站开发所需要的软件,深圳网络推广哪家,展馆设计的主题有哪些,php网站如何导入数据库对马尔可夫奖励的理解
看的这个教程
公式#xff1a;V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子#xff0c;它表示未来奖励的重要性#xff0c;通常取值在 0 到 1 之间。…对马尔可夫奖励的理解
看的这个教程
公式V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子它表示未来奖励的重要性通常取值在 0 到 1 之间。 V(s’) 代表下一个状态 s’ 的价值。理解
如果折扣因子γ为1那么从现在开始一直到结束所有的即时奖励加在一起就是当前状态的价值。所以现在的价值是以后的所有即时奖励决定的。但是实际中γ是0到1的一个小数。就是说相同的动作离现在越远带来的收益越小。还有我发现终点是没有价值的或者他的价值对于算法没有帮助只是终点前一步到终点这个动作或者状态转移产生了一个大的奖励。不知道对不对。请大家提出意见。假设我们把所有的状态价值放在一个shape为164的表格里我们把它称为Q表。16代表16个格子4代表每一个动作。数字是164是因为图片有16个格子每个格子都能执行四个动作这里只是举个简单的例子你有多少种状态和有几个动作都没有关系可以随便改只要合理。初始值都为0。就是说当前所有位置的所有动作的价值都为0。在这个格子里我们的目的是走到终点。规则是每次任意方向走一步走到终点胜利走到陷阱就失败。胜利与失败就结束游戏。胜利这次游戏的一分失败则是得-100分。每走一步扣一分。要知道Q表的所有格子初始值为0是不符合现实的那么怎么把值逐步更改为现实中对应的值呢假设我们走对了一次倒数第二个格子在向终点方向的那个动作就有了价值不是0了而且大于0。假设我们走错了一次那么走错的倒数第二个格子向陷阱走的那个动作就有了价值不是0并且小于0。这样打完一局游戏不论走对还是走错都会产生1个有价值的格子。如果这个格子不是起点那就肯定还有倒数第三个格子根据公式倒数第三个格子的那个方向价值也能算出来。如果倒数第三个格子不是起点…就这样一点一点的“辐射”。所有的走过的格子都有了价值。假如走到了一个格子我们只要查Q表就能知道往哪里走比较安全能通向终点往哪里走比较危险会掉进陷阱。所以Q表会指引我们走向正确的道路避开危险的道路。算法成立的前提是有过走成功的经历这样才会把最终的那个奖励“扩散”到起点。实际上我们不是直接从终点扩散的而是直接采样足够多的样本一点点更新Q表。比如我们采样到一步数据拿Q表查询当前状态的当前动作的价值V(s) 计作A还有查询下一个状态的价值V(s’)计作B。再拿到这一步的奖励R(s)计作R假设折扣是0.9那么A R0.9*B 。看到没有是未来的价值决定现在的价值。如果Q表是正确的这个等式就成立但是我们会发现有误差所以我们得计算出误差等式右边减去左边误差 R0.9*B - A0.10.1是学习率再拿这个误差更新A就是Q表中当前的状态这个动作的价值。这样Q表就会距离理想中的绝对正确的Q表更进一步了。至于为什么有学习率我的理解是R0.9*B这个东西也是估算出来的不是真正的值但是按道理他是和奖励R决定A的所以只取用他的影响*不取用他真正的值。**大家可以谈谈自己的看法本人能力尚浅**什么是影响我也不清楚可能在这个领域有他的名字只是我不知道或者没有察觉出是哪个概念。
关于陷阱的作用 加入把打叉的都变成陷阱那么我们就会更快的到达终点因为走进陷阱后Q表就不会让他再次掉进陷阱。所以说陷阱在某种程度上帮助我们接近终点。有不同意见可以提出来让大家讨论。
代码上面的链接里有完整版。还有视频我也是从B站找到的
这个代码在2023-10-11 跑成功过gym 0.26.2python 3.9ipython 8.16.1ipython-genutils 0.2.0 不确定有没有用到用的conda这个倒是无所谓
import randomimport gym
import numpy as np
from IPython import displayclass NasWrapper(gym.Wrapper):def __init__(self):env gym.make(FrozenLake-v1,render_modergb_array,is_slipperyFalse)super(NasWrapper, self).__init__(env)self.env envdef reset(self):state, _ self.env.reset()return statedef step(self, action):state, reward, terminated, truncated, info self.env.step(action)over terminated or truncatedif not over:reward -1# elif reward 1:# reward 100if over and reward 0:reward -100return state, reward, overdef show(self):from matplotlib import pyplot as pltplt.figure(figsize(3, 3))plt.imshow(self.env.render())plt.show()nw NasWrapper()
Q np.zeros((16, 4))def play(isShowFalse):data []reword_sum 0state nw.reset()over Falsewhile not over:action Q[state].argmax()if random.random() 0.1:action nw.action_space.sample()next_state, reward, over nw.step(action)reword_sum rewarddata.append((state, action, reward, next_state, over))state next_stateif isShow:display.clear_output(waitTrue)nw.show()return data, reword_sumclass Pool():def __init__(self):self.pool []def __len__(self):return len(self.pool)def __getitem__(self, item):return self.pool[item]def update(self):old_len len(pool)while len(pool) - old_len 200:self.pool.extend(play()[0])self.pool self.pool[-10000:]# 获取一批数据样本def sample(self):return random.choice(self.pool)pool Pool()# pool.update()def train():for epoch in range(100):pool.update()for i in range(100):state, action, reward, next_state, over pool.sample()value Q[state, action]target Q[next_state].max() * 0.9 rewardupdate (target - value) * 0.1Q[state, action] updateif epoch % 100 0:print(epoch, len(pool), play()[-1])train()
print(train ok)
print(Q)
play(isShowTrue)
# nw.reset()
# while True:
# inputNumber input()
# print(---)
# nw.step(int(inputNumber))
# nw.show()