具有交叉熵误差的整流线性单元激活的反向传播

     2023-03-12     37

关键词:

【中文标题】具有交叉熵误差的整流线性单元激活的反向传播【英文标题】:Backpropagation for rectified linear unit activation with cross entropy error 【发布时间】:2014-08-12 14:59:18 【问题描述】:

我正在尝试使用反向传播实现神经网络的梯度计算。 我无法使用交叉熵误差和校正线性单元 (ReLU) 作为激活。

我设法让我的实现使用 sigmoid、tanh 和 ReLU 激活函数处理平方误差。正确计算了具有 sigmoid 激活梯度的交叉熵 (CE) 误差。但是,当我将激活更改为 ReLU 时 - 它失败了。 (我跳过了 CE 的 tanh,因为它返回 (-1,1) 范围内的值。)

是因为 log 函数在值接近 0 时的行为(ReLU 大约有 50% 的时间返回归一化输入)? 我试图通过以下方式缓解这个问题:

log(max(y,eps))

但它只有助于将误差和梯度带回实数 - 它们仍然不同于数值梯度。

我使用数值梯度验证结果:

num_grad = (f(W+epsilon) - f(W-epsilon)) / (2*epsilon)

以下 matlab 代码展示了我的实验中使用的简化且精简的反向传播实现:

function [f, df] = backprop(W, X, Y)
% W - weights
% X - input values
% Y - target values

act_type='relu';    % possible values: sigmoid / tanh / relu
error_type = 'CE';  % possible values: SE / CE

N=size(X,1); n_inp=size(X,2); n_hid=100; n_out=size(Y,2);
w1=reshape(W(1:n_hid*(n_inp+1)),n_hid,n_inp+1);
w2=reshape(W(n_hid*(n_inp+1)+1:end),n_out, n_hid+1);

% feedforward
X=[X ones(N,1)];
z2=X*w1'; a2=act(z2,act_type); a2=[a2 ones(N,1)];
z3=a2*w2'; y=act(z3,act_type);

if strcmp(error_type, 'CE')   % cross entropy error - logistic cost function
    f=-sum(sum( Y.*log(max(y,eps))+(1-Y).*log(max(1-y,eps)) ));
else % squared error
    f=0.5*sum(sum((y-Y).^2));
end

% backprop
if strcmp(error_type, 'CE')   % cross entropy error
    d3=y-Y;
else % squared error
    d3=(y-Y).*dact(z3,act_type);
end

df2=d3'*a2;
d2=d3*w2(:,1:end-1).*dact(z2,act_type);
df1=d2'*X;

df=[df1(:);df2(:)];

end

function f=act(z,type) % activation function
switch type
    case 'sigmoid'
        f=1./(1+exp(-z));
    case 'tanh'
        f=tanh(z);
    case 'relu'
        f=max(0,z);
end
end

function df=dact(z,type) % derivative of activation function
switch type
    case 'sigmoid'
        df=act(z,type).*(1-act(z,type));
    case 'tanh'
        df=1-act(z,type).^2;
    case 'relu'
        df=double(z>0);
end
end

编辑

经过另一轮实验,我发现最后一层使用softmax:

y=bsxfun(@rdivide, exp(z3), sum(exp(z3),2));

和softmax成本函数:

f=-sum(sum(Y.*log(y)));

使实现适用于包括 ReLU 在内的所有激活函数。

这让我得出结论,它是逻辑成本函数(二元分类器)不适用于 ReLU:

f=-sum(sum( Y.*log(max(y,eps))+(1-Y).*log(max(1-y,eps)) ));

但是,我仍然无法弄清楚问题出在哪里。

【问题讨论】:

【参考方案1】:

每个压缩函数 sigmoid、tanh 和 softmax(在输出层) 表示不同的成本函数。 那么 RLU(在输出层)与交叉熵成本函数不匹配是有道理的。 我将尝试一个简单的平方误差成本函数来测试 RLU 输出层。

RLU 的真正威力在于深度网络的隐藏层,因为它不受梯度消失误差的影响。

【讨论】:

在阅读了几篇关于神经网络的论文后,我得出了类似的结论。当我需要分类时,softmax 的输出层由 sigmoid 单元组成。其他层(隐藏)仍然由 ReLU 组成。【参考方案2】:

如果您使用梯度下降,您需要导出激活函数,以便稍后在反向传播方法中使用。你确定'df = double(z> 0)'吗?因为逻辑和 tanh 似乎是正确的。

此外,您确定这个 'd3=y-Y' 吗?我会说当你使用逻辑函数而不是 ReLu 时这是真的(导数不一样,因此不会导致那个简单的方程)。

您可以使用 softplus 函数,它是 ReLU 的平滑版本,其导数是众所周知的(逻辑函数)。

【讨论】:

ReLU函数的导数是:df=0 for input0 在matlab中相当于double(z>0)。 d3 是最后一层的增量,它是正确的形式。 ReLU 比 softplus 函数具有优势 - 例如检查 here。【参考方案3】:

我认为缺陷在于与数值计算的导数比较。在您的导数激活函数中,您将 ReLu 在 0 处的导数定义为 0。在 x=0 处的导数的数值计算表明它是 (ReLU(x+epsilon)-ReLU(x-epsilon)/(2*epsilon)) 在 x =0 时为 0.5。因此,将 ReLU 在 x=0 处的导数定义为 0.5 即可解决问题

【讨论】:

【参考方案4】:

我想我会分享我遇到类似问题的经验。我也设计了我的多分类器ANN,所有隐藏层都使用RELU作为非线性激活函数,输出层使用softmax函数。

我的问题在某种程度上与我使用的编程语言/平台的数值精度有关。就我而言,我注意到如果我使用“普通”RELU 不仅会杀死渐变,而且我使用的编程语言会产生以下softmax 输出向量(这只是一个示例):

⎡1.5068230536681645e-35⎤
⎢ 2.520367499064734e-18⎥
⎢3.2572859518007807e-22⎥
⎢                     1⎥
⎢ 5.020155103452967e-32⎥
⎢1.7620297760773188e-18⎥
⎢ 5.216008990667109e-18⎥
⎢ 1.320937038894421e-20⎥
⎢2.7854159049317976e-17⎥
⎣1.8091246170996508e-35⎦

请注意大多数元素的值都接近0,但最重要的是请注意输出中的1 值。

我使用了与您使用的不同的cross-entropy 错误函数。我没有计算log(max(1-y, eps)),而是坚持基本的log(1-y)。所以给定上面的输出向量,当我计算log(1-y) 时,我得到-Inf 作为cross-entropy 的结果,这显然杀死了算法。

我想如果你的eps 不够高,以至于log(max(1-y, eps)) -> log(max(0, eps)) 不会产生太小的log 输出,你可能会像我一样处于类似的泡菜中。

我对这个问题的解决方案是使用Leaky RELU。一旦我开始使用它,我可以继续使用多分类器cross-entropy,而不是您决定尝试的softmax-cost 功能。

【讨论】:

正向传播和反向传播

...?反向传播(用于优化神网参数):根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非... 查看详情

正向传播和反向传播

...?反向传播(用于优化神网参数):根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非... 查看详情

深度学习基础入门

...单元的效果当我们改变一个隐藏的激活时,可以得到误差传播的速度使用误差导数每个隐藏的单元可以影响许多输出单元单独的误差影响→合并这些影响可以有效地计算隐藏单元的误差导数(一旦我们有了隐藏激活的误... 查看详情

均方差交叉熵及公式推导

交叉熵损失函数交叉熵的几种表达形式BinaryCrossEntropyCategoricalCrossEntropy对数似然函数与交叉熵的关系均方误差与交叉熵误差(sigmoid为激活函数)均方误差(MSE)与梯度更新交叉熵误差与梯度更新对比与结论多分类交叉熵函数的梯度更... 查看详情

具有整流线性单元的 1-hidden layer 神经网络

】具有整流线性单元的1-hiddenlayer神经网络【英文标题】:1-hiddenlayerneuralnetworkwithrectifiedlinearunits【发布时间】:2018-05-3020:49:32【问题描述】:我的目标是实现一个具有校正线性单元nn.relu()和1024个隐藏节点的1隐藏层神经网络。#The... 查看详情

R中的“神经网络”包,整流线性单元(ReLU)激活函数?

】R中的“神经网络”包,整流线性单元(ReLU)激活函数?【英文标题】:Package‘neuralnet’inR,rectifiedlinearunit(ReLU)activationfunction?【发布时间】:2016-04-0415:01:26【问题描述】:我正在尝试使用R包神经网络中预先实现的“logistic”和... 查看详情

matlab中bp神经网络的训练算法具体是怎么样的

BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反... 查看详情

直观理解为什么分类问题用交叉熵损失而不用均方误差损失?

目录交叉熵损失与均方误差损失损失函数角度softmax反向传播角度参考博客:blog.shinelee.me|博客园|CSDN交叉熵损失与均方误差损失常规分类网络最后的softmax层如下图所示,传统机器学习方法以此类比,一共有(K)类,令网络的输出为... 查看详情

具有对数损失的 TensorFlow 单 sigmoid 输出与具有稀疏 softmax 交叉熵损失的两个线性输出,用于二进制分类

】具有对数损失的TensorFlow单sigmoid输出与具有稀疏softmax交叉熵损失的两个线性输出,用于二进制分类【英文标题】:Tensorflowsinglesigmoidoutputwithloglossvstwolinearoutputswithsparsesoftmaxcrossentropylossforbinaryclassification【发布时间】:2018-05-2304... 查看详情

bp神经网络公式推导及实现mnist(代码片段)

...,其结构如下图。这种网络实质是一种前向无反馈网络,具有结构清晰、易实现、计算功能强大等特点。 BP神经网络有一个输入层,一个输出层,一个或多个隐含层。每一层上包含了若干个节点,每个节点代表一个神经元,... 查看详情

具有交叉熵损失的 Softmax 激活导致两个类的输出分别准确地收敛到 0 和 1

】具有交叉熵损失的Softmax激活导致两个类的输出分别准确地收敛到0和1【英文标题】:Softmaxactivationwithcrossentropylossresultsintheoutputsconvergingtoexactly0and1forbothclasses,respectively【发布时间】:2018-10-0421:35:13【问题描述】:我已经实现了... 查看详情

神经网络权重以线性单位爆炸

...的。但是,网络无法逼近简单的正弦曲线。该网络有一个具有tanh激活函数的隐藏层(100个神经元)和一个具有线性激活函数的输 查看详情

神经网络的前向与后向传播简单理解

...函数的一个类型,表达模型好坏的一个参数,越小越好:交叉熵:分类类别-logt概率,多个输入,则分类类别-logt概率的平均值上图为函数的曲线表示,已知t均小于1,所以t越大,logt越大,-logt越小,则接近于0。反向传播相关函... 查看详情

激活函数

...,S型函数不适合作为隐藏单元上的激活函数。初识修正线性单元(ReLU)如果输入小于0,修正线性单元的输出是0,原始输出则相反。即如果输入大于0,则输出等于输入。函数的输 查看详情

神经网络和 XOR 作为分类

...用于回归,交叉熵损失适用于分类。当我尝试将XOR训练为具有交叉熵损失的分类问题时,网络未能收敛。我的设置:网络为2-2-2第一个输出是信号0,第二个是1(所以有两类输入)。交叉熵用于计算网络输出层的误差,而不是均... 查看详情

对于各种值,交叉熵误差保持不变

】对于各种值,交叉熵误差保持不变【英文标题】:CrossEntropyErrorremainsunchangedforvariousvalues【发布时间】:2019-10-1314:10:05【问题描述】:我正在使用带有Softmax的交叉熵作为我的神经网络的损失函数。我写的交叉熵函数如下:defCros... 查看详情

bp神经网络基于matlab拟合正弦曲线

...年代的出现,这是由许多神经元调节连接权值连接而成,具有大规模并行处理,分布式信息存储,良好的自我组织自学能力强等特点,在信息处理,模式识别,智能控制与系统建模等领域得到越来越广泛的应用。特别是,误差反... 查看详情

深度学习知识点查漏补缺(反向传播)

...链式关系。以一个两个隐藏层的网络为例: 对最终的误差函数求偏导,沿着嵌套函数的方向,存在求偏导的一个链条,如下图:沿 查看详情