大家好, 欢迎学习本Python教程｡
好了, 现在我们要实现的下一个功能是,
我们将训练人工智能内部的深层神经网络｡
基本上, 我们将执行前向传播和后向传播的整个过程, 这样我们将获得输出,
我们将获得目标｡
我们将把输出与目标进行比较, 以计算最后的误差｡
然后我们将最后一个误差反向传播到神经网络中｡
并使用随机梯度下降法, 根据权重对最小误差的贡献大小来更新权重｡
所以让我们来做这一切｡
对于那些上过深度学习课程的人来说, 这是小孩子的事情, 但是对于其他人, 不用担心,
我会再解释一遍｡
所以我们把这个新函数叫做learn｡
这个学习函数需要几个参数｡
首先自我当然会指不同类的对象｡
然后, 我们将把批处理状态作为当前状态, 然后是批处理的下一个状态, 然后是批处理奖励,
最后是批处理操作｡
那我们为什么要拿这个？
你大概认出是什么系列了吧？
当然, 这是一个转变, 马尔可夫决策过程的转变, 它是深度学习的基础｡
为什么我们都把它们分成几批呢？
好吧, 那是因为, 记住, 我们不考虑由一系列的跃迁产生的所有当前状态､
当前奖励和当前行动的最上层下一个状态｡
我们在这里创建了一些样品批次, 这要归功于sample函数｡
所以现在我们的过渡是在形式上的, 第一批是状态, 第二批是下一个日期,
一批是奖励, 一批是行动｡
这就是我们现在的过渡形式, 它们都很好地与时间对齐,
这要归功于我们在这里所做的关于第一维的连接｡
所以现在我们有了批次的转换, 每个状态对应一个批次, 下一个状态对应奖励和操作｡
我们之所以这么做是因为我们使用了这种经验回放的技巧, 这样我们的深层神经网络就可以学习到一些东西｡
请记住, 如果我们只有转换本身, 那么, 这将是一些即时学习｡
或者如果你想要一些非常短的记忆学习, 因此模型不会学习任何东西｡
因此, 我们必须从内存中取出这些批次, 这些批次将成为我们的转换,
然后最终我们将获得输入批次状态的每个状态的不同输出｡
我们将对批次状态和批次下一个状态执行此操作, 因为我们需要这两个状态来计算损失｡
我将很快提醒平衡方程, 这是深度学习算法的核心｡
现在, 让我们进入函数, 首先获取批处理状态的输出｡
所以我把第一个变量叫做输出｡
当然, 我们还要用我们的自我模型｡
所以自学模型是因为我们想得到我们的模型输出的输入状态的批处理状态｡
由于我们的模型实际上需要一批输入状态, 因此, 我们现在完全可以输入批状态作为模型的输入｡
这就是我们如何初始化进入网络的状态, 用火炬张量, 用这个假的维度｡
那就完美了｡
我们现在得到了模型的输出, 但接下来还有另一个技术技巧｡
如果我们只做self, 很好地为批处理状态建模, 我们将得到所有可能操作的输出, 你知道, 01和2｡
但那不是我们想要的｡
我们只对被选择的动作感兴趣, 那些由网络决定在每个时间播放的动作｡
所以要得到我们感兴趣的这些动作, 就是要把这些动作玩好｡
我们必须使用这个gather函数, 在其中输入一个, 因为我们只需要选择的操作｡
然后我们添加批处理操作, 我们每次都会收集批处理状态的每个输入状态的最佳操作.
我们只需要播放的动作, 选择的动作, 我们通过收集一个和批处理动作得到这个｡
但以后要小心｡
这里的批处理状态有一个与批处理相对应的伪维, 批处理操作没有返回它, 状态有吗？
因为我们在这里使用了条目, 但是我们没有在squeeze上使用任何操作｡
因此, 我们必须在此处添加它, 以使批处理操作与批处理状态具有完全相同的维度｡
所以我们要在挤压零点上加一个点｡
就在这里｡
实际上, 这不是零, 而是一, 因为零对应于国家的信念维度,
而一对应于行动的虚假维度｡
最后, 我们要做的最后一件事就是我们要用挤压的方法杀死这批假的｡
我们为什么要这么做？
因为现在我们脱离了神经网络｡
我们有自己的产出, 但我们不希望它们成批出现｡
我们希望它们是一个简单的张量, 一个简单的向量, 一个输出向量｡
批处理只是当我们在神经网络中工作时, 因为神经网络是期望把传感器的格式转换成批处理的｡
但现在我们有了自己的输出, 在下一个深度学习的平衡方程中, 我们不需要它们成为一批｡
所以我要杀了这批人｡
我正在摧毁这个假维度, 以恢复我们输出的简单形式｡
所以我在这里加, 点, 然后挤压｡
然后我自要杀掉那个假异次元空间相应的批了行动｡
因为这个伪维度的索引是1, 所以我在这里加一个.
好吧, 我会的
现在, 我们开始吧｡
我们有我们的输出, OC｡
我们有一个小小的警告｡
这是什么？
局部变量输出已分配但从未使用｡
没关系, 我会的
我们会很快用上它｡
这就是我们的输出｡
现在我们想得到下一个｡
输出｡
所以现在你可能会想, 为什么我们需要下一个输出？
为了理解这一点, 我们需要回到深度学习算法, 就在这里｡
这是逻辑手册的一部分｡
这就是整个深度学习的过程｡
一开始, 我们初始化所有的值, 然后每次｡
好了, 我们走吧｡
我们选择具有软最大值的动作｡
这就是我们对“选择操作”功能所做的｡
然后, 我们添加过渡, 然后, 如您所见, 我们得到预测, 我们得到目标,
我们计算损失｡
那么, 为什么我们还需要下一个输出呢？
那是因为目标｡
目标值等于伽马乘以下一次产出加上奖励, 我们将在那之后计算目标值｡
但是, 由于我们需要目标的下一个输出, 让我们先计算它｡
同样, 要获得下一个输出, 这非常简单｡
下一个输出将是我们的神经网络的结果, 当批处理下一个日期将其作为输入时｡
很简单, 我们用神经网络作为模型, 这次神经网络的输入是下一个日期的批次｡
下一批日期｡
但是现在, 请记住, 如果我们回到深度学习算法,
你可以看到, 下一个输出是下一个集合的队列值相对于所有动作的最大值｡
现在, 要获得下一个输出, 我们需要获得这些Q值中的最大值｡
因此, 我将在这里做一个分离,
分离模型的所有输出, 因为我们在这批下一个状态中有几个状态, 这批下一个状态是从内存的随机样本中提取的所有转换中的所有下一个状态｡
所以我使用detach函数分离所有的队列, 然后取所有队列值的最大值.
因为我们要取这些Q值中的最大值, 关于这个作用量, 我们必须指定它是关于这个作用量的｡
因为这个动作是用下标1来表示的, 我们必须把下标1放在这里, 然后我们必须指定, 我们要取,
t的Q值加上1, 这就是下一个状态｡
并且下一状态由索引零表示, 因为索引零对应于该状态｡
因此这里我们需要加上括号, 索引为零｡
这样, 我们根据索引1表示的所有动作, 得到索引0表示的下一个状态的Q值的最大值｡
现在完美了｡
我们得到下一个输出｡
这些都是新的状态｡
我们就是在那里得到警告的｡
但那没关系｡
我们现在就用它来计算目标｡
说到目标, 这是学习功能的下一步｡
好了, 我们走吧｡
目的相等｡
现在让我们回到我们的人工智能手册｡
目标等于奖励加伽玛的倍数｡
下一输出是根据动作的下一日期的Q值的最大值｡
好了, 我们走吧｡
让我们计算一下｡
所以那个等于self, 那个γ和self, 那个γ在这里被初始化它被引入｡
这是GQ和客体自我的一个变量, 它是伽马乘以下一个输出, 就像我们刚才说的, 再加上奖励,
也就是我们这里用的批奖励, 再加上批｡
奖赏｡
这就是记忆样本中的目标｡
伽玛乘以下一次的产出, 再加上奖励｡
好吧, 完美｡
现在我们有了输出｡
我们也有了目标｡
因此, 我们可以计算损失, 这个损失代表了预测的误差｡
所以我们称之为损失｡
TD损耗TD是时间差的损耗, 这也是CU学习的核心, 这个TD损耗将等于Huber损耗,
它大大改善了Q学习｡
这是我们为人工智能选择的最后一个功能｡
对于那些从深度学习课程中走出来的人来说, 如果你想实施深度学习, 这就是我推荐的损失｡
那么我们怎么才能得到这个Huber损失呢？
再一次, 我们要从F表示的函数模块中取一个函数.
因此, 这里我将使用我们的函数模块F dot和哈勃, 因为可以通过函数smooth
l one loss that one来获得, 所以按回车键, 这是我推荐的深度学习的最佳lost函数｡
它确实提高了Q学习, 但这是一个函数｡
所以我加了一些括号, 现在没有什么比输入我们的预测和目标更简单的了｡
所以预测当然是我们的输出, 因为这是神经网络的输出｡
你知道, 神经网络的输出就是神经网络预测的结果｡
这就是预测｡
第一个参数是输出｡
当然, 第二个论点是目标｡
我们想要得到的东西, 已经计算完美了, 我们可以直接输入目标完美, 现在我们有了损失｡
只是忘了一个小t在这里｡
我们走吧｡
现在警告应该消失了｡
是的, 完美｡
现在我们有了最后一个误差, 我们可以将这个误差反向传播到网络中, 用随机梯度下降法更新权重｡
而这正是我们下一步要做的｡
当然, 正如您可能猜到的, 现在我们要做的是使用优化器｡
我们的优化器, 我们在这里再次介绍, 我们初始化了它, 这是一个原子优化器, 它实际上是原子类的一个对象,
它已经拟合了我们模型的参数, 我们已经选择了学习率为0｡
1个百分点｡
如此完美, 我们的优化器已经准备就绪, 但现在我们需要将其应用于最后一个错误, 以执行随机梯度下降和数据权重｡
因此, 当使用PyTorch时, 我们需要做的第一件事是在每次循环迭代时重新初始化它｡
在随机梯度下降的循环中, 我们必须从一次迭代到另一次迭代重新初始化优化器,
并且在循环的每个持续时间重新初始化它｡
我们将使用下面的方法, 也就是零网格｡
现在开始, zero grid将在每次循环迭代时重新初始化优化器｡
那我们就别忘了括号｡
好极了｡
现在, 它已经被重新初始化, 我们可以使用优化器执行向后传播｡
我们该怎么做呢？
我们取TD损耗, 然后将其反向传播到网络中, 要将其反向传播到网络中,
我们需要使用反向函数｡
在这个向后的函数中, 我建议输入, 保留, 下划线变量, 并将其设置为true｡
我建议这样做, 因为这将改善反向传播｡
返回变量equals true的使用是为了释放一些内存, 我们需要释放内存因为我们会在丢失上做几次｡
这样肯定会提高训练成绩｡
最后, 该学习函数的最后一步是根据反向传播,
即根据权重对误差的贡献程度来更新权重｡
为此, 我们再次使用优化器, 该优化器已被初始化并重新初始化, 我们使用阶跃函数,
只需通过使用阶跃函数的这行代码, 即可更新权重｡
这是更新权重的代码行｡
这一行代码将错误反向传播到神经网络中, 并且这一行代码使用优化器更新权重｡
好了
我们有了学习神经网络｡
好吧, 我会的
所以恭喜你
这可能是所有深度学习模型中技术含量最高､ 难度最大的部分｡
我知道PyTorch有时候会很棘手, 用这些和挤压和挤压,
但最终我保证你会得到一个非常功能的神经网络, 因此深度学习模型, 并最终成为一个伟大的人工智能｡
现在让我们进入深度学习模型的下一步, 这将是更新函数, 当人工智能发现新的状态时,
它将进行更新｡
所以, 你知道, 它会发现新的状态, 然后它会收到奖励,
这取决于它刚刚玩的动作和这个新的状态｡
我们将在下一个教程中使用update函数来解决这个问题｡
在那之前, 好好享受吧｡
一､