Les pour rectifier linéaire de l'unité d'activation avec la croix de l'entropie d'erreur
Je suis en train de mettre en œuvre gradient de calcul pour les réseaux de neurones à l'aide de les.
Je ne peux pas le faire fonctionner avec la croix de l'entropie de l'erreur et la rectification unité linéaire (ReLU) activation.
J'ai réussi à obtenir mon travail de mise en œuvre de l'erreur quadratique avec sigmoïde, tanh et ReLU fonctions d'activation. La croix de l'entropie (CE) erreur d'activation sigmoïde gradient est calculé correctement. Cependant, lorsque je change l'activation ReLU - il échoue. (Je suis à sauter tanh pour CE qu'il retuls valeurs dans (-1,1) la portée.)
Est à cause du comportement de la fonction log à des valeurs proches de 0 (ce qui est retourné par ReLUs env. 50% du temps pour normalisé entrées)?
J'ai essayé de mitiage ce problème avec:
log(max(y,eps))
mais il ne m'a aidé à apporter de l'erreur et des gradients de retour de nombres réels - ils sont encore différents de numérique dégradé.
J'ai vérifier les résultats à l'aide numérique dégradé:
num_grad = (f(W+epsilon) - f(W-epsilon)) / (2*epsilon)
Le code matlab suivant présente une procédure simplifiée et condensée les mise en œuvre utilisé dans mes expériences:
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
Modifier
Après une autre série d'expériences, j'ai trouvé que l'utilisation d'un softmax pour la dernière couche:
y=bsxfun(@rdivide, exp(z3), sum(exp(z3),2));
et softmax fonction de coût:
f=-sum(sum(Y.*log(y)));
faire la implementaion de travail pour toutes les fonctions d'activation, y compris ReLU.
Ce qui m'amène à la conclusion que c'est la logistique de la fonction de coût (binaire clasifier) qui ne fonctionne pas avec ReLU:
f=-sum(sum( Y.*log(max(y,eps))+(1-Y).*log(max(1-y,eps)) ));
Cependant, je n'arrive toujours pas à comprendre où se situe le problème.
Vous devez vous connecter pour publier un commentaire.
Chaque écrasement de la fonction sigmoïde, tanh et softmax (dans la couche de sortie)
signifie différentes fonctions de coût.
Alors logique qu'une RLU (dans la couche de sortie) ne correspond pas avec la croix de l'entropie de la fonction de coût.
Je vais essayer un simple carré de l'erreur de la fonction de coût pour tester un RLU couche de sortie.
Le vrai pouvoir de la RLU est dans les couches cachées d'une profonde net car il souffre pas de gradient de fuite d'erreur.
Si vous utilisez gradient descendant vous devez dériver la fonction d'activation pour être utilisé plus tard dans le back-propagation de l'approche. Êtes-vous sûr de l' 'df=double(z>0)'?. Pour la logistique et tanh semble être de droite.
De plus, êtes-vous sûr de ce "d3=y-y' ? Je dirais que cela est vrai lorsque vous utilisez la fonction logistique, mais pas pour l'ReLu (la dérivée n'est pas le même et, par conséquent, ne mènera pas à une simple équation).
Vous pouvez utiliser le softplus fonction qui est une version lisse de l'ReLU, dont la dérivée est bien connu (fonction logistique).
double(z>0)
. d3 est le delta de la dernière couche et c'est la forme correcte. ReLU a des avantages sur softplus de la fonction de vérification ici par exemple.Je pense que la faille réside dans comapring avec le numérique calculée dérivés. Dans votre derivativeActivation fonction vous permet de définir la dérivée d'ReLu à 0 à 0. Où que numériquement le calcul de la dérivée en x=0 montre
(ReLU(x+epsilon)-ReLU(x-epsilon)/(2*epsilon)) en x =0, qui est de 0,5. Par conséquent, la définition de la dérivée d'ReLU en x=0 à 0,5 permettra de résoudre le problème
Je pensais que je voudrais partager mon expérience que j'ai eu avec le même problème. Moi aussi, j'ai conçu mon multi classificateur
ANN
en sorte que toutes les couches cachées utilisationRELU
non-linéaire de la fonction d'activation et la couche de sortie utilisesoftmax
fonction.Mon problème était lié à un certain degré de précision numérique de la langue de programmation/plate-forme que j'utilisais. Dans mon cas, j'ai remarqué que si j'ai utilisé de la "plaine"
RELU
pas seulement de tuer le dégradé mais le langage de programmation j'ai utilisé les produits suivantssoftmax
sortie vecteurs (c'est juste un exemple de l'échantillon):Notez que les valeurs de la plupart des éléments sont proches de
0
, mais le plus important, de l'avis de la1
valeur dans la sortie.J'ai utilisé un autre
cross-entropy
de la fonction d'erreur que celle que vous avez utilisée. Au lieu de calculerlog(max(1-y, eps))
j'ai collé à la baselog(1-y)
. Donc, étant donné le vecteur de sortie ci-dessus, lorsque j'ai calculélog(1-y)
j'ai eu le-Inf
comme un résultat decross-entropy
, qui, évidemment, a tué l'algorithme.J'imagine que si votre
eps
n'est pas raisonnablement suffisant pour que leslog(max(1-y, eps))
->log(max(0, eps))
ne donne pas trop petitlog
la sortie que vous pouvez être dans une semblable cornichon comme moi.Ma solution à ce problème serait d'utiliser Qui fuit RELU. Une fois que j'ai commencé à l'utiliser, j'ai pu réaliser sur l'utilisation de la multi classificateur
cross-entropy
que s'opposer àsoftmax-cost
fonction que vous avez décidé de l'essayer.