大家好, 欢迎学习本教程｡
好的, 在之前的教程中, 我们制作了大脑, 或者如果你想要a3c的大脑,
现在我们需要训练这个大脑｡
但为了训练这些大脑, 我们需要一个优化器｡
这两个函数将用于随机梯度下降,
根据它们对预测和目标之间误差的贡献程度来更新权重｡ 到目前为止,
我们在第一个和第二个模块中使用了原子优化器, 并在训练中使用了火炬｡
但正如我告诉你的, 我们正在处理一个非常具有挑战性的问题, 即突破和a3c算法本身是不足以解决这个问题｡
我们需要一些定制的优化器和很多不同的技巧来解决这个问题, 而不等待年龄｡
这就是这样做的目的, 这就是为什么我们有一个基于原子优化器的单独的自定义优化器,
它包含在这个共享的原子类中｡
为什么共享原子？
这是因为它实际上是原子优化器, 但它将在共享状态上工作｡
因此, 我们将在本教程中解释它的工作原理｡
因此, 我们将在这里介绍不同的函数, 但不对它们进行编码,
因为我们希望为下一次实现保留一些能量｡
这是火车, PI文件, 将采取超过100行代码｡
所以要做好准备｡
所以我们会在一个教程里, 来解释这是怎么回事｡
我们现在就开始吧｡
好吧, 我会的
首先, 我们介绍这个类的共享项, 它包含三个函数：init函数,
共享内存函数和step函数｡
我们首先要做的是从atom继承, 这个atom当然是atom优化器, 我们从Optim模块,
从torch库中获得｡
因此, 这里我们应用继承来获得所有与原子优化器相关的工具｡
然后我们从init函数开始｡
那么这里发生了什么？
首先, 我们使用一个超级函数来继承所有的工具和原子类的所有基本参数｡
这些基本参数在这里是params, 学习率, beta, epsilon和权重衰减｡
然后我们开始一个for循环, 第一个for循环, for group in self.
参数组｡
那么首先, 什么是params组？
参数化组的Self包含优化程序的所有属性｡
在这些属性中, 我们有一些参数需要优化｡
我们要优化的这些参数是包含在self dot params groups
params中的网络权重｡
好了, 我们走吧｡
组属于参数化组的自身｡
这里我们有第二个for循环, 它将得到我们想要优化的参数,
这些参数正好包含在self点参数组params中｡
基本上, 我们将遍历包含所有参数的self参数组, 对于self点参数组中的每组参数,
我们将遍历要优化的参数｡
因此, 这里的group params中的p表示我们想要优化的每个传感器的权重｡
所以对于每个我们想要优化的权重张量｡
然后在这个循环中, 这四行代码会发生什么？
基本上, Atom Optimizer所做的更新是基于梯度的指数移动平均值｡
这就是这行代码｡
这是矩梯度的指数移动平均值, 一阶的｡
但Atom所做的更新不仅基于此, 它还基于梯度平方根的指数移动平均值｡
这是一个指数移动平均值, 它的移动梯度是2或2｡
这是一阶指数移动平均数, 这是二阶指数移动平均数,
梯度的EMA.
如果你想更深入地了解指数移动平均线是如何工作的, 我强烈建议你看看这篇研究论文, 亚当,
随机优化的一种方法, 因为基本上我们现在实现的原子优化器就是基于这里的算法一｡
因此, 如果您想了解算法如何工作的更多细节, 那么, 本文肯定会有所帮助｡
然后你会对原子更新规则的算法做一些进一步的解释｡
所以, 你知道, 只有当你想在攻击我们之后要做的大火车功能之前攻击这个功能的时候｡
好了, 让我们回到Python, 现在我们来看看第二个函数, 共享内存｡
所以现在我只想说几句话｡
这种共享内存功能的概念有点像Cuda的张量, CUDA是一种基于GPU的加速器｡
所以基本上这里发生的是, 我们有这些状态的传感器, 这些状态共享这里的记忆, 这里和这里的记忆,
它们的行为有点像张量, 也就是Cuda｡
所以, 你知道, 加速计算｡
但不同的是, 这里的张量是共享内存, 将计算发送到GPU或CPU的一部分,
所有瘫痪的线程都可以访问｡
这基本上就是它在这里所做的｡
这有点像张量Cuda, 但它只发送到GPU或CPU的一部分, 可供并行线线程访问｡
好吧, 我会的
然后是最后一个函数步骤｡
这个函数, 就像我们在本课程中使用过的原子优化器的单步方法｡
同样, 这是基于算法的, 我们之前看到的同一篇论文｡
所以这个算法｡
所以, 如果你想详细理解下面的代码行, 那么,
我再次鼓励你看一下本文中的算法｡
此外, 这里所做的并不是强制性的, 因为这实际上是对优化后的原子类的step方法的复制粘贴｡
那么这里基本上做了什么呢？
我们可以通过使用继承来完成, 因为这里我们继承自优化的原子｡
为了更好地使用继承, 我们可以做的, 而不是做这些, 我在这里写注释.
它只是使用我们应用于共享的超级函数｡
原子类然后是对象self｡
这里我们只需要加上一个带括号的步骤｡
Step是优化的item类的方法, 这是完全相同的｡
这就是为什么我刚才说这里只是一个复制粘贴的Optim原子类的step方法｡
所以我认为如果你用这个超级函数来代替, 共享原子和单步方法, 我们可能会得到完全一样的结果｡
好吧, 我会的
所以快速浏览一下很有意思｡
基本上, 您可以将其视为原子优化器｡
好像我们对它有了更深入的了解｡
但是, 如果你想了解更多细节, 如果你想了解幕后发生了什么,
那么, 我鼓励你看看这篇研究论文｡
我会把链接在评论这里｡
你知道, 记住, 你会有所有的代码注释在很大的细节｡
所以如果你能看一下就好了｡
现在我希望你们有很大的精力, 因为我们将继续学习训练文件, 它将包含这个巨大的训练函数, 它将基本上训练我们的大脑,
现在我们可以这样做, 因为我们有了优化器｡
所以现在好好休息, 好好睡一觉｡
无论何时, 只要你感觉状态良好, 我们就进入下一步｡
在那之前, 好好享受吧｡
一､