在 A3C 中,有几个子进程和一个主进程。子进程计算损失和反向传播,如果我理解正确,主进程将它们汇总并更新参数。
但我想知道我应该如何决定要实现的子进程的数量。我认为子进程越多,解开样本之间的相关性越好,但我不确定设置大量子进程有什么弊端。
可能子进程越多,梯度的方差越大,导致学习的不稳定?还是有其他原因?
最后,我应该如何决定子进程的数量?
在 A3C 中,有几个子进程和一个主进程。子进程计算损失和反向传播,如果我理解正确,主进程将它们汇总并更新参数。
但我想知道我应该如何决定要实现的子进程的数量。我认为子进程越多,解开样本之间的相关性越好,但我不确定设置大量子进程有什么弊端。
可能子进程越多,梯度的方差越大,导致学习的不稳定?还是有其他原因?
最后,我应该如何决定子进程的数量?
子进程的正确数量取决于您可用的硬件。
简化一点,子进程可以处于两种状态之一:等待内存或磁盘访问,或正在运行。
如果您的问题非常适合您的计算机内存,那么进程将花费几乎所有时间运行。如果它对内存来说太大,他们将需要定期等待磁盘。
每个 CPU 核心应该使用大约 1 个子进程。如果您在 GPU 上进行训练,则取决于该进程是否可以一次使用整个 GPU(在这种情况下,只使用 1 个),或者“进程”是否真的更像一个 CUDA 线程(其中如果您希望每个 CUDA 核心有一个)。
如果您认为您的进程将等待磁盘,请为每个内核使用多个。大约增加 50% 是一个很好的起点。您可以使用top之类的程序来监控 CPU 使用率并相应地调整进程数。
要更明确地回答您的问题: