我不熟悉 Spearman 的等级相关性,但如果我理解您的问题,您是在问如何使用 PyTorch 解决深度网络以外的问题?
如果是这种情况,那么我将提供一个简单的最小二乘示例,我认为它应该对您的工作有所帮助。
考虑一组 10 维向量x和y的 200 个测量值。假设我们想找到从x到y的线性变换。
最小二乘法表明我们可以通过找到最小化 |( 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
层,因为我认为这只会混淆事物。
在您的情况下,您想要最大化某些东西,因此请确保在向后调用之前否定您的目标函数。