Sto leggendo una guida per la retro-propagazione di una rete neurale, e dà la funzione di errore come:
Next work out the error for neuron B. The error is What you want – What you actually get, in other words: ErrorB = OutputB (1-OutputB)(TargetB – OutputB)
Ma poi, sotto quello che dice:
The “Output(1-Output)” term is necessary in the equation because of the Sigmoid Function – if we were only using a threshold neuron it would just be (Target – Output).
In effetti sto usando la funzione sigmoid per la mia rete, ma mi piacerebbe scrivere le cose per essere il più generale possibile. Ho pensato di provare qualcosa del genere:
public List<Double> calcError(List<Double> expectedOutput, UnaryOperator<Double> derivative) {
List<Double> actualOutput = outputLayer.getActivations();
List<Double> errors = new ArrayList<Double>();
for (int i = 0; i < actualOutput.size(); i++) {
errors.add(
derivative.apply(actualOutput.get(i)) * (expectedOutput.get(i) - actualOutput.get(i))
);
}
return errors;
}
Dove permetto al chiamante di passare nella derivata (penso che sia quello che viene chiamato), quindi l'errore può essere calcolato per qualsiasi funzione di attivazione.
Il problema è che non ho ancora imparato il calcolo e non so nemmeno se questo ha senso. Posso avere la derivata passata in questo modo e avere ancora risultati accurati? Oppure il calcolo dell'errore cambia a seconda della funzione di attivazione / derivata utilizzata?
Non ero sicuro se questo dovesse essere inserito nel SE matematico; dato che contiene codice.