John Bullinarias Guida passo passo per implementazione di una rete neurale in C da John A. Bullinaria dalla School of Computer Science della University of Birmingham, nel Regno Unito. Questo documento contiene una guida passo passo per l'implementazione di una semplice rete neurale in C. Si rivolge soprattutto a studenti che desiderano (o è stato detto a) integrare una componente neurale apprendimento di rete in un sistema più ampio che stanno costruendo. Ovviamente ci sono molti tipi di rete neurale si potrebbe considerare l'utilizzo - qui mi concentrerò su un tipo particolarmente comune e utile, vale a dire un semplice feed-forward rete back-propagazione a tre strati (multi strato di perceptron). Questo tipo di rete sarà utile quando abbiamo un insieme di vettori di ingresso e una serie corrispondente di vettori di uscita, e il sistema deve produrre una uscita appropriata per ciascun ingresso è dato. Naturalmente, se abbiamo già un set completo privo di rumore di vettori di ingresso e uscita, quindi una semplice tabella di look-up sarebbe sufficiente. Tuttavia, se vogliamo che il sistema di generalizzare. vale a dire produrre risultati adeguati per gli ingressi non ha mai visto prima, poi una rete neurale che ha imparato come mappare tra gli ingressi e le uscite (cioè il nostro training set) conosciute spesso fare un buon lavoro per i nuovi ingressi pure. Io presumo che il lettore è già familiarità con C, e, per maggiori dettagli sulle reti neurali in generale, semplicemente rimandare il lettore al newsgroup comp. ai. neural reti e reti neurali associate FAQ. Quindi, cominciamo. Un singolo neurone (cioè unità di elaborazione) prende totale di ingresso In e produce una attivazione uscita Out. Io prendo questo per essere la funzione sigma se altre funzioni di attivazione sono spesso utilizzati (ad esempio, lineare o tangente iperbolica). Questo ha l'effetto di schiacciamento l'infinita gamma di In nella gamma 0 a 1. Essa ha anche la proprietà conveniente che la sua derivata assume la forma particolarmente semplice SigmoidDerivative sigmoideo (1,0 - sigma) Tipicamente, l'ingresso IN in un dato neurone sarà la somma pesata di attivazioni di uscita di alimentazione in da un certo numero di altri neuroni. È conveniente pensare alle attivazioni scorre attraverso strati di neuroni. Quindi, se ci sono i neuroni NumUnits1 nello strato 1, l'attivazione totale che scorre nel nostro strato 2 neurone è solo la somma su Layer1OutiWeighti. dove Weighti è il strengthweight del collegamento tra unità i nello strato 1 e la nostra unità nello strato 2. Ciascun neurone avrà anche una polarizzazione, o stato di riposo, che si aggiunge alla somma di input, ed è conveniente per chiamare questo weight0 . Possiamo quindi writeLayer2In Weight0 iniziare con la polarizzazione per (i 1 i lt NumUnits1 i) Layer2In Layer1Outi Weighti aggiungo dei contributi ponderati dal livello 1 Layer2Out 1,0 (1,0 exp (-Layer2In)) calcolare sigma per dare attivazione Normalmente strato 2 avrà molte unità come pure, per cui è opportuno scrivere i pesi tra unità i nel livello 1 e l'unità j nel livello 2 come un array Weightij. Così, per ottenere l'output di unità j in layer 2 abbiamo Layer2Inj Weight0j per (i 1 i lt NumUnits1 i) Layer2Inj Layer1Outi Weightij Layer2Outj 1,0 (1,0 exp (-Layer2Inj)) ricordo che in C gli indici degli array partono da zero, non uno , così avremmo dichiarare le nostre variabili asdouble Layer1OutNumUnits11 doppia doppia Layer2InNumUnits21 Layer2OutNumUnits21 doppia WeightNumUnits11NumUnits21 (o, più probabilmente, dichiarare puntatori e utilizzare calloc o malloc per allocare la memoria). Naturalmente, abbiamo bisogno di un altro ciclo per ottenere tutto il livello 2 outputsfor (j 1 j lt NumUnits2 j) Layer2Inj Weight0j per (i 1 i lt NumUnits1 i) Layer2Inj Layer1Outi Weightij Layer2Outj 1,0 (1,0 exp (-Layer2Inj)) Tre reti livello sono necessarie e sufficiente per molti scopi, così le nostre uscite strato 2 alimentano un terzo strato nello stesso modo come sopra il codice può iniziare a diventare confuso, a questo punto - ho trovato che mantenere un indice separato i, j, k per ogni strato aiuta, come fa una notazione intuitivo per distinguere tra i diversi strati di pesi Weight12 e Weight23. Per ovvie ragioni, per tre reti di livello, è tradizione di chiamare livello 1 livello di input, livello 2 strato nascosto, e lo strato 3 strato di output. La nostra rete assume così la forma familiare che useremo per il resto di questo documento, inoltre, di salvare ottenere tutte le In s e Out s confuso, possiamo scrivere LayerNIn come SumN. Il nostro codice può quindi essere scritto Generalmente avremo tutta una serie di modelli di formazione NumPattern, cioè coppie di ingresso e di indirizzare i vettori di output, etichettati con l'indice p. La rete apprende minimizzando qualche misura dell'errore delle reti uscite effettive rispetto alle uscite bersaglio. Ad esempio, la somma errore quadratico su tutte le unità di output k e tutti i modelli di formazione p sarà dato da errore 0,0 per (p 1 p lt NumPattern p) per i (k 1 k lt NumOutput k) Errore 0.5 (Targetpk - Outputpk) (Targetpk - Outputpk) (il fattore di 0,5 è convenzionalmente incluso per semplificare l'algebra nel derivare l'algoritmo di apprendimento) Se inseriamo il codice di cui sopra per il calcolo delle uscite di rete nel circuito p di questo, si finisce con Ill lasciamo al lettore di erogare. con eventuali indici che dont hanno bisogno ai fini del proprio sistema (ad esempio, gli indici di SumH e SUMO). Lo stadio successivo è quello di regolare iterativamente i pesi per minimizzare l'errore reti. Un modo standard per farlo è di discesa del gradiente sulla funzione di errore. Possiamo calcolare quanto l'errore viene modificata da una piccola variazione di ciascun peso (cioè calcolare le derivate parziali d Error d peso) e spostare i pesi di una piccola quantità nella direzione che riduce l'errore. La letteratura è piena di variazioni su questo approccio generale - Inizierò con lo standard on-line di back-propagazione con l'algoritmo slancio. Questo non è il posto per passare attraverso tutti la matematica, ma per la somma di cui sopra errore quadratico siamo in grado di calcolare e applicare una iterazione (o epoca) del peso richiesto cambia DeltaWeightIH e DeltaWeightHO utilizzando errore 0,0 per (p 1 p lt NumPattern p) for (j 1 j lt NumHidden j) SumHpj WeightIH0j per (i 1 i lt NumInput i) SumHpj Inputpi WeightIHij Hiddenpj 1,0 (1,0 exp (-SumHpj)) per (k 1 k lt NumOutput k) SumOpk WeightHO0k for (j 1 j lt NumHidden j) SumOpk Hiddenpj WeightHOjk Outputpk 1,0 (1,0 exp (-SumOpk)) Errore 0.5 (Targetpk - Outputpk) (Targetpk - Outputpk) DeltaOk (Targetpk - Outputpk) Outputpk (1,0 - Outputpk) for (j 1 j lt NumHidden j) SumDOWj 0,0 per (k 1 k lt NumOutput k) SumDOWj WeightHOjk DeltaOk DeltaHj SumDOWj Hiddenpj (1,0 - Hiddenpj) for (j 1 j lt NumHidden j) DeltaWeightIH0j eta DeltaHj alfa DeltaWeightIH0j WeightIH0j DeltaWeightIH0j per (i 1 i lt NumInput i) DeltaWeightIHij eta Inputpi DeltaHj alfa DeltaWeightIHij WeightIHij DeltaWeightIHij per (k 1 k lt NumOutput k) DeltaWeightHO0k eta DeltaOk alfa DeltaWeightHO0k WeightHO0k DeltaWeightHO0k for (j 1 j lt NumHidden j) DeltaWeightHOjk eta Hiddenpj DeltaOk alfa DeltaWeightHOjk WeightHOjk DeltaWeightHOjk (C'è chiaramente un sacco di possibilità di riordino, che unisce e semplificare le anse qui - lascerò che per il lettore a fare una volta che hanno capito che cosa le sezioni di codice separati facendo) il peso cambia DeltaWeightIH e DeltaWeightHO sono tutte composte da due componenti.. In primo luogo, il componente eta che è il contributo discesa del gradiente. In secondo luogo, il componente alfa che è un termine di moto che mantiene in modo efficace una media mobile dei contributi cambiamento di peso discesa di gradiente, e quindi leviga i cambiamenti di peso complessivo. Fissaggio buoni valori dei parametri di apprendimento eta e alfa di solito è una questione di tentativi ed errori. Certamente alpha deve essere compreso tra 0 e 1, e un valore diverso da zero solito non velocizzare l'apprendimento. Trovare un buon rapporto qualità eta dipenderà dal problema, e anche dal valore scelto per alpha. Se è troppo basso, la formazione sarà inutilmente lento. Avere troppo grande farà sì che i cambiamenti di peso a oscillare selvaggiamente, e può rallentare o addirittura impedire l'apprendimento del tutto. (Io in genere iniziare cercando eta 0,1 e esplorare gli effetti di volte raddoppiare o dimezzare esso.) Il processo di formazione completo consisterà di ripetere gli aggiornamenti peso di cui sopra per un certo numero di epoche (utilizzando un altro ciclo for) fino a qualche crierion errore è soddisfatta, per esempio l'errore scende sotto un certo piccolo numero prescelto. (Si noti che, con sigmoidi sulle uscite, l'errore può solo raggiungere esattamente lo zero se i pesi raggiungono l'infinito Si noti inoltre che a volte la formazione può rimanere bloccato in un minimo locale della funzione di errore e mai da nessuna parte il minimo effettivo.) Quindi, abbiamo bisogno di avvolgere l'ultimo blocco di codice in qualcosa di simile a (epoca 1 epoca lt LARGENUMBER epoca) SOPRA cODICE pER un'iterazione se (Error lt SMALLNUMBER) rompersi se i modelli di formazione sono presentati nello stesso ordine sistematico nel corso di ogni epoca, è possibile per oscillazioni di peso a verificarsi. E 'quindi in genere una buona idea di utilizzare un nuovo ordine casuale per i modelli di formazione per ogni epoca. Se mettiamo il modello di formazione NumPattern indici p in ordine casuale in un ranpat array. allora è semplicemente una questione di sostituire il nostro modello di ciclo di formazione Generazione del ranpat matrice casuale non è così semplice, ma il seguente codice farà il lavoro, naturalmente, si deve impostare alcuni pesi della rete iniziale per avviare il processo di apprendimento. Partendo tutti i pesi a zero non è generalmente una buona idea, dato che è spesso un minimo locale della funzione di errore. È normale per inizializzare tutti i pesi con piccoli valori casuali. Se rando () è la funzione del generatore di numeri casuali preferito che restituisce una distribuzione piatta di numeri casuali nel range 0 a 1, e smallwt è la dimensione massima assoluta dei vostri pesi iniziali, poi una sezione del codice di inizializzazione peso sarebbe noti, che è una buona idea per impostare tutte le DeltaWeights iniziali a zero allo stesso tempo. Ora abbiamo abbastanza codice di mettere insieme un programma di rete neurale di lavoro. Ho tagliato e incollato il codice di cui sopra nel nn. c file (che il browser dovrebbe consentire di salvare nel proprio spazio file). Ho aggiunto lo standard include, dichiarato tutte le variabili, difficile codificati i dati di allenamento XOR standard e valori per eta. alfa e smallwt. definito un over semplice rando (). aggiunto alcune istruzioni di stampa per mostrare ciò che sta facendo la rete, e avvolto il tutto in un main (). Il file deve compilare ed eseguire in modo normale (ad esempio utilizzando i comandi UNIX cc nn. c - O - lm - o nn e NN). Ive ha lasciato un sacco per il lettore a fare per convertire questo in un programma utile, ad esempio: Leggere i dati di allenamento da un file Lasciare i parametri per variare durante l'esecuzione di disporre di adeguate dimensioni matrice determinati (eta alfa smallwt NumHidden ecc....) e allocare loro la memoria durante l'esecuzione di risparmio di pesi di file e la loro lettura di nuovo di nuovo Rappresentazione grafica di errori, attivazioni di uscita, ecc durante l'allenamento ci sono anche numerose varianti di rete che potrebbero essere attuate, ad esempio: l'apprendimento in batch, piuttosto che on funzioni di linea di apprendimento alternativi di attivazione (lineare, tanh, ecc) uscite reali (piuttosto che binario) del valore richiedono funzioni di uscita lineari Outputpk SumOpk DeltaOk Targetpk - funzione di costo Outputpk Cross-entropia, piuttosto che Sum Squared Errore Errore - (log Targetpk (Outputpk) ( 1.0 - Targetpk) log (1,0 - Outputpk)) DeltaOk Targetpk - Outputpk formazione separata, validazione e test di set di pesi decadimento Regolarizzazione Ma da qui in poi, sei sul proprio. Spero che hai trovato la pagina questa pagina useful. This è mantenuta da John Bullinaria. Ultimo aggiornamento il 18 novembre 2002. L'scienziato e ingegneri Guida al Digital Signal Processing di Steven W. Smith, Ph. D. Capitolo 26: Reti Neurali (e più) Neural Network Architecture Gli esseri umani e gli altri animali elaborare le informazioni con le reti neurali. Queste sono formate da migliaia di miliardi di neuroni (cellule nervose) lo scambio di impulsi elettrici brevi chiamati potenziali d'azione. algoritmi informatici che imitano queste strutture biologiche sono chiamati formalmente le reti neurali artificiali per distinguerle dalle cose morbidosi all'interno di animali. Tuttavia, la maggior parte degli scienziati e gli ingegneri non sono questo formali e utilizzare la rete neurale termine per includere sia i sistemi biologici e non biologici. ricerca della rete neurale è motivata da due desideri: per ottenere una migliore comprensione del cervello umano, e di sviluppare computer che possono risolvere i problemi astratti e mal definiti. Ad esempio, i computer convenzionali hanno difficoltà a comprendere il linguaggio e il riconoscimento dei popoli facce. In confronto, gli esseri umani fanno molto bene a questi compiti. Molte diverse strutture di rete neurale sono stati provati, alcuni basati su imitare ciò biologo vede al microscopio, alcune basate su un'analisi più matematica del problema. La struttura più comunemente usato è mostrato in Fig. 26-5. Questa rete neurale è formato in tre strati, chiamato livello di input, livello nascosto, e lo strato di output. Ogni strato è costituito da uno o più nodi. rappresentato in questo schema dai piccoli cerchi. Le linee tra i nodi indicano il flusso di informazioni da un nodo all'altro. In questo particolare tipo di rete neurale, l'informazione fluisce solo dall'ingresso all'uscita (cioè, da sinistra a destra). Altri tipi di reti neurali hanno connessioni più complesse, come percorsi di feedback. I nodi del livello di input sono passivi. nel senso che non modificare i dati. Essi ricevono un singolo valore sul loro input e duplicare il valore alle loro uscite multiple. In confronto, i nodi dello strato nascosto e uscita sono attivi. Questo significa che modificano i dati come mostrato in Fig. 26-6. Le variabili: X1 1, X1 2 8230 X1 15 contengono i dati da valutare (vedi Fig 26-5.). Ad esempio, possono essere valori di pixel da un'immagine, campioni provenienti da un segnale audio, quotazioni di borsa nei giorni successivi, ecc Essi possono anche essere l'uscita di qualche altro algoritmo, come ad esempio i classificatori nel nostro esempio il rilevamento del cancro: diametro, luminosità, nitidezza bordo, ecc Ogni valore del livello di input viene duplicato e inviato a tutti i nodi nascosti. Questo è chiamato una struttura completamente interconnesso. Come mostrato in Fig. 26-6, i valori che entrano in un nodo nascosto sono moltiplicati per i pesi. un insieme di numeri predeterminati memorizzati nel programma. Gli ingressi ponderati sono poi aggiunti per produrre un singolo numero. Questo è mostrato nella figura con il simbolo, somma. Prima di lasciare il nodo, questo numero viene fatta passare attraverso una funzione matematica non lineare chiamata sigma. Questa è una curva a forma di s che limita la potenza nodi. Cioè, l'ingresso del sigma è un valore tra - infin e infin, mentre la sua uscita può essere solo tra 0 e 1. Le uscite strato nascosto sono rappresentati nel diagramma di flusso (Fig 26-5) dalle variabili: X2 1, X2 2, X2 3 e 4 X2. Proprio come prima, ciascuno di questi valori sono duplicati ed applicato allo strato successivo. I nodi attivi dello strato uscita unire e modificare i dati per produrre i due valori di uscita di questa rete, X3 1 e 2 X3. Le reti neurali possono avere qualsiasi numero di strati, e qualsiasi numero di nodi per strato. La maggior parte delle applicazioni utilizzano la struttura a tre strati con un massimo di poche centinaia di nodi di ingresso. Lo strato nascosto è solitamente circa 10 le dimensioni del livello di input. In caso di rilevazione di destinazione, il livello di uscita deve un solo nodo. L'uscita di questo nodo è thresholded per fornire una indicazione positiva o negativa della presenza o assenza bersagli nei dati di input. Tabella 26-1 è un programma per effettuare il diagramma di flusso di Fig. 26-5. Il punto chiave è che questa architettura è molto semplice e molto generalizzata. Questo stesso diagramma di flusso può essere usata per vari problemi, indipendentemente dalle loro particolari peculiarità. La capacità della rete neurale per fornire la manipolazione dei dati utili risiede nella corretta selezione dei pesi. Questa è una partenza drammatica dalla elaborazione dell'informazione convenzionale in cui le soluzioni sono descritte nelle procedure passo-passo. Come esempio, immaginate una rete neurale per il riconoscimento di oggetti in un segnale sonar. Supponiamo che 1000 campioni del segnale vengono memorizzati in un computer. Come fa il computer a determinare se questi dati rappresentano un sottomarino, balena, sottomarino montagna, o niente del tutto convenzionale DSP sarebbe affrontare questo problema con la matematica e algoritmi, come la correlazione e l'analisi dello spettro di frequenza. Con una rete neurale, i 1000 campioni vengono semplicemente inseriti nel livello di input, con conseguente valori spuntano dallo strato di output. Selezionando i pesi appropriati, l'uscita può essere configurata per segnalare una vasta gamma di informazioni. Per esempio, ci potrebbero essere uscite per: sottomarino (YesNo), balena (YesNo), Sottomarino montagna (YesNo), ecc Con altri pesi, le uscite potrebbero classificare gli oggetti come: metallo o metalloide, biologico o non biologico, nemico o un alleato, ecc Nessun algoritmi, nessuna regola, nessuna procedura solo un rapporto tra l'ingresso e l'uscita dettato dai valori dei pesi selezionati. Figura 26-7a mostra una visione in funzione sigmoide, matematicamente descritto dalla equazione: La forma esatta del sigma non è importante, solo che è una soglia liscia. Per confronto, un semplice soglia produce un valore di uno quando x gt 0 e un valore di zero quando x lt 0. Il sigma effettua la stessa funzione di base thresholding, ma è anche differenziabile. come mostrato in Fig. 26-7b. Mentre il derivato non viene utilizzato nel diagramma di flusso (Fig. 25-5), è una parte critica di trovare i pesi appropriati da utilizzare. Di più su questo a breve. Un vantaggio del sigma è che c'è una scorciatoia per calcolare il valore della sua derivata: Ad esempio, se x 0, allora s (x) 0,5 (dall'equazione 26-1.), E il primo derivato viene calcolato: s ( x) 0,5 (1 - 0.5) 0.25. Questo non è un concetto fondamentale, solo un trucco per rendere l'algebra più breve. Wouldnt rete neurale essere più flessibile se sigma potrebbe essere regolata sinistra o destra, rendendo centrata su qualche altro valore di x 0 La risposta è sì, e reti più neurali consentono per questo. E 'molto semplice da implementare un nodo aggiuntivo viene aggiunto al livello di ingresso, con il suo ingresso avente sempre un valore di uno. Quando questo viene moltiplicato per i pesi dello strato nascosto, fornisce una polarizzazione (offset DC) per ciascun sigma. Questa aggiunta è detto nodo di polarizzazione. È trattato come gli altri nodi, eccetto per l'ingresso costante. Le reti neurali possono essere fatte senza un sigma o non linearità simili Per rispondere a questa, guardano la rete a tre strati di Fig. 26-5. Se sigmoidi non fossero presenti, i tre strati sarebbero collassano in soli due strati. In altre parole, le sommatorie e pesi degli strati nascosti e di uscita potrebbero essere combinati in un unico livello, con conseguente solo due strati network. The scienziato e Guida Ingegneri di Digital Signal Processing di Steven W. Smith, Ph. D. Capitolo 26: Reti Neurali (e altri) la formazione alla progettazione della rete neurale rete neurale possono essere meglio spiegato con un esempio. La figura 26-8 mostra il problema attaccheremo, individuando le singole lettere in un'immagine di testo. Questo compito pattern recognition ha ricevuto molta attenzione. È abbastanza facile che molti approcci raggiungere il successo parziale, ma abbastanza difficile che non esistono soluzioni perfette. Molti prodotti commerciali di successo sono basate su questo problema, come ad esempio: leggere gli indirizzi sulle lettere per il routing postale, inserimento del documento in word processor, ecc Il primo passo nello sviluppo di una rete neurale è creare un database di esempi. Per il problema di riconoscimento del testo, questo viene realizzato stampando le 26 lettere maiuscole: A, B, C, D 8230 Y, Z, 50 volte su un foglio di carta. Successivamente, queste 1300 lettere vengono convertite in un'immagine digitale utilizzando uno dei molti dispositivi di scansione disponibili per personal computer. Questa immagine digitale di grandi dimensioni è poi diviso in piccole immagini di 10times10 pixel, ognuna contenente una sola lettera. Queste informazioni vengono memorizzate come un database 1,3 Megabyte: immagini 1300 100 pixel per immagine 8 bit per pixel. Useremo le prime 260 immagini in questo database per addestrare la rete neurale (cioè determinare i pesi), e il resto per testare le sue prestazioni. Il database deve contenere anche un modo per identificare la lettera contenuta in ciascuna immagine. Per esempio, un byte addizionale può essere aggiunto ad ogni immagine 10times10, contenente il codice ASCII lettere. In un altro schema, la posizione di ciascuna immagine 10times10 nel database potrebbe indicare quale la lettera è. Ad esempio, le immagini 0 a 49 possono essere tutti un A, immagini 50-99 possono essere tutti una B, ecc Per questa dimostrazione, la rete neurale sarà progettata per un'attività arbitraria: determinare quale delle immagini 10times10 contiene una vocale. cioè A, E, I, O, o U. Questo non può avere alcuna applicazione pratica, ma illustra la capacità della rete neurale per imparare problemi molto astratte pattern recognition. Includendo dieci esempi di ogni lettera nel set di training, la rete (si spera) apprendere le caratteristiche fondamentali che contraddistinguono il bersaglio dalle immagini non bersaglio. La rete neurale utilizzato in questo esempio è il tradizionale a tre strati, architettura completamente interconnessa, come mostrato nelle Figg. 26-5 e 26-6. Ci sono 101 nodi nel livello di input (valori 100 Pixel Plus un nodo bias), 10 nodi nello strato nascosto, e 1 nodo nello strato di output. Quando un'immagine di 100 pixel viene applicato all'ingresso della rete, vogliamo che il valore di uscita per essere vicino a uno se una vocale è presente e vicino allo zero se una vocale non è presente. Non essere preoccupato che il segnale in ingresso è stata acquisita come array bidimensionale (10times10), mentre l'ingresso alla rete neurale è un array monodimensionale. Questa è la vostra comprensione di come i valori dei pixel sono interconnessi alla rete neurale troverà relazioni di proprio. La tabella 26-2 mostra il programma principale per il calcolo dei pesi della rete neurale, con tavolo 26-3 contenente tre subroutine chiamati dal programma principale. Gli elementi dell'array: X11 attraverso X1100, mantengono i valori di livello di input. Inoltre, X1101 contiene sempre un valore di 1, che fornisce l'ingresso al nodo di polarizzazione. I valori di uscita dai nodi nascosti sono contenuti negli elementi dell'array: X21 attraverso X210. La variabile, X3, contiene il valore reti uscita. I pesi dello strato nascosto sono contenuti nella matrice, WH. , Dove il primo indice identifica il nodo nascosto (da 1 a 10), e il secondo indice è il nodo strato di input (da 1 a 101). I pesi dello strato di uscita sono tenuti in WO1 a WO10. Ciò fa un totale di 1020 valori di peso che definiscono come la rete funziona. La prima azione del programma è per impostare ciascun peso di un valore iniziale arbitraria utilizzando un generatore di numeri casuali. Come mostrato in linee 190 e 240, i pesi strato nascosto vengono assegnati valori iniziali tra -0,0005 e 0,0005, mentre i pesi strato di output sono compresi tra -0.5 e 0.5. Questi intervalli sono scelti per essere dello stesso ordine di grandezza che i pesi finali devono essere. Questo si basa su: (1) la gamma di valori nel segnale di ingresso, (2) il numero di ingressi sommati per ogni nodo, e (3) la gamma di valori su cui sigma è attivo, un ingresso di circa -5 lt x lt 5, ed un'uscita 0 a 1. ad esempio, quando 101 ingressi con un valore tipico di 100 sono moltiplicati per il valore di peso tipico di 0.0002, la somma dei prodotti è di circa 2, che è nella gamma attiva dell'ingresso sigmoidi. Se abbiamo valutato le prestazioni della rete neurale utilizzando questi pesi casuali, ci aspettiamo che sia lo stesso di indovinare casuale. L'algoritmo di apprendimento migliora le prestazioni della rete cambiando gradualmente ciascun peso nella direzione corretta. Questo è chiamato un procedimento iterativo, ed è controllato dal programma del ciclo FOR-NEXT in linee 270-400. Ogni iterazione rende i pesi leggermente più efficiente a separare il bersaglio dagli esempi non bersaglio. L'iterazione viene solitamente effettuata fino non vengono effettuate ulteriori miglioramenti. Nelle reti neurali tipici, questo può essere ovunque da dieci a diecimila iterazioni, ma a poche centinaia è comune. Questo esempio esegue 800 iterazioni. Affinché questa strategia iterativa lavorare, ci deve essere un singolo parametro che descrive quanto bene il sistema sta eseguendo. La variabile eSUM (per somma errore) serve questa funzione nel programma. La prima azione all'interno del ciclo di iterazione è impostare eSUM a zero (linea 290) in modo che possa essere usato come un accumulatore. Alla fine di ogni iterazione, il valore di eSUM viene stampato sullo schermo video (linea 380), in modo che l'operatore può assicurare sia compiuti progressi. Il valore di eSUM inizierà alta, e diminuire man mano che la rete neurale è addestrato a riconoscere i bersagli. La figura 26-9 mostra esempi di come eSUM diminuisce le iterazioni procedono. Tutti 260 immagini di addestramento vengono valutati durante ogni iterazione, come controllato dal ciclo FOR-NEXT in linee 310-360. Sottoprogramma 1000 è utilizzato per recuperare le immagini dal database di esempi. Dal momento che questo non è qualcosa di particolare interesse qui, noi descriviamo solo i parametri passati da e per questa subroutine. Subroutine 1000 è entrato con il parametro, LETTERA, essendo compreso tra 1 e 260. Al ritorno, i valori dei nodi di input, X11 per X1100, contengono i valori dei pixel per l'immagine nel database corrispondente al LETTERA. Il valore del nodo di polarizzazione, X1101, viene sempre restituito con un valore costante di uno. Subroutine 1000 restituisce anche un altro parametro, CORRETTO. Questo contiene il valore di uscita desiderato della rete per questo particolare lettera. Cioè, se la lettera nell'immagine è una vocale, corretta sarà restituito con un valore di uno. Se la lettera nell'immagine non è una vocale, corretta sarà restituito con un valore pari a zero. Dopo che l'immagine da trattare viene caricato nel X11 attraverso X1100, subroutine 2000 passa i dati attraverso la rete neurale corrente per produrre il valore del nodo di uscita, X3. In altre parole, subroutine 2000 è la stessa come il programma nella Tabella 26-1, fatta eccezione per un diverso numero di nodi in ogni strato. Questa subroutine calcola anche quanto bene l'attuale rete identifica la lettera come un bersaglio o un non bersaglio. In linea 2210, la variabile ELET (per error-lettera) viene calcolato come differenza tra il valore generato attuale, X3, e il valore desiderato, CORRETTO. Questo rende ELET un valore tra -1 e 1. Tutti i valori 260 per ELET sono combinati (line 340) per formare eSUM, l'errore quadratico totale della rete per l'intero insieme di addestramento. Linea 2220 mostra una opzione che viene spesso incluso nel calcolo l'errore: l'assegnazione di un importanza diversa agli errori di obiettivi e nontargets. Ad esempio, ricordare l'esempio del cancro più indietro in questo capitolo, e le conseguenze di fare un errore falso positivo rispetto a un errore di falsi negativi. Nel presente esempio, si arbitrariamente dichiara che l'errore nel rilevare un obiettivo è cinque volte così male come l'errore di rilevamento di un non bersaglio. In effetti, questo indica la rete a fare meglio con gli obiettivi, anche se danneggia le prestazioni dei nontargets. Sottoprogramma 3000 è il cuore della strategia rete neurale, l'algoritmo per cambiare i pesi ad ogni iterazione. Useremo un'analogia per spiegare la matematica sottostante. Si consideri la situazione di un paracadutista militare caduto dietro le linee nemiche. Egli paracadute per terra in un territorio sconosciuto, solo per scoprire che è così buio egli non posso vedere più di pochi piedi di distanza. I suoi ordini sono di procedere al fondo della valle vicina per iniziare il resto della sua missione. Il problema è che, senza essere in grado di vedere più di un paio di piedi, come fa a farsi strada verso il fondovalle In altre parole, ha bisogno di un algoritmo per regolare la sua posizione xey sulla superficie terrestre in modo da ridurre al minimo la sua elevazione . Questo è analogo al problema di adeguare i pesi della rete neurale, tale che l'errore reti, eSUM, viene minimizzata. Prenderemo in esame due algoritmi per risolvere questo problema: evoluzione e ripida discesa. In evoluzione, il paracadutista prende un salto volante in qualche direzione casuale. Se la nuova elevazione è superiore al precedente, maledice e ritorna alla sua posizione iniziale, dove cerca di nuovo. Se la nuova elevazione è inferiore. si sente una misura del successo, e ripete il processo dalla nuova posizione. Alla fine si raggiungerà il fondo valle, anche se in un percorso molto inefficiente e casuale. Questo metodo è chiamato evoluzione perché è lo stesso tipo di algoritmo impiegato per natura nell'evoluzione biologica. Ogni nuova generazione di una specie ha variazioni casuali dalla precedente. Se queste differenze sono di beneficio per le specie, sono più probabilità di essere mantenuto e passato alla generazione successiva. Questo è un risultato del miglioramento consentire all'animale di ricevere più cibo, sfuggire ai suoi nemici, producono più prole, ecc Se la nuova caratteristica è dannosa, l'animale svantaggiati diviene pranzo per alcuni predatori, e la variazione viene scartato. In questo senso, ogni nuova generazione è una iterazione della procedura di ottimizzazione evolutiva. Quando evoluzione è utilizzato come algoritmo di formazione, ciascun peso della rete neurale è leggermente modificato aggiungendo il valore da un generatore di numeri casuali. Se i pesi modificati fanno una migliore rete (cioè un valore più basso per eSUM), le modifiche vengono mantenute, altrimenti vengono scartati. Mentre questo funziona, è molto lento nel convergenti. Questo è il gergo utilizzato per descrivere il miglioramento continuo viene fatto verso una soluzione ottimale (il fondo valle). In termini più semplici, il programma avrà bisogno di giorni per raggiungere una soluzione, piuttosto che minuti o ore. Fortunatamente, l'algoritmo di discesa più ripida è molto più veloce. Questo è il modo in cui il paracadutista sarebbe naturalmente rispondere: valutare quale strada è in discesa. e spostare in quella direzione. Pensare alla situazione in questo modo. Il paracadutista può muovere un passo verso il nord, e registrare il cambio di elevazione. Dopo il ritorno alla sua posizione originaria, può fare un passo a est, e registrare questo cambiamento di elevazione. Utilizzando questi due valori, si può determinare quale direzione è in discesa. Supponiamo che il paracadutista scende di 10 cm quando si muove un passo nella direzione nord, e scende a 20 cm quando si muove un passo nella direzione est. Per viaggiare direttamente in discesa, ha bisogno di muoversi lungo ogni asse un importo proporzionale alla pendenza lungo tale asse. In questo caso, si potrebbe spostare a nord di 10 passi e ad est di 20 gradini. Questo lo si sposta verso il basso la parte più ripida della pendenza una distanza di Radic 10 2 20 2 passi. In alternativa, potrebbe spostarsi in linea retta nella nuova posizione, 22.4 passi lungo la diagonale. Il punto chiave è: la discesa più ripida è possibile spostando lungo ciascun asse di una distanza proporzionale alla pendenza lungo tale asse. Subroutine 3000 implementa questo stesso algoritmo decente più ripida per i pesi della rete. Prima di entrare subroutine 3000, una delle immagini di esempio è stata applicata allo strato di input e le informazioni propagato all'uscita. This means that the values for: X1 , X2 and X3 are all specified, as well as the current weight values: WH. and WO . In addition, we know the error the network produces for this particular image, ELET. The hidden layer weights are updated in lines 3050 to 3120, while the output layer weights are modified in lines 3150 to 3190. This is done by calculating the slope for each weight, and then changing each weight by an amount proportional to that slope . In the paratrooper case, the slope along an axis is found by moving a small distance along the axis (say, Delta x ), measuring the change in elevation (say, Delta E ), and then dividing the two (Delta E Delta x ). The slope of a neural network weight can be found in this same way: add a small increment to the weight value (Delta w ), find the resulting change in the output signal (Delta X3 ), and divide the two (Delta X3 Delta w ). Later in this chapter we will look at an example that calculates the slope this way. However, in the present example we will use a more efficient method. Earlier we said that the nonlinearity (the sigmoid) needs to be differentiable . Here is where we will use this property. If we know the slope at each point on the nonlinearity, we can directly write an equation for the slope of each weight (Delta X3 Delta w) without actually having to perturb it. Consider a specific weight, for example, WO1, corresponding to the first input of the output node. Look at the structure in Figs. 26-5 and 26-6, and ask: how will the output ( X3 ) be affected if this particular weight ( w ) is changed slightly, but everything else is kept the same The answer is: where SLOPE O is the first derivative of the output layer sigmoid, evaluated where we are operating on its curve. In other words, SLOPE O describes how much the output of the sigmoid changes in response to a change in the input to the sigmoid. From Eq. 26-2, SLOPE O can be calculated from the current output value of the sigmoid, X3. This calculation is shown in line 3160. In line 3170, the slope for this weight is calculated via Eq. 26-3, and stored in the variable DX3DW (i. e. Delta X3 Delta w). Using a similar analysis, the slope for a weight on the hidden layer, such as WH1,1, can be found by: SLOPE H1 is the first derivative of the hidden layer sigmoid, evaluated where we are operating on its curve. The other values, X11 and WO1, are simply constants that the weight change sees as it makes its way to the output. In lines 3070 and 3080, the slopes of the sigmoids are calculated using Eq. 26-2. The slope of the hidden layer weight, DX3DW is calculated in line 3090 via Eq. 26-4. Now that we know the slope of each of the weights, we can look at how each weight is changed for the next iteration. The new value for each weight is found by taking the current weight, and adding an amount that is proportional to the slope: This calculation is carried out in line 3100 for the hidden layer, and line 3180 for the output layer. The proportionality constant consists of two factors, ELET, the error of the network for this particular input, and MU, a constant set at the beginning of the program. To understand the need for ELET in this calculation, imagine that an image placed on the input produces a small error in the output signal. Next, imagine that another image applied to the input produces a large output error. When adjusting the weights, we want to nudge the network more for the second image than the first. If something is working poorly, we want to change it if it is working well, we want to leave it alone. This is accomplished by changing each weight in proportion to the current error, ELET. To understand how MU affects the system, recall the example of the paratrooper. Once he determines the downhill direction, he must decide how far to proceed before reevaluating the slope of the terrain. By making this distance short, one meter for example, he will be able to precisely follow the contours of the terrain and always be moving in an optimal direction. The problem is that he spends most of his time evaluating the slope, rather than actually moving down the hill. In comparison, he could choose the distance to be large, say 1000 meters. While this would allow the paratrooper to move rapidly along the terrain, he might overshoot the downhill path. Too large of a distance makes him jump all over the country-side without making the desired progress. In the neural network, MU controls how much the weights are changed on each iteration. The value to use depends on the particular problem, being as low as 10 -6. or as high as 0.1. From the analogy of the paratrooper, it can be expected that too small of a value will cause the network to converge too slowly. In comparison, too large of a value will cause the convergence to be erratic, and will exhibit chaotic oscillation around the final solution. Unfortunately, the way neural networks react to various values of MU can be difficult to understand or predict. This makes it critical that the network error (i. e. ESUM) be monitored during the training, such as printing it to the video screen at the end of each iteration. If the system isnt converging properly, stop the program and try another value for MU.
Top 10 regole per trading di successo La maggior parte delle persone che sono interessati ad imparare come diventare commercianti redditizi necessario spendere solo pochi minuti on-line prima di leggere frasi come piano vostro commercio commercio vostro piano e tenere le perdite al minimo. Per i nuovi operatori, questi bocconcini di informazioni possono sembrare più come una distrazione rispetto a qualsiasi consigli pratici. I nuovi operatori spesso vogliono solo sapere come impostare i loro grafici in modo che possano in fretta e fare soldi. Per avere successo nel trading, tuttavia, si ha la necessità di capire l'importanza e aderire ad un insieme di regole che hanno guidato tutti i tipi di operatori, con una varietà di conto trading dimensioni. Ogni regola da solo è importante, ma quando lavorano insieme gli effetti sono forti. Trading con queste regole può aumentare notevolmente le probabilità di successo nei mercati. Regola numero 1: Utilizzare sempre un piano di trading Un pia...
Comments
Post a Comment