大家好, 欢迎学习本Python教程｡
好的, 我们只是在达到新状态后更新了内存｡
现在让我们来关注下一个更新｡
按照你现在的说法, 下一次更新会是什么？
基本上, 我们完成了一次过渡｡
我们已经确定了过渡的最后一个元素的日期, 这就是新的状态｡
所以现在就像我们要重新开始一样｡
当我们重新开始的时候, 你知道, 我们处在一个新的环境中｡
那么我们现在自然需要做什么呢？
当然, 这是为了表演一个动作, 因为我们已经观察到了新的状态｡
所以现在我们要做的就是表演一个动作｡
因此, 我们现在要做的当然是, 使用选择动作功能来播放动作｡
那就开始吧｡
让我们创建一个新的变量操作, 并使用select action函数来播放该操作｡
所以我用第一个self来指定select action函数是将要创建的不同类的对象的一个方法｡
所以自我打点选择行动｡
开始吧, 自我点选择动作｡
当然,
因为选择动作函数把状态作为输入, 因为当当前输入状态进入神经网络时, 选择动作函数将返回神经网络的输出｡
所以我们必须在这里输入输入状态｡
因为这是我们刚刚在环境中达到的状态,
输入状态当然是新状态, 因为我们刚刚达到的状态, 在我们现在的时间是新状态｡
所以在选择操作功能中, 我输入了新的状态｡
好吧, 我会的
因此, 通过这行代码, 我们只需在到达新状态后执行新操作｡
好吧, 我会的
现在我们在实际中使用它, 我们得到了奖励, 因此我们得到了反馈｡
因此, 如果我们的记忆中有超过100个元素, 那么, 就到了学习的时候了｡
因此, 我们现在必须做的是, 在选择一个行动之后, 逻辑上会发生什么,
当然, 就是了解需求, 开始学习是否以正确的方式做事情｡
现在, 由于它刚刚播放了动作, 我们将让人工智能从它在过去100个事件中的动作中学习｡
但是在我们应用这个学习函数之前, 我们必须设置这个if条件, 以确保我们已经达到了100个以上的事件, 因为,
你知道, 我们是从内存的随机样本中学习的｡
我们有一万个元素的巨大记忆｡
我们随机抽取了100个元素的记忆样本｡
人工智能从这100个随机转换样本中所包含的信息中学习｡
所以让我们先用if条件来确定内存的元素个数, self点内存然后再小心点｡
只是一个小把戏｡
自点内存是重播内存类的对象, 但重播内存类有一个属性, 即内存｡
所以实际上我们需要采取自我记忆｡
内存, 第一个内存是replay内存类的对象, 第二个内存是这里的self内存属性｡
所以如果内存中的元素数量是我们想要的, 大于100, 那么就着色｡
然后呢？
我们可以学习, 但在学习之前, 我们需要随机抽取100个跃迁｡
我们可以用sample函数得到这个｡
由于sample函数返回不同的批次, 因此状态设置时间t为20加1｡
这些行为的时间为t, 奖励时间为t｡
我们现在要做的是创建一些新的变量, 这些变量是时间t的状态, 下一个状态,
奖励和行为.
我们可以简单地给这里的参数取相同的名字, 然后粘贴到这里｡
而这些变量将等于示例函数返回的值, 因为它正好返回这些状态批｡
下一个陈述奖励和行动｡
所以我们现在要做的就是先得到内存对象｡
然后从这个内存对象开始, 我们将使用sample方法, 它将作为输入｡
我们希望人工智能从中学习的转换次数是100｡
这就是为什么我们要确保内存有100多次转换｡
所以它会从记忆的100次转变中学习｡
这样学习就会好得多｡
所以现在让我们来学习一下｡
因为learn方法是我们的diffusion类的一个方法, 所以我们需要从将来的对象中访问这个learn方法,
这些对象将从不同的类中创建｡
因此, 我们需要采取的是自我｡
所以self把这个对象引用到类中, 然后学习这个学习方法, 学习我们输入的方法｡
当然, 这些家伙在这里, 批状态批, 下一个日期, 批奖励和批行动｡
这些是从内存中采样的批处理, 我们得到了100个批处理, 因为我们有100个转换｡
从这100个转变中, 我们得到了100种状态, 106种状态, 100种奖励和100种行动｡
让我们在这里和那里玩这个游戏｡
现在学习将发生｡
它会发生在所有这些随机批次｡
好极了｡
现在我们需要做的是最后的更新后, 你知道, 达到一个新的状态, 并发挥一个行动｡
我们已经有了要玩的动作, 但是我们还没有更新我们自己的动作, 最后一个动作变量｡
所以我们一定要记住这一点｡
我们现在就做吧｡
我们将更新最后一个动作self, 最后一个动作equals, 当然还有我们刚才用select action函数执行的动作｡
好吧, 我会的
所以现在最后一个动作被更新了｡
新状态也一样｡
我们到达了新的状态, 但是我们还没有更新最后一个状态, 因为最后一个状态当然在20的状态之前｡
但是从现在开始, 我们在时间T +1时达到了新的状态｡
最后一个状态变成了这个新状态, 因此我们也需要更新它｡
Self dot的最后一个状态等于我们的新状态｡
我们走吧｡
现在我们需要更新什么？
现在只剩下一件事了｡
当然, 这是奖励｡
而回报正是我们在现实中得到的回报｡
这就是这个更新函数的参数, 如果我们把它和地图连接起来, 这就是最后的奖励｡
这是我们在这个达到的新状态中玩完动作后得到的奖励｡
所以如果我们再往上送一些, 这最后的奖励就会差减一｡
如果我们离目标更远, 我们会得到稍微好一点的奖励｡
减去0｡ 2.
如果我们离目标更近了, 我们会得到一个稍微好一点的奖励开一个｡
如果我们离地图的一边太近, 那将是一个糟糕的惩罚｡
我们将得到每个边的负1｡
所以这是我们最后一次了｡
在现实中, 这是一个真正发生在地图上｡
这将是update函数的参数｡
最后一个词就是这个词｡
因为这是更新函数的参数, 它对应于这个奖励,
也就是说, 最后一个奖励变量, 在函数初始化的时候, 就变成了我们得到的新奖励｡
实际上, 这是奖励, 或者这是同样的奖励｡
好吧, 我会的
所以现在我们更新了最后一个奖励｡
既然我们刚刚拿到了最后一个奖励, 那么, 我们现在可以更新奖励窗口了｡
你还记得我们在这里初始化的奖励窗口, 它是我们类的对象的变量之一｡
这是一个窗口, 通过计算最近100次奖励的平均值, 可以跟踪本次培训的进展情况｡
因此, 它将像一个滑动窗口, 向我们展示奖励的平均值是如何演变的｡
既然我们刚刚拿到了最后一个奖励, 那么, 我们可以更新奖励窗口｡
那么我们如何更新它呢？
好吧, 我们只需要把最后一个奖励附加到窗口上｡
因此, 我现在要做的就是利用我的奖励窗口｡
为奖励窗口服务｡
在这里｡
然后我将使用append函数｡
在append函数中, 我们需要输入元素｡
我们要附加到奖励窗口｡
当然, 这就是奖励｡
好吧, 我会的
好极了｡
因为这个奖励窗口是固定的, 你知道, 它不会是一个增长的窗口｡
这将是一个固定大小的窗口, 随着时间的推移而滑动, 向我们展示奖励的演变｡
现在我们需要决定这个窗口的大小｡
它只是我们在这个窗口中获得奖励的方式的数量｡
比如说, 我们来看看, 最后100个单词的最后1000个意思｡
为了确保这一点, 我们要加上, 如果, 那么, Len, 我们就得到我们的奖励｡
窗口｡
我们在这里简单地添加, 如果奖励窗口中的元素数量大于1000, 那么,
我们要做的是删除奖励窗口中的第一个元素｡
这个奖励窗口的第一个元素的索引为零｡
好吧, 我会的
而现在我们要确保这个奖励窗口永远不会得到超过1000个元素｡
也就是说1000意味着最后的100个奖励｡
太完美了
这将是一个固定大小的窗口, 这样我们就可以看到奖励的平均值是否在增加, 从而看到培训是否进行得很顺利｡
相应地, 如果这张卡片能满足我们的要求｡
好极了｡
现在你只剩下一件小事要做了｡
你想怎么样？
请记住, 这个更新函数不仅更新奖励窗口中转换的不同元素,
而且还返回到达新状态时所执行的操作｡
这就是为什么我们在地图上的行动等于脑点更新｡
最后一句话, 最后一个信号｡
因此它应该返回一些东西, 它应该返回的东西当然是, 动作｡
最后一件简单的事情就是返回操作｡
到达新状态时显示的操作｡
就是这样｡
我们的更新功能已经就绪｡
它将执行所有必需的更新, 并在到达新状态时返回操作｡
太完美了
这是整个过程中最后一个困难的行动｡
现在剩下的都是小孩子的事了｡
我们将创建一个得分函数来返回奖励的平均值和奖励窗口｡
然后, 我们将使一个保存功能, 以保存大脑的汽车, 每当你想退出应用程序, 并回到它｡
当然, 既然你想在你回到车上的时候能够加载你的汽车大脑, 那就回到应用程序上｡
最后我们将创建一个load函数, 在你用save函数保存模型后, 它将加载你的模型｡
剩下的三个函数, 但会很简单｡
然后我们会看到第一个模块中最激动人心的部分｡
这就是演示｡
我们将看看API是否有效｡
我们将看看赛车是否达到了目标, 我们将看看我们如何改进它｡
然后最终你将建立你的第一个人工智能｡
我等不及要开始演示了｡
我们先做这三个函数｡
在那之前, 好好享受吧｡
一､