例如,我们可能希望将日志丢失降到最低,但我们感兴趣的指标可能是F1评分,或者与Union评分的交集(这是不可区分的,因此不能用作损失)。
这是否意味着“不可区分”,例如设定的问题?因为对于ReLU,在0点,它是不可微的。
发布于 2016-11-22 23: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的某些值下没有定义),所以不能使用它们,而像交叉熵、L2和L1这样的函数有非零梯度,所以可以使用。(请注意,L1“绝对差”在x=0中是分段的,并不平滑,但仍然可以使用)
如果您必须使用不符合上述条件的函数,请改用强化学习方法 (例如,策略梯度)。
发布于 2017-05-18 09:00:07
至于OP的问题3,您实际上不必自己实现梯度计算。Tensorflow会为你做这件事,这是我喜欢的事情之一!
发布于 2019-06-14 23:40:02
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
https://stackoverflow.com/questions/40752801
复制相似问题