gpt4 book ai didi

matlab - 具有交叉熵误差的修正线性单元激活的反向传播

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:58 26 4
gpt4 key购买 nike

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

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

是因为对数函数在值接近 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)) ));

但是,我还是想不通问题出在哪里。

最佳答案

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

RLU 的真正力量在于深层网络的隐藏层,因为它不会出现梯度消失错误。

关于matlab - 具有交叉熵误差的修正线性单元激活的反向传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com