我试图用this tutorial在C ++中实现A2C神经网络。我只能找到Python教程,这个Python教程对我来说最有意义。
我已经实现了常规的反向传播神经网络,但是,我想升级它以使用强化学习。我已经创建了Pytorch Tensor
的C ++版本以及完成此任务所需的大多数其他事情。我在实施他们的Variable
课程时遇到了问题。我已阅读docs并使用链规则了解automatic differentiation的概念,但我不确定如何将Tensor
转换为Variable
我需要在幕后发生什么。我甚至可能已经使用我原来的backprop神经网络实现了所有必要的梯度数学。
尝试破译Python代码非常困难(我没有Python背景),特别是因为我不得不猜测复杂变量的类型(Variable
vs Tensor
vs Vector
等)。例如,我不理解行total_loss.backward()
(本教程的In [4]:
部分)。 total_loss
不是双重(或浮动)吗?我mean()
的{{1}}函数返回表示整个Tensor
的平均值的单个值。 Tensor
只是对浮点数或双精度数进行的简单操作。但是,它会调用total_loss
。我找到了三个backward()
但不确定哪一个,因为在上下文中没有任何意义。 torch.autograd.backward
,torch.autograd.Function.backward
和torch.autograd.Variable.backward
。这些都没有意义,因为backward
是双重的,对吗?
另一个缺失的步骤是"前进"和"落后"传递实现。教程说Pytorch为我做了向后传递,但是因为我在C ++中,我需要自己做这个实现,而且我不太确定不同传递的目的。这些是神经网络的前馈和后向传播吗?
我也对total_loss
以及它如何进行随机优化感到困惑。我也在阅读docs,但我仍然不确定如何转换为C ++。我知道它是基于低阶矩的自适应估计的随机目标函数的一阶梯度优化。
根据我过去几周所研究的内容,我需要创建一个张量的前向累积计算图作为节点,在张量数据上执行链规则,以便修复因变量来计算相关的导数。递归地在节点上的每个子表达式。然后,使用任意标量值函数(它们是神经网络激活函数?)的自动微分来传播通过树并产生相应的梯度。链规则区分图形,每个节点将保存w.r.t值和创建它的函数。
我认为我对大多数实现的概念都很好,但是如何进行编程是一件很困难的事情,因为我不能完全理解Python的交互工作是如何工作的。
我还研究了optim
的实施情况如何在Pytorch source中查看并阅读examples section中的示例,但我仍然在努力理解实施情况。
总之(因此它没有被标记为太宽泛),我需要了解有关Pytorch Variable
的详细信息,以便在C ++中实现,假设自动区分的概念是明白了吗?是否只需要为渐变和函数指针保持一个双重激活?另外,Python中的Variable
如何工作并传递?这样我就可以理解如何实现Adam算法。
如果您需要查看我已经拥有的代码,我可以发布一些代码,但当前选择的不是因为我已编写的代码并不一定与我的问题直接相关。