非平滑且不可微的定制损失函数张量流

use*_*356 16 tensorflow

  1. 在tensorflow中,你可以使用非平滑函数作为损失函数,例如分段(或使用if-else)?如果你不能,为什么你可以使用ReLU?

  2. 在这个链接 SLIM中 ,它说

"例如,我们可能希望最大限度地减少对数损失,但我们感兴趣的指标可能是F1得分,或交叉点超过联盟得分(不可区分,因此不能用作损失)."

它是否意味着"不可区分",例如设置问题?因为对于ReLU,在0点,它是不可区分的.

  1. 如果您使用这种定制的损耗功能,您是否需要自己实现渐变?或者tensorflow可以自动为您完成吗?我检查了一些保留的损失函数,它们没有为它们的损失函数实现梯度.

Yah*_*ria 18

问题不在于损失是分段的还是不平滑的.问题是我们需要一个损失函数,当输出和预期输出之间存在误差时,该函数可以将非零梯度发送回网络参数(dloss/dparameter).这适用于模型中使用的几乎任何函数(例如,损失函数,激活函数,注意函数).

例如,Perceptrons使用单位步长 H(x)作为激活函数(如果x> 0,则H(x)= 1,否则为0).由于H(x)的导数总是为零(在x = 0时未定义),来自损失的无梯度将通过它返回到权重(链规则),因此网络中该函数之前的权重不能更新使用梯度下降.基于此,梯度下降不能用于感知器,但可以用于使用S形激活函数的常规神经元(因为所有x的梯度不为零).

对于Relu,对于x> 0,导数为1,否则为0.虽然导数在x = 0时未定义,但当x> 0时,我们仍然可以通过它反向传播损耗梯度.这就是为什么它可以使用.

这就是为什么我们需要一个具有非零梯度的损失函数.像精度和F1这样的函数在任何地方都有零梯度(或者在某些x值处未定义),所以它们不能使用,而交叉熵,L2L1等函数具有非零梯度,因此可以使用它们.(注意,L1"绝对差异"是分段的,在x = 0时不平滑,但仍然可以使用)

如果您必须使用不符合上述标准的函数,请尝试使用强化学习方法(例如,政策渐变).

  • IoU的工作原理是将交集中的像素数除以联合中的像素数.在这种情况下,它不应该是可区分的,因为像素数是离散的.我相信如果我们使用边界框的实值坐标,IoU将是可区分的.此外,[本文](http://www.cs.umanitoba.ca/~ywang/papers/isvc16.pdf)提出了一种基于像素的IoU可通过对其进行修改以区分像素的概率的方法.某个类别. (2认同)

bra*_*ead 5

就OP的问题#3而言,您实际上不必自己实施梯度计算。Tensorflow将为您做到这一点,这是我喜欢的事情之一!