我已经初始化了两个张量(矩阵):
sm=Var(torch.randn(20,1),requires_grad=True)
sm = torch.mm(sm,sm.t())
freq_m=Var(torch.randn(12,20),requires_grad=True)
我正在根据这两个矩阵中的数据创建两个列表,并且正在使用spearmanr获取这两个列表之间的相关值。我如何创建列表并不重要,但目标是调整矩阵内的值,以使计算出的相关值尽可能接近1。
如果要手动解决此问题,我将每次将矩阵中的值调整0.01(或一些小数字),然后重新计算列表和相关分数。如果新的相关值高于上一个,我将保存2个矩阵并调整一个不同的值,直到获得2个可以给我最高相关分数的矩阵。
PyTorch是否可以自动执行此操作?我知道PyTorch可以根据方程式进行调整,但是我想调整矩阵值的方式并不针对方程式,而是针对我计算的相关值。对此的任何指导将不胜感激!
Pytorch有一个autograd包,这意味着如果您有变量,并且将它们传递给可微分的函数并获得标量结果,则可以执行梯度下降来更新变量以降低或增加标量结果。
因此,您需要定义一个在张量级别上起作用的函数f,以便f(sm,freq_m)将为您提供所需的相关性。
然后,您应该执行以下操作:
lr = 1e-3
for i in range(100):
# 100 updates
loss = 1 - f(sm, freq_m)
print(loss)
loss.backward()
with torch.no_grad():
sm -= lr * sm.grad
freq_m -= lr * freq_m.grad
# Manually zero the gradients after updating weights
sm.grad.zero_()
freq_m.grad.zero_()
建议您进行实验,学习速度基本上就是您要执行的步骤的大小,学习速度太高会导致损失爆炸,学习速度太少会导致收敛缓慢。
编辑:要回答的评论loss.backward
:对任何微函数f,f是多张量的函数t1, ..., tn
与requires_grad=True
结果,可以计算出损失的梯度相对于每个那些张量。完成后loss.backward
,它将计算这些梯度并将其存储在t1.grad,...,tn.grad中。然后t1, ..., tn
使用梯度下降进行更新以降低f的值。此更新不需要计算图,因此这就是您使用的原因with torch.no_grad()
。在循环的最后,您将渐变归零,因为.backward
它不会覆盖渐变,而是向其中添加新的渐变。有关更多信息,请访问:https : //discuss.pytorch.org/t/why-do-we-need-to-set-the-gradients-manually-to-zero-in-pytorch/4903
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句