大家好, 欢迎来到我们创造的超级激动人心的部分, 我们让它变聪明的部分｡
所以这就是训练人工智能时所发生的事情, 训练它的智能来达到我们希望它完成的目标｡
为了做到这一点, 我们将基本上训练神经网络输出正确的预测,
然后一切都已经准备好了, 因为这些来自大脑的输出信号已经有了正确的传输到身体, 以发挥最后的行动｡
所以基本上我们现在要做的是我们之前已经做过的事情｡
我们将从内存中随机取出一些批次, 从这些样本中获取输入,
获取输出, 获取目标, 获取预测,
计算预测和目标之间的最后一个区域, 然后使用随机梯度下降执行反向传播,
根据权重对最后一个误差的贡献程度来更新权重｡
所以让我们来做这一切｡
您将看到这是多么容易, 因为我们已经有了实现它的所有工具｡
我们不仅有PyTorch工具, 比如Optimizer和丢失的函数, 还有我们之前创建的所有类,
比如我们的大脑, 我们将用它来得到预测｡
然后我们的经验, 重放, 实现,
资格跟踪和所有这些工具结合到PyTorch工具将使训练超级性能, 因此最终我们将得到一个超级强大的人工智能｡
所以, 让我们来进行培训｡
让我们的人工智能变得更聪明｡
我们现在要做的第一件事是得到最后一个函数, 我们在训练过程中计算误差和优化器时会用到这个函数,
这是我们要做的第一件事｡
所以让我们为最后一个函数创建一个变量｡
我们称之为损失｡
这将等于来自RN模块的MSI损失函数｡
然后是MSI损失, 这是我们要使用的最后一个函数, 因为基本上我们的预测是Q值｡
我们在预测不同动作的Q值｡
因为这些都是真实的, 我们在做一些回归的神经网络,
最后一个函数是均方误差｡
这是最后一个我们通常用于回归的函数｡
好吧, 我会的
现在我们有了最后一个函数, 下面我们来看看优化器｡
这里的optimizer是我们为它创建的变量optimizer｡
我们要像往常一样｡
至于自动驾驶汽车, 原子优化器, 这是一个非常强大的优化器, 将创造奇迹的训练｡
让我们把它放到原子上｡
记住, 这是针对自动驾驶汽车的｡
我们必须输入两个基本参数｡
第一个是在优化器和神经网络的参数之间建立联系, 也就是说,
我们大脑神经元的权重｡
为了做到这一点, 我们用我们的大脑, 我们称之为CNN｡
那是我们为大脑创造的东西｡
所以CNN不记得参数｡
我们走吧｡
和一些括号｡
这就建立了优化器和人工智能大脑中神经元权重之间的联系｡
第二个参数是学习率, 它是由误差给出的.
所以这里我们必须取一个小的学习率因为我们不想收敛得太快, 我们想进行一些探索, 所以这里我们可以取一个很好的学习率,
就是0｡
01, 即打开1%｡
我想这和我们在自动驾驶汽车上用的是一样的｡
好了, 现在我们有了最后一个函数, 一个优化器｡
现在我们几乎可以开始完整的循环了｡
好吧, 实际上, 我们现在就开始整个循环｡
但是在我们开始之前, 我们要决定纪元的数量｡
我们将训练人工智能, 因此我在这里创建了一个新的变量, 它将与这个纪元的数量相对应｡
让我们把它设为100｡
这将是足够的方式来训练眼睛｡
我甚至敢打赌, 人工智能将设法达到最好的方式之前100, 像20或30｡
让我想想｡
但现在, 让我们拿100｡
如果我们需要, 我们会增加它｡
但我觉得没这个必要｡
好吧, 我会的
现在我们有了历元的数量, 我们可以开始让for循环成为训练的主要循环, 当我们在历元上训练时｡
所以迭代变量是epoch｡
这就是我们选择的新纪元｡
当然, 我们要用范围函数来表示, 我们要从第一个历元,
一个历元到若干个历元｡
加一, 因为记住, 范围的上限不包括在内｡
因此, 如果我们想增加到100, 我们必须指定一个盒子加一, 以增加到100｡
好吧, 科林.
现在让我们进入循环｡
好吧, 我会的
所以我们要做的第一件事是每十步跑200次｡
因此, 每个历元将是200次运行, 一次接一次, 每次10步｡
为了做到这一点, 我们从我们经验丰富的重放类中找到了这个运行步骤函数｡
因此, 使用这个函数,
它实际上是一个方法, 因为我们将从内存对象中获得它, 它是来自重放内存类的对象, 以生成这200个运行的10个步骤, 我们必须在其中使用内存对象｡
我提醒你我们在这里创造的｡
存储器是具有MN步骤的重放存储器类的对象, 即10个步骤和10, 000的容量｡
我们创建了这个对象, 并从这个对象中提取了井, 这个运行, 步骤, 函数,
运行步骤, 我们指定了200个连续的10个步骤的运行｡
因此, 在每个时期, 基本上运行200个步骤｡
现在, 我们在每个时期都运行了200个步骤, 那么, 是时候从这些运行中对一些批次进行采样了｡
并对这些批次进行取样｡
内存中还有另一个函数, 即sample batch,
它将从这200次运行中生成一些批处理｡
但请记住, 这些批次是一系列转变的时间批次｡
这是一系列的十个步骤, 而不是以前, 在那里的批次只是一些批次的单一过渡｡
这一次它们是十步, 十个过渡的批处理,
所以现在是时候从内存中得到这些随机批处理了, 为了得到它们, 我们使用了样本批处理函数, 我们必须对它应用批处理大小｡
对于批量, 我们可以选择32个甚至64个甚至128个｡
请记住, 对于批量大小, 这是一种常见的做法｡
[ 32]这就是在进行批处理学习时, 在神经网络架构中通常会看到的情况｡
但这次完全不同｡
我们只是对10个步骤的一些批次进行抽样, 因此最好采用更大规模的批次｡
所以我们可以选择64或128｡
所以我们选128号｡
实际上, 这是一个四循环, 因为我们要处理几个批处理,
我们把它们放入这个批处理函数的返回值中.
所以这个for循环, for batch in memory, sample,
batch, 128意味着每128步, 我们的内存会给予我们一个大小为128的批, 它实际上包含了刚刚运行的最后128步｡
我们只是得到了一些128号的批次, 学习将在这些批次上发生｡
此外, 在这些批次中, 我们将有资格, 跟踪运行, 你知道,
学习每十步｡
好吧, 我会的
现在在这个循环中, 它仍然在一个时期内发生, 但现在我们在一个特定的批处理中｡
现在我们要做的第一件事就是分别获取输入和目标｡
就像我告诉你的, 这很简单｡
我们可以使用我们实现的工具之一, 即资格跟踪来实现这一点｡
正如您在此处所看到的, 此资格跟踪函数将一个批处理作为输入, 现在我们有了作为输出的批处理和返回､
输入和目标｡
现在我们要做的就是创建两个新的变量, 分别作为输入和目标,
然后输入到达目标.
相等｡
此资格跟踪函数的返回内容完全适用于批｡
因此, 我们将把这个函数应用到循环的批处理中｡
所以我们要做的只是资格｡
应用于循环批处理的跟踪｡
好的, 这样我们就有了输入和目标｡
但在PyTorch中, 总有更多的事情我们必须做｡
当然, 这是把神经网络的输入和目标转换成一些折磨变量, 但没有释放｡
没有什么新鲜事｡
我们知道怎么做｡
我们可以这样做｡
我们取输入值, 然后取目标值, 它们等于可变输入值｡
这是输入和可变目标, 这是目标｡
好吧, 我会的
因此, 大脑的输入被转换成一些火炬变量, 目标也被转换成一些火炬变量｡
现在我们可以把输入输入到神经网络中｡
我们为什么要这么做？
这是因为下一步是获得我们所拥有的预测, 我们必须针对的输入｡
当然, 现在我们需要预测, 因为接下来我们要计算预测和目标之间的损失｡
所以让我们来看看这些预测｡
好吧, 再说一次, 这太简单了｡
现在我们只需要把我们的大脑, 也就是CNN, 我们的卷积神经网络, 应用到我们的输入中｡
我们走吧｡
输入进入神经网络, 神经网络将输出预测｡
好极了｡
所以现在我们有了预测, 我们有了目标, 这样我们就可以得到损失｡
这就是下一步｡
我们要引入一个新变量, 因为现在我们要得到最后一个错误, 这和最后一个函数不同,
因为我们用最后一个函数来得到最后一个错误.
所以这里的误差更小, 我们可以用最后一个函数来预测｡
还有目标｡
我们走吧｡
现在一切都很顺利｡
一切都合乎逻辑｡
我们先输入目标｡
然后, 由于输入, 我们得到了预测｡
多亏了预测和目标, 我们得到了更少的误差｡
所以非常逻辑和顺利｡
那么现在下一步该怎么办呢？
同样的逻辑路径｡
现在我们有了最后一个可以返回的值, 将这个较小的误差传播回神经网络以更新权重｡
我们用随机梯度下降法来实现, 为了执行随机梯度下降法, 我们需要优化器,
但我们已经有了, 我们的原子优化器｡
但现在, 记住我们要做的｡
我们必须对它进行初始化｡
请记住, 我们使用优化器对象, 然后应用零网格方法｡
那我们走吧｡
我们不会忘记初始化它的括号｡
现在, 下一步是将最后一个误差反向传播到神经网络中｡
为了做到这一点, 我们取最后一个误差, 并对其应用向后的方法｡
这就是应用反向传播｡
最后, 最后一个误差已经传播到新的网络中, 我们可以用随机梯度下降法来更新权重｡
要做到这一点, 请记住, 我们使用优化器, 然后应用此步骤方法｡
我们走吧｡
现在, 权重已更新｡
正如我告诉你的, 我们不仅已经做到了, 而且现在看起来如此简单, 如此自然｡
所以现在我们要做点有趣的事｡
我们将打印每个纪元的平均奖励, 这样我们就可以跟踪人工智能的进展, 以及训练的进展｡
我们希望看到平均报酬随着时代的发展而增加｡
当然, 一开始是探索阶段｡
因此, 平均奖励可能在开始时不会增加,
但一旦进入开发阶段, 我们就会看到平均奖励肯定会增加, 而且会增加到一定水平, 也就是它尽快到达背心的时候｡
我们从指纹开始吧｡
你知道, 我们在一个历元中做这个,
所以我们必须回到这里的循环, 然后我们要先打印一个历元, 一个列, 然后是百分比, 因为我们要把所有的东西都转换成一个更好的字符串｡
然后我们再加上平均奖励｡
然后再加上百分比｡
然后, 我们将结束报价｡
然后再加上一个百分比｡
在另一边, 我们输入变量,
就是第一个人, 这里是EPC, 第二个变量对应的是平均报酬, 我们现在就来计算.
所以平均报酬变量还不存在｡
我们现在就去创建它｡
所以我们要用STR历元｡
即使epoch是一个数字, 我们也会将其转换为字符串｡
这样更好｡
我们要加一颗星星, 可以是平均奖励｡
我们将创建一个变量, 称为VG奖励, 现在我们将创建此变量并计算它｡
所以我们开始吧｡
那是我们唯一要做的事了
所以我们已经有了一个时代
现在我们来计算平均报酬, 我们需要在这里计算｡
仍然在循环中, 但不在批处理循环中, 因为现在我们对批处理进行了采样, 并且在批处理中进行了训练｡
但现在, 正向传播和反向传播是在批处理中完成的｡
现在我们回到epoch循环, 我们可以计算累积奖励, 这可以用我们的end step对象来完成,
因为我们的end step对象包含这个函数｡
我们可以在步骤运行过程中获得累积奖励｡
所以我们现在要用它来更新步骤的新奖励,
然后我们会更新移动平均线对象, 把累积奖励加到移动平均线对象上, 然后重新计算平均值｡
这就是我们获得平均奖励的方法｡
所以我们开始吧｡
我们首先需要的是更新的奖励｡
所以我们称之为奖励｡
脚步声｡
然后, 正如我们所说, 我们采取PN步骤｡
在此处创建的提醒对象是我们的经验重放文件中PN Step Progress类的对象, 因此PN
Steps对象｡
然后, 我们添加奖励步骤, 然后一些括号｡
好的, 这样我们就可以得到新的累积奖励了｡
好的, 但是我们需要把这些新的累积奖励加到我们的移动平均线对象中｡
要做到这一点, 我们有一个方法, 这次在移动平均类中, 就是这个ADD方法｡
所以这很简单｡
我们以移动平均线为对象, 这里创建了100个步长,
然后我们将使用ADD方法, 然后在广告方法中, 我们输入奖励步长, 这将把步长的奖励添加到移动平均线中｡
好吧, 我会的
最后, 我们可以计算平均奖励, 这是, 你知道, 这是相同的变量在这里｡
所以这就是平均报酬｡
为了得到它, 我们只需要用移动平均对象的平均方法｡
我们做点平均, 因为我们的移动平均线已经更新了新的奖励步骤, 我们刚刚增加了感谢添加方法｡
好极了｡
现在我们有了平均奖励, 这样我们就能在这里繁殖了｡
这将在每一个纪元被印刷｡
好吧, 我会的
所以我们结束了｡
所以我很期待看到结果｡
事实上, 在下一个教程中, 我会在观看结果的同时给你们一个惊喜｡
所以这将是非常令人兴奋的｡
所以现在我想是时候和人工智能一起玩了｡
好吧, 那就给自己准备一杯好咖啡或好茶｡
现在是时候舒舒服服地坐在椅子上, 观看一些非常酷的视频, 我们的人工智能玩厄运｡
所以我们在下一个教程中做这个｡
在那之前, 好好享受吧｡
一､