【问题标题】:Which loss function is suitable?哪种损失函数合适?
【发布时间】:2021-02-14 22:38:40
【问题描述】:

我正在使用 PyTorch,但对这个库还是很陌生。

我的输入和输出之间存在y = ax + b 给出的关系,其中ab 是从某个分布(比如Uniform)中采样的,也就是说,它们是随机的。我想训练一个网络在看到ya 时预测x。我正在使用一个名为probability_network 的网络,其中包含nn.Linear 层。 N(比如 10 个)类可供 x 选择。

class ProabilityNetwork(nn.Module):
    def __init__(self):
        super(ProabilityNetwork, self).__init__()
        self.fc1 = nn.Linear(8, 76)
        self.fc2 = nn.Linear(76, 150)
        self.fc3 = nn.Linear(150, 75)
        self.fc4 = nn.Linear(75, 14)
        self.fc5 = nn.Linear(14, 10)
        self.tanh = nn.Tanh()
        self.sigmoid = nn.Sigmoid()
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(dim=1)

    def forward(self, inputs):
        return self.softmax(self.fc5(self.fc4(self.relu(self.fc3(self.relu(self.fc2(self.relu(self.fc1(inputs)))))))))

probabilty_network = ProbabilityNetwork()

在看到y 时,损失函数应该帮助网络预测一个x 最小化||y-ax||^2y = ax + b 中的所有数量都是向量(在本例中每个长度为 4)。我已经尝试过以下损失函数。

prob_values = probabilty_network(torch.cat([y, a], dim=0))  # shape: (batch_size, 10)
x_hat = mapping_tensor[torch.argmax(prob_values, dim=1)]  # Mapping from probability to one of 10 classes, mapping_tensor is an array of shape (10, 4)

mse_loss = nn.MSELoss()
loss = mse_loss(y, a*x_hat)

例如,mapping_tensor 可以包含从 0 (0000) 到 9 (1001) 的值的二进制表示。我需要类的二进制表示的原因是我需要一个向量x 来表示损失||y-ax||^2。在这种情况下,x 是一个 4 长度向量,而神经网络的输出是一个 10 长度向量。

上述设置不起作用。预测类中一半的值(以二进制形式写出)总是错误的,这意味着网络在训练时很混乱。

此外,这不是一个无法解决的问题。存在上述损失函数的解决方案(当然有误差,但误差远小于 50%),但计算量很大。我正在尝试检查网络是否可以以某种方式学会以较低的复杂性进行预测。任何帮助表示赞赏。谢谢。

此外,从优化的角度来看,损失函数是最好的解决方案(据我所知)。所以,改变损失函数只会导致更差的结果。

另一种看待问题的方法如下。假设网络看到ya。然后网络为每个类x(10 个可能的类)计算|y-ax|,然后选择计算值最小的类。我的问题是,我可以使用什么损失函数来使网络以这种方式训练?

【问题讨论】:

  • 你在mapping_tensor 失去了我。直到那时,这看起来像是一个最小二乘回归问题。根据您之前给出的问题陈述,我不清楚映射的目的是什么,也不清楚二进制表示与任何事情有什么关系。
  • @jodag 很抱歉含糊其辞。网络应该预测一个类别。该类具有二进制表示。从网络给出的概率向量的argmax,我找到这个类表示,然后在损失函数中使用这个表示。损失函数期望一个向量和概率向量不能被输入。这清楚吗?

标签: python machine-learning deep-learning pytorch


【解决方案1】:

我根据这个陈述回答:

我想训练一个网络在看到y 时预测x

其中y = ax + b,带有ab 随机向量(乘性和加性噪声)。

您可以以监督的方式训练您的模型。给定y,您的模型预测x_pred。然后将损失函数定义为您的预测x_pred 和基本事实x 之间的欧几里得距离:

loss = torch.nn.functional.mse_loss(x_pred, x)

【讨论】:

  • 谢谢。 Neb,如果您仔细观察,||y-ax||^2 与您的答案中的损失不同。这可行,但性能与我在问题中提到的损失函数的解决方案不相称。我无法更改损失函数,因为在这种情况下这是最好的做法。
  • 原因可能是网络学习的决策边界基于y,而我希望决策边界基于|y-ax| 10x.
  • 我对问题做了些微修改,请看一下。
  • 您能指出计算成本高昂的解决方案吗?我很好奇。甚至很少有提示。
  • 实际上很简单,对于每个收到的ya,计算N(在本例中为10)yax 之间的欧几里得距离,其中x来自每个N 类。然后决定是对应于最小欧几里得距离的x。因此,对于 1000 个 y 向量,需要计算 N*1000 个欧几里德距离,这非常慢且计算量很大。
猜你喜欢
  • 2021-09-08
  • 2010-09-17
  • 1970-01-01
  • 2010-11-21
  • 2020-03-14
  • 2011-04-28
  • 2020-09-28
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多