-1

我有两个张量用于计算 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 个列表中获得最高的 spearmans 等级相关性?我只需要一个去哪里的指南。谢谢!

4

1 回答 1

0

我不熟悉 Spearman 的等级相关性,但如果我理解您的问题,您是在问如何使用 PyTorch 解决深度网络以外的问题?

如果是这种情况,那么我将提供一个简单的最小二乘示例,我认为它应该对您的工作有所帮助。

考虑一组 10 维向量xy的 200 个测量值。假设我们想找到从xy的线性变换。

最小二乘法表明我们可以通过找到最小化 |( y - ( M x + b ))²|的矩阵M和向量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层,因为我认为这只会混淆事物。

在您的情况下,您想要最大化某些东西,因此请确保在向后调用之前否定您的目标函数。

于 2019-08-16T02:34:56.457 回答