我有两个张量用于计算Spearmans等级相关性,并且我希望PyTorch能够自动调整这些张量中的值,从而尽可能提高我的Spearmans等级相关性数。
我已经研究过autograd,但没有发现足够简单的解释。
张量初始化:
a=Var(torch.randn(20,1),requires_grad=True)
psfm_s=Var(torch.randn(12,20),requires_grad=True)
我如何让这两个张量中的值不断调整循环,以使我在使用PyTorch时从这2个张量制成的2个列表中获得最高的Spearmans等级相关性?我只需要去哪里的指南。谢谢!
答案 0 :(得分:0)
我对Spearman的排名相关性并不熟悉,但是如果我理解您的问题,您正在询问如何使用PyTorch解决深度网络以外的问题?
如果是这种情况,那么我将提供一个简单的最小二乘示例,我认为这对您的工作很有帮助。
请考虑一组200个10维矢量测量值,分别是 x 和 y 。假设我们要找到从 x 到 y 的线性变换。
最小二乘方法指示我们可以通过找到将|( y -( M 和向量 b 来完成此操作> M x + b ))²|
以下示例代码生成一些示例数据,然后使用pytorch进行此最小化。我相信这些评论足以帮助您了解此处发生的情况。
import torch
from torch.nn.parameter import Parameter
from torch import optim
# define some fake data
M_true = torch.randn(10, 10)
b_true = torch.randn(10, 1)
x = torch.randn(200, 10, 1)
noise = torch.matmul(M_true, 0.05 * torch.randn(200, 10, 1))
y = torch.matmul(M_true, x) + b_true + noise
# begin optimization
# define the parameters we want to optimize (using random starting values in this case)
M = Parameter(torch.randn(10, 10))
b = Parameter(torch.randn(10, 1))
# define the optimizer and provide the parameters we want to optimize
optimizer = optim.SGD((M, b), lr=0.1)
for i in range(500):
# compute loss that we want to minimize
y_hat = torch.matmul(M, x) + b
loss = torch.mean((y - y_hat)**2)
# zero the gradients of the parameters referenced by the optimizer (M and b)
optimizer.zero_grad()
# compute new gradients
loss.backward()
# update parameters M and b
optimizer.step()
if (i + 1) % 100 == 0:
# scale learning rate by factor of 0.9 every 100 steps
optimizer.param_groups[0]['lr'] *= 0.9
print('step', i + 1, 'mse:', loss.item())
# final parameter values (data contains a torch.tensor)
print('Resulting parameters:')
print(M.data)
print(b.data)
print('Compare to the "real" values')
print(M_true)
print(b_true)
当然,这个问题有一个简单的封闭式解决方案,但是这种数值方法只是演示如何使用PyTorch的autograd解决不一定与神经网络有关的问题。我还选择在此处显式定义矩阵M和向量b,而不是使用等效的nn.Linear
层,因为我认为这只会使事情变得混乱。
在您的情况下,您想最大化某些内容,因此请确保在回调之前取消目标函数的作用。