Ich versuche Gradientenberechnung für neuronale Netze mit Backpropagation zu implementieren. Ich kann es nicht mit Cross-Entropie-Fehler und rektifizierte lineare Einheit (ReLU) als Aktivierung arbeiten.Backpropagation für gleichgerichtete Lineareinheit Aktivierung mit Kreuz-Entropie-Fehler
Ich habe es geschafft, meine Implementierung arbeiten für quadrierten Fehler mit sigmoid, tanh und ReLU Aktivierungsfunktionen. Kreuz-Entropie (CE) -Fehler mit sigmoidem Aktivierungsgradienten wird korrekt berechnet. Wenn ich jedoch die Aktivierung zu ReLU ändere, schlägt es fehl. (Ich überspringe tanh für CE, wie es Werte in (-1,1) Bereich retails.)
Ist es wegen des Verhaltens der Protokollfunktion bei Werten in der Nähe von 0 (die von ReLUs ca. 50% zurückgegeben wird) der Zeit für normalisierte Eingaben)? Ich habe versucht, dieses Problem mitiage mit:
log(max(y,eps))
aber es half nur Fehler und Steigungen auf reelle Zahlen zurück zu bringen - sie sind aus der numerischen Gradienten noch anders.
prüfe ich die Ergebnisse numerische Gradienten:
num_grad = (f(W+epsilon) - f(W-epsilon))/(2*epsilon)
Der folgende MATLAB-Code stellt eine vereinfachte und verkürzte backpropagation Umsetzung in meinen Experimenten verwendet:
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
bearbeiten
Afte r eine weitere Runde von Experimenten, fand ich heraus, dass eine softmax für die letzte Schicht mit:
y=bsxfun(@rdivide, exp(z3), sum(exp(z3),2));
und softmax Kostenfunktion:
f=-sum(sum(Y.*log(y)));
die implementaion machen die Arbeit für alle Aktivierungsfunktionen einschließlich relu.
Dies führt mich zu dem Schluss, dass es die logistische Kostenfunktion (binär clasifier), die nicht mit relu funktioniert:
f=-sum(sum(Y.*log(max(y,eps))+(1-Y).*log(max(1-y,eps))));
aber ich kann immer noch nicht herausfinden, wo das Problem liegt.
Die Ableitung von relu Funtion ist: df = 0 für Eingabe <= 0 und df = 1 für input> 0, das in Matlab 'Doppel entspricht (z> 0)'. d3 ist das Delta der letzten Schicht und es ist die korrekte Form. ReLU hat Vorteile gegenüber der softplus-Funktion - überprüfen Sie [hier] (http://machinelearning.wustl.edu/mlpapers/paper_files/icml2010_NairH10.pdf) zum Beispiel. – Pr1mer