在这里,他们提到需要optim.zero_grad()在训练时将参数梯度归零。我的问题是:我也可以这样做吗net.zero_grad(),会产生同样的效果吗?还是有必要做 optim.zero_grad()。此外,如果我两者都做会发生什么?如果我什么都不做,那么梯度就会累积,但这究竟是什么意思?他们会被添加吗?换句话说,doingoptim.zero_grad()和net.zero_grad(). 我问是因为在这里,他们使用第 115 行net.zero_grad(),这是我第一次看到,这是强化学习算法的实现,其中必须特别小心梯度,因为有多个网络和梯度,所以我假设他们有理由这样做net.zero_grad()而不是optim.zero_grad()。
要计算的数量是log(k!),其中k可以是 4000 甚至更高,但当然日志会补偿。我尝试过计算,sum(log(k))结果是一样的。
因此,我得到了一个包含整数的大数组,我想有效地计算sum(log(k))。这是我的尝试:
integers = np.asarray([435, 535, 242,])
score = np.sum(np.log(np.arange(1,integers+1)))
Run Code Online (Sandbox Code Playgroud)
这是可行的,除了np.arange会为每个整数生成一个不同大小的数组,所以当我运行它时,它会给我一个错误(正如它应该的那样)。
这个问题可以通过for循环轻松解决,如下所示:
scores = []
for i in range(integers.shape[0]):
score = np.sum(np.log(np.arange(1,integer[i]+1)))
scores.append(score)
Run Code Online (Sandbox Code Playgroud)
但这太慢了。我的实际integers值有数百万需要计算。
是否有一个基本上不需要 for 循环的有效实现?我正在考虑一个lambda函数或类似的东西,但我不太确定如何应用它。任何帮助表示赞赏!