È appropriato passare una derivata per calcolare l'errore di una rete neurale?

1

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.

    
posta Carcigenicate 30.07.2015 - 19:08
fonte

1 risposta

1

Sì, puoi passare la derivata the , tuttavia, deve essere la derivata della tua funzione di attivazione. N.B. la rete fallirà se la derivata non è in realtà la derivata della funzione di attivazione.

Le opzioni disponibili sono:

  • definisce staticamente la tua funzione di attivazione e la sua derivata
  • definisce staticamente un elenco di funzioni di attivazione che possono essere selezionate, (e la derivata selezionata automaticamente)
  • parametrizza la funzione di attivazione e la sua derivata come una coppia
  • parametrizza la funzione di attivazione, quindi usa un metodo per calcolare la derivata automaticamente (n.b alcune librerie di reti neurali usano questo approccio).

Poiché il rolling del proprio codice di rete neurale ha davvero senso solo come esercizio di apprendimento, qualsiasi metodo è appropriato. Una libreria pratica vorrebbe impedire agli utenti di configurare erroneamente la rete.

NB. Presumo che un neurone 'soglia', menzionato nella tua citazione, si riferisca a un neurone con una funzione di attivazione lineare rettificata. La derivata in questo caso è 1, a meno che l'output sia 0, quindi sia 0. Quindi, lasciare la derivata è come usarlo, in quel caso particolare.

    
risposta data 30.07.2015 - 23:28
fonte

Leggi altre domande sui tag