【问题标题】:Simple L1 loss in PyTorchPyTorch 中的简单 L1 损失
【发布时间】:2020-10-05 19:19:28
【问题描述】:

我想计算神经网络中的 L1 损失,我在 https://discuss.pytorch.org/t/simple-l2-regularization/139/2 遇到了这个例子,但是这段代码有一些错误。

这真的是如何计算神经网络中的 L1 损失还是有更简单的方法?

l1_crit = nn.L1Loss()
reg_loss = 0
for param in model.parameters():
    reg_loss += l1_crit(param)

factor = 0.0005
loss += factor * reg_loss

这是否等同于简单的操作:

loss = torch.nn.L1Loss()

我假设不是,因为我没有传递任何网络参数。只需检查是否存在执行此操作的现有功能。

【问题讨论】:

  • 该代码甚至不起作用。 l1_crit 需要两个参数,而不仅仅是一个。为什么要根据模型的参数计算损失?第二个显然与第一个不同,因为第一行是相同的(具有不同的size_average 值,无论如何都已弃用),但其余部分被省略。
  • 对不起,我从discuss.pytorch.org/t/simple-l2-regularization/139/2 得到了这个代码。我如何使它起作用,我将删除折旧的论点。但是我可以将参数提供给函数,对吗?
  • @dorien 您提供的链接是关于 L1 正则化的。那是你要的吗?这与在网络末端计算 L1Loss 不同。另外,如果你真的想要 L1 正则化,你应该用零替换(或者更确切地说填充)目标
  • 哦,我确实想包含 L1 正则化。您能否更具体地说明我应该如何用零替换目标?
  • @dorien 和 L1 你基本上希望你的参数是稀疏的,所以你想惩罚它们为零l1_crit(param, target=torch.zeros_like(param), size_average=False),但通常你不需要使用L1Loss。您也可以只使用规范,请参阅stackoverflow.com/questions/44641976/… 我认为没有更简单的方法可以做到这一点。当然在链接中,用例不同,你会取模型的所有参数

标签: python machine-learning deep-learning pytorch


【解决方案1】:

如果我理解得很好,您想计算模型的 L1 损失(正如您在开始时所说的那样)。但是我认为您可能对 pytorch 论坛中的讨论感到困惑。

据我了解,在 Pytorch 论坛和您发布的代码中,作者正在尝试使用 L1 正则化来规范化网络权重。所以它试图强制权重值落在一个合理的范围内(不要太大,也不要太小)。那就是使用 L1 归一化的权重归一化(这就是它使用 model.parameters() 的原因)。归一化将一个值作为输入并产生一个归一化的值作为输出。 检查权重标准化:https://pytorch.org/docs/master/generated/torch.nn.utils.weight_norm.html

另一方面,L1 Loss 只是一种确定 2 个值如何彼此不同的方法,因此“损失”只是衡量这种差异的一种方式。在 L1 损失的情况下,这个误差是用平均绝对误差loss = |x-y| 计算的,其中xy 是要比较的值。因此错误计算将 2 个值作为输入并产生一个值作为输出。 检查这个损失计算:https://pytorch.org/docs/master/generated/torch.nn.L1Loss.html

回答您的问题:不,上面的 sn-ps 不等价,因为第一个尝试进行权重标准化,而第二个尝试计算损失。这将是一些上下文的损失计算:

sample, target = dataset[i]
target_predicted = model(sample)
loss = torch.nn.L1Loss()
loss_value = loss(target, target_predicted)

【讨论】:

  • 她实际上证实这是关于 L1 正则化,她只是碰巧使用了 L1Loss 而不是 norm
猜你喜欢
  • 2017-10-23
  • 2021-05-02
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2021-08-25
  • 2020-10-29
相关资源
最近更新 更多