大家好, 欢迎学习本Python教程｡
所以我们开始吧｡
让我们创建一个for循环, 从右边开始, 到左边｡
要做到这一点, 我们要加上四个｡
所以这次, 迭代变量将是我们的步长, 因为我们将从最后一步,
到一系列转换的第一步, 依此类推｡
现在从右到左的技巧是用四个步骤, 反向, 反向.
现在我们只需要输入一个序列｡
这一系列当然是我们的系列｡
所以我们输入我们的数列｡
但正如你在报纸上看到的, 我们从T-1到T-1开始｡
所以我们不从最后一步开始｡
这是终端状态, 但在此之前的状态, 也就是t减1｡
但两个开始那是第一步｡
所以这里不是从最后一个状态开始而是从之前的状态开始, 我们需要在括号里加上, 列减一｡
我敢肯定, 对于那些学过机器和深度学习课程的人来说,
你知道, 这个技巧, 科林, 减一, 意味着你要去最后一个元素之前的元素, 但不是最后一个元素｡
因此我们得到了我们想要的序列｡
我们要从最后一个元素之前的元素到第一个元素, 然后我们做一些相反的事情, 从右到左｡
好吧, 我会的
所以我们准备进入完整循环｡
在这个for循环里, 我们要做什么呢？
好吧, 我们要完全按照报纸上说的做｡
我们将更新累积奖励, 方法是将它乘以Gamma, 再加上在for循环的当前步骤中获得的奖励.
好了, 让我们回到Python｡
所以我们想更新我们的累积奖励, 如下所示｡
倍增｡
再见珍玛｡
我们走吧｡
这里我们把它乘以Gemma｡
然后我们要加上的奖励｡
我们可以通过这种特殊的结构来访问的步骤｡
请记住, 奖励是步骤对象的一个属性｡
所以在这里, 当然, 我们加一个加号｡
好吧, 我会的
所以累积奖励等于我们现在所处步骤的奖励, 循环加上伽马次数, 即更新前的累积奖励｡
好极了｡
所以现在我想我们没事了｡
我们完全按照算法来做｡
现在是采取下一步行动的时候了｡
好吧, 现在这将变得相当容易｡
我们回到第一个for循环, 因为这个for循环只是为了计算从右到左的累积奖励知道, 按照这个算法,
通过这样的方式更新｡
现在, 大家还记得, 做这一切的目的是准备好我们的输入和目标,
这样我们就可以在训练中最小化两者之间的平方差｡
所以现在, 我们唯一要做的就是准备好这些输入和目标｡
所以我们先做这个｡
我们需要做的是在输入列表中添加序列的第一个状态｡
到目前为止, 这个输入状态是在这个输入变量中, 但那只是为了计算输出｡
所以我们将单独获取第一步的输入状态, 因为这正是我们需要在输入列表中添加的内容｡
所以我们分开来看｡
因此, 我们称之为状态｡
和这里完全一样｡
我们可以这样得到它, 取序列的第一个索引, 它包含了第一个转换, 然后加上这个状态,
得到第一个转换的状态｡
所以这就是我们需要的东西｡
我们将分别得到与第一次转换的输入状态相关联的目标｡
所以我在这里引入了一个新的变量, 目标, 它等于第一步的Q值｡
并且由于Q值由神经网络返回, 因此它包含在输出中｡
因为输出是与输入相关联的输出,
它包含了跃迁的第一个元素, 我们可以通过取这里的输出和索引0来得到第一个状态的Q值｡
然后, 我们添加点数据, 它将简单地得到第一次跃迁的输入状态的Q值｡
而这正是目标Q值｡
所以我们才要拿走它｡
然后, 我们将更新此目标变量, 但仅针对在该系列的第一步中选择的操作｡
为了得到这个级数的第一步, 我们需要取第一个级数0因为这正是级数0的第一步｡
并且访问与该系列的第一步骤相对应的动作｡
嗯, 我们需要在这里补充一下｡
小点动静｡
这就是我们使用的属性结构｡
动作是系列的第一个步骤的属性｡
这是这个系列的第一个转变, 因为这个系列的每个转变都有如下的结构, 状态动作, 奖励,
以及在这里完成的动作｡
这里的属性action意味着我们只是获取第一次约会的动作｡
因此, 第一步的具体行动的目标正是需要通过累积奖励来更新的｡
基本上我们在这里写的是, 在这个系列的第一步中,
与动作相关的目标就是我们刚刚计算的累积奖励.
好吧, 我会的
现在我们终于准备好更新输入了, 在这里添加第一个输入状态, 在这里添加第一个目标｡
对于第一步, 我们只需要更新序列的第一步, 因为, 你知道,
我们训练眼睛十步, 因此输入是十步中的第一步｡
我们在第一步就得到了目标,
但是我们不需要在接下来的十步中得到任何输入或目标, 因为基本上学习是在十步之后进行的｡
这就是为什么现在我们只得到了这个系列的第一步的状态和目标｡
所以理解这点很重要｡
因此, 如果我们明白了这一点, 那么现在我们明白了,
我们必须把它们输入到我们的输入列表和目标列表中｡
所以我们先做这个｡
让我们将状态附加到输入中｡
所以我们取输入列表, 用append函数添加状态, 它记住了序列第一步的输入状态｡
然后, 我们将第一步的目标追加到目标列表中｡
为此, 我们使用目标列表, 同样, 我们使用append函数来添加第一个目标｡
我们走吧｡
快好了
现在我们需要归还最后的东西, 当然, 这是我们所需要的｡
这就是我们在本教程开始时所说的｡
现在更新的输入和目标｡
所以我们要在这里加上return｡
然后我们要先得到我们的输入｡
但那是一样的｡
我们需要先把它们转换成一个numpy数组, 然后做一个类型转换,
以确保我们有一个单一的类型, 其中D类型等于, P类型等于, 浮点数为30｡
然后我们把它转换成火炬张量, 因为我们使用的是PyTorch, 所以这是强制性的｡
所以我用的是NumPy的手电筒
功能又恢复了｡
这就是我们的投入｡
好极了｡
现在让我们对目标做同样的事情｡
现在我们要使用这个技巧, 它更快｡
我们要把目标堆在一起｡
要做到这一点, 我们首先需要我们的torch库, 因为我们将使用stack函数by
torch来堆叠目标｡
好吧, 我会的
所以这行代码基本上返回了输入和目标, 我们刚刚通过这个资格跟踪源算法更新了它,
或者我们可以称之为分步学习｡
现在, 恭喜你,
我们准备好进行最后的训练了, 因为基本上, 训练包括最小化输入预测值和目标值之间的平方差｡
所以让我们的人工智能变得更聪明｡
它将在下一个教程中变得智能｡
所以在那之前, 好好享受我｡