大家好, 欢迎学习本Python教程｡
好的, 在本教程中, 我们将创建一个函数, 每次都能选择正确的动作｡
所以基本上, 我们要实现的部分, 将使汽车做正确的移动,
在每一次是向左走, 直行或向右走, 以达到目标, 并避免障碍物下降｡
所以我们现在就开始吧｡
像往常一样, 我们先用def定义一个函数, 然后给予这个函数命名,
我们称之为select.
开始行动
然后加上一些括号, 这个选择操作函数将有两个参数｡
第一种是自我象平常一样地指称客体｡
第二个论点, 你认为是哪一个？
那会是什么呢？
如果你想一想, 我们选择的行动来自神经网络的输出,
因为神经网络的输出是三种可能行动中每一种的线索值,
因此我们所做的行动, 将成为神经网络输出的行动, 取决于输入状态｡
而输入状态正是我们需要的select action函数的第二个参数｡
这是因为我们实际上是要获取神经网络的输出｡
当然, 神经网络的输出直接取决于神经网络的输入｡
这就是我们的论点｡
现在我们可以给它取任何名字｡
我们称之为状态, 因为神经网络的输入是输入状态, 由一个五维向量编码,
三个信号, 方向和负方向｡
所以现在事情就简单了｡
我们将把输入状态输入到神经网络中, 就是我们在上面构建的, 这里的网络类.
然后我们将得到输出, 这是三个可能动作中每一个的提示值｡
然后使用一个软max方法, 我会在本教程中解释, 我们将播放最后一个动作｡
所以我们开始吧｡
让我们进入函数, 实现所有这些｡
我们首先要讲的是我刚才提到的填充物｡
最大化软最大化的思想是我们每次都要尝试最好的动作, 但同时我们也要探索不同的动作｡
我们怎么才能做到呢？
我们如何才能在探索其他动作的同时获得最佳的动作？
我们使用了软最大值的概念, 它包括为每个Q值, Q状态行为,
生成一个概率分布｡
你知道, 我们对每个动作都有一个Q值｡
向左走, 直走或向右走｡
但此Q值还取决于输入状态｡
这就是你们看到的Q函数和直觉课｡
该Q函数是状态和动作的函数｡
因为我们这里有一个输入状态, 也就是这里的状态, 和三个可能的动作, 我们有三个｡
Q值｡
问：国家行动一｡
Q状态动作二和Q状态动作三｡
我们将生成一个关于这三个Q值的概率分布｡
也就是说, 第一个Q值有一个概率, 第二个Q值有一个概率,
第三个Q值有一个概率｡
这三个概率加起来等于1｡
所以我们将用软最大值来做这一切, 软最大值将把大概率归因于最高的Q值｡
这就是为什么self max的替代方法是简单的max, 直接取Q值的最大值｡
但在这种情况下, 我们不探索其他行动｡
多亏了这些概率, 我们可以用一个温度参数来探索其他地方, 我们很快就会看到｡
我们仍然可以通过配置此温度参数来探索它们｡
这就是为什么一般来说, 对于深度学习, 我强烈建议使用soft max而不是简单的arg max｡
好的, 我们来实现软最大化｡
因此, 正如你们所理解的,
由于Soft Max返回了三个可能行为的三个Q值中的每一个的概率, 那么, 我们要创建的第一个变量是probs, 当然是指这些概率｡
所以道具等于｡
现在我们来看看软极大函数｡
根据你的说法, 我们要从哪里拿呢？
好吧, 当然了｡
请记住, 我们导入了torch dot和dot功能子模块, 我提醒一下,
这是包含了实现神经网络的大多数操作的模块｡
我们给了它捷径｡
这就是我们要从这个函数子模块中得到的self max函数｡
但是因为我们给了它一个捷径f, 所以我们从一个F表示的泛函开始, 从这个泛函中我们得到软极大函数｡
在这里｡
这是第一个｡
和括号｡
好吧, 我会的
现在我们需要在这个self max函数中输入什么呢？
当然, 这就是我们想要生成概率分布的实体｡
这些实体是什么？
当然, 这些是Q值｡
现在的问题是, 我们如何得到Q值？
当然, Q值是神经网络的输出｡
为了得到这些神经网络的输出, 好了, 我们开始吧｡
我们需要神经网络｡
但事实上, 我们已经有了它, 因为这就是｡
在init函数中初始化我们创建了self点模型, 它就是我们的神经网络, 因为它是网络类的一个对象｡
所以这是完美的｡
我们可以把我们的模型放在这里, self max把这个模型应用到输入状态, 这是这里的参数,
它会返回我们要找的输出｡
这就是Q值｡
所以现在你的直觉, 为什么我们必须把这个模型引入到init函数中, 可能会更好｡
对于那些从面向对象编程开始的人来说, 你会看到这一切都会变得很自然｡
那么自我最大化｡
所以我们用self点模型, 因为这一定是我们在这里创建的对象的模型｡
但是我们需要得到神经网络模型的输出, 所以我们要在这里加上一些括号, 我们要在其中输入well,
这里的输入状态称为state｡
所以我们一开始要做的是进入状态, 但现在我们必须小心一些｡
现在状态看起来是一个简单的状态, 但记住状态实际上是一个火炬张量,
因为稍后我们会用这个无自态, 把它作为选择作用函数的自变量,
这里的状态自变量实际上会变成这个无自态｡
因为这是一个火炬张量, 模型会接受它, 所以没问题｡
但现在我们可以改进算法了｡
正如你所理解的, State是一个火炬张量｡
正如我们之前所说的, 大多数传感器都被包装到一个变量中, 这个变量也包含一个梯度｡
所以现在我们要做的第一件事就是把这个输入状态, 一个张量, 包装成一个火炬变量｡
但由于这是输入状态, 所以不会有什么区别｡
在计算中, 我们将不使用该状态向变量的梯度｡
所以我们现在要做的是, 把火炬张量状态, 转化成火炬变量｡
就像这样｡
但是, 为了说明, 我们不希望在PN模块的所有计算的图中出现梯度｡
我们在这里加一句, volatile等于true.
所以现在我们把火炬张量状态转化为火炬变量｡
但是由于这个volatile equals true参数,
我们不会把与这个输入状态相关的梯度包括到模块的所有计算的图中｡
这是另一个技术诀窍｡
这将为我们节省一些内存, 从而提高性能｡
所以我强烈建议你这样做, 现在我们要添加一些更有趣的东西｡
它是关于我刚才提到的温度参数｡
所以这个温度参数是一个参数, 它可以让我们调整神经网络如何确定它应该决定采取什么行动｡
所以这个温度参数会是一个正数, 它越接近零, 神经网络在玩一个动作时就越不确定｡
而这个温度参数越高, 神经网络就越能确定它决定要采取的行动｡
为了添加此参数, 我将输出（即cue值）乘以此温度参数｡
比如说, 从7开始, 我在这里指定一个小注释T等于7.
这就是我设置的温度参数, 等于7｡
我们会尝试其他的, 但我只想从一个小的开始, 因为你会看到这个小的.
我们的车还是会像昆虫一样｡
但是通过增加这个温度参数, 我们的代码看起来会更像一辆汽车｡
此外, 电池驱动会更好｡
这是有意义的, 因为温度参数越高, Q值获胜的概率就越高｡
因为, 例如, 如果我们有Q值的软最大值, 让我们取一些简单的数字｡
一, 二, 三, 一, 二, 三
例如, 如果1到3的填充最大值等于0｡ 04, oh点11和0｡ 85.
然后再升高温度, 现在温度等于1.
通过取一个更高的温度, 比如说, 2｡
太软了｡
我们把这个复制一下, 然后乘以｡
例如, 两个或三个填充的Mac具有相同的Q值, 但乘以此温度参数3｡
我们会得到第一个Q值为零的结果, 因为这个概率非常低｡
所以第二个概率是0, 然后是很小的, 因为这个概率还是很低的.
比如说, 0｡
但是第三个概率是最大的, 也是相当高的,
通过提高温度, 这个概率会更大因为我们会更确定这是对应于我们必须采取的行动的正确Q值.
因此这将是一个类似于98点的数字｡
现在通过增加温度参数,
我们现在更加确定第三个动作应该是要进行的动作, 因为这个动作的Q值的概率不仅是最大的, 而且非常高｡
这就是这个温度参数的意义所在｡
这是关于我们应该决定采取哪种行动的确定性｡
好吧, 我会的
所以我要删除这条评论｡
这只是解释｡
现在开始行动吧｡
那我们要怎么做呢？
软最大值法的原理不仅是为每个Q值生成一个概率分布, 而且这是软最大值法的第二步｡
我们从这个分布中随机抽取一个, 以获得我们的最终行动｡
当然, 我们将有很大的机会得到对应于具有最高概率的Q值的动作,
因为这正是分布的工作原理｡
好了, 我们走吧｡
我们开始行动吧｡
所以我们要引入一个新的变量, 我们称之为动作｡
这个动作是随机抽取我们之前在这条线上创建的概率分布｡
那么, 我们如何获得这样一个随机抽奖呢？
我们要计算每个Q值的概率｡
我们先取props, 然后取点, 然后我们使用多名义函数,
这样我们给予可以从props分布中随机抽取｡
就这样了
这就是我们行动的动力｡
好极了｡
当然, 现在我们要返回这个动作, 这里有一个小技巧｡
事实上, 这个支持multiannual返回pytorch变量, 带有一个假的批,
你知道这个假的维对应于批, 因此要得到我们想要的正确结果,
那就是操作01或02｡
我们只需要在这里加上数据, 然后加上一些括号, 我们要找的动作, 01或02,
包含在索引中｡
好吧, 我会的
好了
现在我们有我们的行动｡
多亏了这个选择动作功能, AI现在可以知道每次要玩哪个动作｡
好极了｡
现在我们可以继续下一个函数, 也就是学习函数｡
我们将在这里训练整个神经网络, 使用所有的前向传播,
然后使用随机梯度下降法进行反向传播｡
嗯, 基本上我们将实施深度学习模型的整个训练, 这是我们人工智能的核心｡
所以我等不及要这么做了｡
这将是一个令人兴奋的教程, 所以我会在下一个教程中看到你｡
在那之前, 好好享受吧｡
一､