Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyTorch多处理:ACER实现是否正确移动渐变?_Python_Multithreading_Pytorch_Python Multiprocessing_Reinforcement Learning - Fatal编程技术网

Python PyTorch多处理:ACER实现是否正确移动渐变?

Python PyTorch多处理:ACER实现是否正确移动渐变?,python,multithreading,pytorch,python-multiprocessing,reinforcement-learning,Python,Multithreading,Pytorch,Python Multiprocessing,Reinforcement Learning,我正在实现ACER体系结构,它像A3C一样执行异步参数更新。查看现有的PyTorch实现,我经常看到参数更新是按如下方式执行的 #将渐变从特定于线程的模型转移到共享模型 定义(def)将(grads)转换为(shared)模型(model,shared)模型: 对于param,zip中的shared_param(model.parameters(),shared_model.parameters()): 如果shared_param.grad不是None: 返回 共享参数。参数梯度=参数梯度

我正在实现ACER体系结构,它像A3C一样执行异步参数更新。查看现有的PyTorch实现,我经常看到参数更新是按如下方式执行的

#将渐变从特定于线程的模型转移到共享模型
定义(def)将(grads)转换为(shared)模型(model,shared)模型:
对于param,zip中的shared_param(model.parameters(),shared_model.parameters()):
如果shared_param.grad不是None:
返回
共享参数。参数梯度=参数梯度
我理解,如果shared_param.grad不是None,则意味着另一个线程向模型添加了渐变,因此我们返回不覆盖它

我的问题是:

  • 这样我们就“扔掉”了一些计算出的梯度,对吗

  • 为什么在更新共享模型参数时不使用锁定机制?这样可以避免两个线程同时更新参数。由于线程大部分时间都在环境中执行步骤并更新本地模型,因此在共享模型更新上添加锁可能对性能的影响可以忽略不计。我说的对吗?如果是,为什么在实践中不这样做

  • 如果一个线程调用共享_模型上的
    optimizer.step()
    ,而另一个线程正在向其复制渐变,会发生什么情况

我发现的另一个实现是这样做的:

def copy_gradients_from(模型、共享模型):
对于shared_参数,zip中的参数(shared_model.parameters(),model.parameters()):
共享参数。\u grad=parameter.grad
它不检查现有渐变,也在没有任何
锁定机制的情况下调用