发布
社区首页 >问答首页 >非光滑不可微定制损耗函数tensorflow

非光滑不可微定制损耗函数tensorflow
EN

Stack Overflow用户
提问于 2016-11-22 22:28:31
回答 3查看 7.9K关注 0票数 22
  1. 在tensorflow中,是否可以使用非光滑函数作为损失函数,例如分段(或如果-否则)?如果你不能,为什么你可以使用ReLU?
  2. 在这个链接苗条中,它说

例如,我们可能希望将日志丢失降到最低,但我们感兴趣的指标可能是F1评分,或者与Union评分的交集(这是不可区分的,因此不能用作损失)。

这是否意味着“不可区分”,例如设定的问题?因为对于ReLU,在0点,它是不可微的。

  1. 如果使用这种自定义的损失函数,是否需要自己实现梯度?还是tensorflow可以自动帮你做?我检查了一些压缩损失函数,它们没有为它们的损失函数实现梯度。
EN

回答 3

Stack Overflow用户

发布于 2016-11-23 07:10:46

问题不在于损失是分片的或不顺利的。问题是,当输出和预期输出之间出现错误时,我们需要一个损失函数,它可以向网络参数返回一个非零的梯度。这几乎适用于模型中使用的任何函数(例如损失函数、激活函数、注意函数)。

例如,感知器使用单位步长 H(x)作为激活函数(如果x>0,则H(X)=1)。由于H(x)的导数始终为零(在x=0处未定义),因此损失产生的梯度不会通过它返回权值(链规则),因此在网络中该函数之前没有权值可以用梯度下降来更新。基于此,梯度下降不能用于感知器,而可以用于使用乙状体激活函数的常规神经元(因为梯度不是对所有x都是零的)。

对于Relu,x>0的导数为1,否则为0。当导数在x=0上没有定义时,我们仍然可以在x>0时向后传播损失梯度。这就是为什么可以使用它。

这就是为什么我们需要一个具有非零梯度的损失函数。像精度和F1这样的函数到处都是零梯度(或者在x的某些值下没有定义),所以不能使用它们,而像交叉熵、L2L1这样的函数有非零梯度,所以可以使用。(请注意,L1“绝对差”在x=0中是分段的,并不平滑,但仍然可以使用)

如果您必须使用不符合上述条件的函数,请改用强化学习方法 (例如,策略梯度)。

票数 23
EN

Stack Overflow用户

发布于 2017-05-18 17:00:07

至于OP的问题3,您实际上不必自己实现梯度计算。Tensorflow会为你做这件事,这是我喜欢的事情之一!

票数 5
EN

Stack Overflow用户

发布于 2019-06-15 07:40:02

  1. tf不自动计算所有函数的梯度,即使使用某些后端函数。请看。建立自定义丢失函数时出错为我做了一个任务,然后我自己找到了答案。
  2. 尽管如此,人们只能近似于一个分段可微的函数,以便实现,例如,分段常数/步进函数。下面是我在MATLAB中根据这样一个想法实现的。可以很容易地将其扩展到具有更多阈值(结)和希望边界条件的情况。
代码语言:javascript
代码运行次数:0
复制
function [s, ds] = QPWC_Neuron(z, sharp)
% A special case of (quadraple) piece-wise constant neuron composing of three Sigmoid functions
% There are three thresholds (junctures), 0.25, 0.5, and 0.75, respectively
% sharp determines how steep steps are between two junctures.
% The closer a point to one of junctures, the smaller its gradient will become. Gradients at junctures are zero.
% It deals with 1D signal only are present, and it must be preceded by another activation function, the output from which falls within [0, 1]
% Example:
% z = 0:0.001:1;
% sharp = 100;

LZ = length(z);
s = zeros(size(z));
ds = s;
for l = 1:LZ
    if z(l) <= 0
        s(l) = 0;
        ds(l) = 0;
    elseif (z(l) > 0) && (z(l) <= 0.25)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.125)./0.25)));
        ds(l) = sharp/0.25 * (s(l)-0) * (1-(s(l)-0)/0.25);
    elseif (z(l) > 0.25) && (z(l) <= 0.5)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.375)./0.25))) + 0.25;
        ds(l) = sharp/0.25 * (s(l)-0.25) * (1-(s(l)-0.25)/0.25);
    elseif (z(l) > 0.5) && (z(l) <= 0.75)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.625)./0.25))) + 0.5;
        ds(l) = sharp/0.25 * (s(l)-0.5) * (1-(s(l)-0.5)/0.25);
    elseif (z(l) > 0.75) && (z(l) < 1)
        % If z is larger than 0.75, the gradient shall be descended to it faster than other cases
        s(l) = 0.5 ./ (1+exp(-sharp*((z(l)-1)./0.5))) + 0.75;
        ds(l) = sharp/0.5 * (s(l)-0.75) * (1-(s(l)-0.75)/0.5);
    else
        s(l) = 1;
        ds(l) = 0;
    end
end
figure;
subplot 121, plot(z, s); xlim([0, 1]);grid on;
subplot 122, plot(z, ds); xlim([0, 1]);grid on;

end

  1. 至于Python和tf中的实现,您可以从这里引用@papaouf_ai的出色的分步说明。如何在Tensorflow中使用只使用Python的自定义激活函数?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40752801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档