小编Pr1*_*mer的帖子

反向传播用于整流线性单元激活与交叉熵误差

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

我设法通过sigmoid,tanh和ReLU激活函数使我的实现工作为平方错误.正确计算具有S形激活梯度的交叉熵(CE)误差.但是,当我将激活更改为ReLU时 - 它失败了.(我正在为CE跳过tanh,因为它在(-1,1)范围内抽取值.)

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

log(max(y,eps))
Run Code Online (Sandbox Code Playgroud)

但它只能帮助将误差和渐变带回实数 - 它们仍然与数值梯度不同.

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

num_grad = (f(W+epsilon) - f(W-epsilon)) / (2*epsilon)
Run Code Online (Sandbox Code Playgroud)

以下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 …
Run Code Online (Sandbox Code Playgroud)

matlab machine-learning backpropagation neural-network

7
推荐指数
1
解决办法
1万
查看次数