Fonction de coût des réseaux neuronaux dans MATLAB

comment mettre en oeuvre cette fonction de coût de réseau neuronal dans matlab:

Neural Network Cost Function

Voici ce que les symboles représentent:

% m is the number of training examples.   [a scalar number]
% K is the number of output nodes.   [a scalar number]
% Y is the matrix of training outputs.   [an m by k matrix]
% y^{(i)}_{k} is the ith training output (target) for the kth output node.   [a scalar number]
% x^{(i)} is the ith training input.   [a column vector for all the input nodes]
% h_{theta}(x^{(i)})_{k} is the value of the hypothesis at output k, with weights theta, and training input i.   [a scalar number]

%note: h_{theta}(x^{(i)}) will be a column vector with K rows.

j'ai des problèmes avec les sommes imbriquées, les noeuds de biais, et la complexité générale de cette équation. Je me bats aussi parce qu'il y a 2 matrices de poids, l'une connectant les entrées à la couche cachée, et l'autre connectant la couche cachée aux sorties. Voici ma tentative de sorte loin.

définir les variables

m = 100            %number of training examples
K = 2              %number of output nodes
E = 2              %number of input nodes
A = 2              %number of nodes in each hidden layer
L = 1              %number of hidden layers

Y = [2.2,   3.5    %targets for y1 and y2 (see picture at bottom of page)
     1.7,   2.1
     1.9,   3.6
      .     .      %this is filled out in the actual code but to save space I have used ellipsis. there will be m rows.
      .     .
      .     .
     2.8,   1.6]

X = [1.1,   1.8    %training inputs. there will be m rows
     8.5,   1.0
     9.5,   1.8
      .     .
      .     .
      .     . 
     1.4,   0.8]

W1 = [1.3,  .    .  0.4    %this is just an E by A matrix of random numbers. this is the matrix of initial weights.
       .    .    .  - 2
       .    .    .  3.1
       .    .    .  - 1
      2.1, -8, 1.2, 2.1]

W2 = [1.3,  .    .  0.4    %this is an A by K matrix of random numbers. this is the matrix of initial weights.
       .    .    .  - 2
       .    .    .  3.1
       .    .    .  - 1
      2.1, -8, 1.2, 2.1]

hypothèse utilisant ces poids égale...

Htheta = sigmf( dot(W2 , sigmf(dot(W1 , X))) )   %This will be a column vector with K rows.

fonction de coût utilisant ces poids égale... (C'est là que j'ai du mal)

  sum1 = 0
  for i = 1:K
  sum1 = sum1 + Y(k,i) *log(Htheta(k)) + (1 - Y(k,i))*log(1-Htheta(k))

Je n'arrête pas d'écrire des choses comme ça et de réaliser que c'est mal. Je ne peux pas pour la vie de moi-même travailler sur la façon de faire les sommes imbriquées, ou inclure la matrice d'entrée, ou faire n'importe quoi de lui. C'est très compliqué.

comment créer cette équation à matlab?

Merci beaucoup!

un réseau neuronal à 2 couches avec 2 entrées, 2 sorties, 2 noeuds cachés, et 2 unités de biais http://imagizer.imageshack.us/v2/320x240q90/40/92bn.jpg

Note: le code a des couleurs étranges car stackoverflow ne sait pas que je programme en MATLAB. J'ai également écrit le code directement dans stackoverflow, donc il peut avoir des erreurs de syntaxe. Je suis plus intéressé par l'idée générale de la façon dont je dois aller ce faisant, plutôt que d'avoir un code à copier et coller. C'est la raison pour laquelle je ne me suis pas embêté avec les semi-colons et autres.

8
demandé sur Blue7 2014-01-30 00:04:25

4 réponses

j'ai implémenté des réseaux neuronaux en utilisant la même fonction d'erreur que celle que vous avez mentionnée ci-dessus. Malheureusement, je n'ai pas travaillé avec Matlab depuis un certain temps,mais je suis assez compétent en Octave, que j'espère que vous pouvez encore trouver utile, puisque beaucoup de fonctions en Octave sont similaires à celles de Matlab.

@sashkello a fourni un bon extrait de code pour calculer la fonction de coût. Cependant, ce code est écrit avec une structure de boucle, et je voudrais offrir un vectorisé mise en œuvre.

afin d'évaluer les valeurs thêta actuelles, nous devons effectuer un feed forward/ forward propagation sur l'ensemble du réseau. Je suppose que vous savez comment écrire le code d'avance de flux, puisque vous êtes seulement concerné par le J(theta) erreurs. Que le vecteur représentant les résultats de votre propagation vers l'avant soit F

une fois que vous avez effectué feedforward, vous aurez besoin de réaliser l'équation. Note, je vais implémenter ceci dans un vectorisé manière.

J = (-1/m) * sum(sum(Y .* log(F) + (1-Y) .* log(1-F),2));

ceci calculera la partie de la sommation concernant:

part 1 of the total cost

Maintenant, nous devons ajouter le terme de régularisation, qui est:

typiquement, nous aurions un nombre arbitraire de matrices thêta, mais dans ce cas nous en avons 2, donc nous pouvons juste effectuer plusieurs sommes pour obtenir:

J =J + (lambda/(2*m)) * (sum(sum(theta_1(:,2:end).^2,2)) + sum(sum(theta_2(:,2:end).^2,2)));

remarquez que dans chaque somme Je ne travaille que de la deuxième colonne au reste. C'est parce que la première colonne correspondra à la theta valeurs que nous avons entraînées pour les unités de bias.

il y a Donc une vectorisé de la mise en œuvre du calcul des J.

j'espère que cela aide!

15
répondu Alejandro 2014-01-30 02:16:20

je pense que Htheta est un tableau K*2. Notez que vous devez ajouter le biais (x0 et a0) dans la fonction de coût de calcul. Je vous ai montré les dimensions de tableau dans chaque étape sous l'hypothèse que vous avez deux noeuds à l'entrée , caché, et les couches de sortie comme commentaires dans le code.

m = size(X, 1);  
X = [ones(m,1) X]; % m*3 in your case
% W1 2*3, W2 3*2
a2 = sigmf(W1 * X');  % 2*m
a2 = [ones(m,1) a2'];  % m*3    
Htheta = sigmf(a2 * W2);  % m*2    

J = (1/m) * sum ( sum (  (-Y) .* log(Htheta)  -  (1-Y) .* log(1-Htheta) ));

t1 = W1(:,2:size(W1,2));
W2 = W2';
t2 = W2(:,2:size(W2,2));

% regularization formula
Reg = lambda  * (sum( sum ( t1.^ 2 )) + sum( sum ( t2.^ 2 ))) / (2*m);
6
répondu lennon310 2014-02-01 18:41:26

Eh bien, comme je comprends que votre question n'a rien à voir avec les réseaux neuronaux, mais essentiellement la question de savoir comment faire une somme imbriquée dans matlab. Je n'ai pas vraiment envie de taper dans l'ensemble de l'équation ci-dessus, mais, c'est à dire, la première partie de la somme va ressembler à ça:

Jtheta = 0
for i=1:m,
    for j=1:K,
        Jtheta = Jtheta + Y(i, j) * log(Htheta(X(i))(j)) 
    end
end

Jtheta est votre résultat.

1
répondu sashkello 2014-01-30 01:16:15

Cela fonctionne sur n'importe quel nombre de couches cachées:

% Allow arbitrary network architectures. Create cell array of all Theta parameters
Theta={Theta1; Theta2};

% Compute unregularised cost (J)
J = 1/m * sum(sum((-y .* log(hX) - (1 - y) .* log(1 - hX))));

% Add regularisation
for i = 1:length(Theta)
  J += lambda / 2 / m * sum(sum(Theta{i}(:,2:end) .^ 2));
end   
0
répondu Tom Hale 2017-07-29 09:29:55