Condividi tramite



Febbraio 2019

Volume 34 Numero 2

Il presente articolo è stato tradotto automaticamente.

[Artificially Intelligent]

Approfondimento sulle reti neurali

Dal Frank La La | Febbraio 2019

Frank La VigneLe reti neurali sono un elemento fondamentale di molte soluzioni avanzate di intelligenza artificiale (AI). Tuttavia, poche persone derstand di annullare la le basi di matematica o strutturali di core di questo concetto. Mentre ricerche iniziali in neural networks date nuovamente decenni, non è stato fino a poco tempo che le dimensioni del set di dati di training e la potenza di calcolo rese pratiche per uso generale.

Le reti neurali o, più specificamente, reti neurali artificiali, regime di controllo libero sono basate su reti neurali biologiche in cui il cervello di animali. Mentre non un algoritmo di per sé, una rete neurale è un tipo di framework per gli algoritmi elaborare l'input e produrre un output "appreso". Le reti neurali sono rivelate utili all'esecuzione di attività che i metodi di programmazione tradizionali abbiano la risoluzione di problemi gravi. Anche se esistono diverse varianti di reti neurali, condividono tutti la stessa struttura di base e concetti. Esistono Framework come Keras, progettato per renderli più facile da implementare e nascondere molti dettagli di implementazione. Tuttavia, mai completamente compreso la potenza e la bellezza di reti neurali fino a quando non è stato necessario programmare uno manualmente. Che sarà l'obiettivo di questa colonna: per compilare una semplice rete neurale da zero con Python.

I neuroni e le reti neurali

Prima di creare una rete neurale da zero, è importante comprendere i relativi componenti principali. Ogni rete neurale è costituito da una serie di nodi connessi chiamato neuroni. A sua volta, ogni neurone fa parte di una rete di neuroni disposti su livelli. Ogni neurone in ogni livello è connesso a ogni neurone nel livello successivo. Ogni neurone artificiali accetta una serie di input e calcola un valore di somma ponderata. Il neurone attiverà o non è basata sull'output della funzione di attivazione, che accetta tutti i valori di input e i pesi con una distorsione e calcola un numero. Questo numero è un valore compreso tra -1 e 1 o 0 e 1, a seconda del tipo di funzione di attivazione. Questo valore viene quindi passato a altri neuroni connesso al livello successivo in un processo denominato propagazione in avanti.

Per quanto riguarda i livelli, esistono tre tipi di base: livelli di input, i livelli nascosti e i livelli di output. Livelli di input rappresentano i dati di input, mentre il livello di output contiene l'output. I livelli nascosti determinano la profondità della rete neurale, ovvero si tratta da cui proviene il termine "apprendimento". In pratica, le reti neurali possono presentare centinaia di livelli nascosti, con il limite massimo solo in fase di potenza di elaborazione disponibili.

Propagazione di inoltra

Propagazione forward è il processo mediante il quale i flussi di dati tramite una rete neurale dal livello di input per il livello di output. Questa operazione implica calcolando una somma ponderata dei tutti gli input e considerando la distorsione. Una volta che viene calcolata la somma ponderata, quindi viene eseguito tramite una funzione di attivazione. Usando il neurone nel figura 1 ad esempio, il neurone dispone di due input, x2, insieme ai due pesi di, s1 e S2 e x1. La somma ponderata è rappresentata da z, mentre il valore rappresenta il valore calcolato dalla funzione di attivazione quando ha passato il valore della somma ponderata. È importante ricordare che l'obiettivo della funzione di attivazione deve comprimere l'output del neurone di in un valore compreso tra un intervallo. Distorsione viene aggiunta per ottimizzare la sensibilità del neurone.

Inoltrare la propagazione in una rete neuraleFigura 1 inoltro propagazione in una rete neurale

Per illustrare questo scenario, potrebbe essere preferibile passare attraverso il codice. Per semplificare le operazioni non crittografato, si utilizzerà i nomi delle variabili che corrispondono a quelli delle figura 1. Per iniziare, avviare un Notebook di Jupyter (per altre informazioni su esso, fare clic qui: msdn.com/magazine/mt829269), quindi immettere quindi seguenti in una cella vuota ed eseguire:

x1 = .5
w1 = .2
x2 = 4
w2 = .5
b = .03

z = x1 * w1 + x2 * w2 + b

print (z)

Il valore di z, la somma ponderata, è 2.13. È importante ricordare che il passaggio successivo consiste nell'eseguire questo valore tramite una funzione di attivazione. Successivamente, immettere il codice seguente in una nuova cella per creare un'attivazione
funzione ed eseguirlo:

import numpy as np
def sigmoid_activation(weighted_sum):
  return 1.0 / (1.0 + np.exp(-1 * weighted_sum))
a = sigmoid_activation(z)
print(a)

L'output dovrebbe mostrare che un è uguale a 0.8937850083248244. In una rete neurale a più livelli, il valore di una viene passata al livello successivo. Di conseguenza, le attivazioni di un livello di propagare a quella successiva e, infine, tramite l'intera rete.

Il sigmoid_activation restituisce valori compresi tra 0 e 1 indipendentemente dalle dimensioni o piccole dimensioni che è il numero. Immettere il codice seguente per testare questa funzione:

print(sigmoid_activation(1000000))
print(sigmoid_activation(.000001))

L'output deve essere letto 1.0 e approssimativamente 0,50, rispettivamente.

Per altre informazioni sulla costante matematica e, consultare l'articolo di Wikipedia sull'argomento (bit.ly/2s8VL9Q).

Funzionamento di una rete neurale

Data la relativa semplicità della struttura e la matematica di una rete neurale, è naturale chiedersi come può essere applicata a un'ampia gamma di problemi di intelligenza artificiale. La potenza è nella rete, non necessariamente i neuroni autonomamente. Ogni neurone in una rete neurale rappresenta una combinazione di valori di input, i pesi e distorsioni. La formazione, i pesi appropriati e i valori possono essere determinati.

A questo punto è sentito senza dubbio sul set di dati MNIST, che viene comunemente usato come una sorta di "Hello World" per le reti neurali. Che avevo visto, decine di volte prima che il concetto di reti neurali come siano stati eseguiti infine selezionato per l'utente corrente. Se non si ha familiarità con il problema, sono disponibili numerosi esempi online che suddividerla (vedere varianceexplained.org/r/digit-eda). La sfida di set di dati MNIST illustra chiaramente quanto sia facile per le reti neurali eseguire le attività che hanno baffled gli approcci tradizionali algoritmici da decenni.

Ecco il problema di riepilogo, data un'immagine in scala di grigi 28 x 28 pixel di una cifra scritto a mano che una rete neurale deve imparare a leggere come valore corretto. Tale immagine a pixel 28 x 28 è costituito da 784 singoli valori numerici compreso tra 0 e 255, rendendo più semplice immaginare la struttura del livello di input. Il livello di input è costituito da 784 neuroni, con i valori passati tramite una funzione di attivazione che assicura che i valori sono compresi tra zero e uno. Pertanto, più chiaro pixel avrà un valore più vicino a uno e scuri avrà un valore più vicino a zero. Il livello di output è costituito da 10 neuroni, uno per ogni cifra. Il neurone con il massimo valore rappresenta la risposta. Ad esempio, se il neurone per otto ha il valore più alto della funzione di attivazione, quindi la rete neurale ha determinato che otto è il valore di output.

Aggiungere solo due livelli nascosti, con 32 neuroni ognuno, avrà un effetto determinante. In che modo? È importante ricordare che ogni neurone sia connesso a ogni neurone nel livello precedente e il livello successivo. Ciò significa che esistono pesi 784 x 32 nel primo livello, i pesi di 32 x 32 nel secondo livello e pesi 32 x 10 nel terzo livello. Sono inoltre disponibili 32 + 32 + 10 pregiudizi che devono essere aggiunti. Che produce un totale complessivo di 26,506 valori modificabili e in questo esempio relativamente semplice di una rete neurale a tre livelli, poco più 26,506 pesi e distorsioni. In effetti, ciò significa che esistono 26,506 parametri da modificare per raggiungere un output ideale. Per una visualizzazione eccellente e
spiegazione di questa struttura e le potenzialità necessarie per esso, guardare il "ma cosa * è * una rete neurale? | Apprendimento avanzato, capitolo 1" video su YouTube in bit.ly/2RziJVW. E per la sperimentazione interattiva con le reti neurali, assicurarsi di consultare playground.tensorflow.org.

Tenere presente che una rete neurale reali può avere centinaia di migliaia di neuroni centinaia di livelli. È presente un numero rilevante di parametri che offre la possibilità di eseguire attività che sono stati in genere non è in grado di programmi informatici uncanny reti neurali. Con tutti questi "misure e indicatori del" ha poco chiedersi come queste relativamente semplice
strutture possano affrontare molte attività. Questo è anche il motivo per cui una rete neurale di training richiede molta potenza di elaborazione e rende ideale per questo tipo di calcolo con architettura altamente parallelo GPU.

Creazione di una rete neurale

Con la struttura e costanti matematiche illustrato, è possibile creare una rete neurale. Immettere il codice nel figura 2 in una nuova cella ed eseguirlo. La funzione di inizializzazione di rete neurale semplifica la creazione di reti neurali multistrate.

Figura 2 Creazione di una rete neurale

def initialize_neural_network(num_inputs, num_hidden_layers, 
  num_nodes_hidden, num_nodes_output):
    
  num_nodes_previous = num_inputs # number of nodes in the previous layer

  network = {}
    
  # Loop through each layer and randomly initialize 
  # the weights and biases associated with each layer.
  for layer in range(num_hidden_layers + 1):
        
    if layer == num_hidden_layers:
      layer_name = 'output' 
      num_nodes = num_nodes_output
    else:
      layer_name = 'layer_{}'.format(layer + 1) 
      num_nodes = num_nodes_hidden[layer] 
        
    # Initialize weights and bias for each node.
    network[layer_name] = {}
    for node in range(num_nodes):
      node_name = 'node_{}'.format(node+1)
      network[layer_name][node_name] = {
        'weights': np.around(np.random.uniform(size=num_nodes_previous), 
          decimals=2),
        'bias': np.around(np.random.uniform(size=1), decimals=2),
      }
    
    num_nodes_previous = num_nodes

  return network

Per creare una rete neurale con cinque livelli nascosti con 32 nodi di ogni 10 input e due output, immettere il codice seguente in una cella vuota e quindi eseguirlo:

network1 = initialize_neural_network(10, 5, [32, 32, 32, 32, 32], 2)

Per creare una rete dotata di una struttura affinché corrispondano alla rete neurale precedente descritta per risolvere il problema MNIST, regolare i parametri come indicato di seguito:

mnist_network = initialize_neural_network(784, 2, [32, 32], 10)
print(network1)

Questo codice crea una rete neurale con nodi di input 784, due livelli nascosti con 32 nodi e un livello di output di 10 nodi. Si noti che l'output visualizza le reti in formato JSON. Si noti inoltre che i pesi e distorsioni vengono inizializzate su valori casuali.

Esplorazione della rete neurale

Finora, abbiamo la struttura di una rete neurale, ma è stata ancora eseguita alcuna operazione con esso. A questo punto, passiamo alla creazione di un input per network1, con 10 nodi di input, come illustrato di seguito:

from random import seed
np.random.seed(2019)
input_values = np.around(np.random.uniform(size=10), decimals=2)

print('Input values = {}'.format(input_values))

L'output sarà una matrice numpy di 10 valori casuali che servirà come valori di input per la rete neurale. Successivamente, per visualizzare i pesi e distorsioni per il primo nodo di primo livello, immettere il codice seguente:

node_weights = network1['layer_1']['node_1']['weights']
node_bias = network1['layer_1']['node_1']['bias']

print(node_weights)
print(node_bias)

Si noti che esistono 10 valori per i pesi e un valore per la deviazione. Successivamente, immettere il codice seguente per creare una funzione che calcola la somma ponderata:

def calculate_weighted_sum(inputs, weights, bias):
  return np.sum(inputs * weights) + bias

A questo punto immettere il codice seguente per calcolare e visualizzare la somma ponderata (z) per questo nodo:

weighted_sum_for_node = calculate_weighted_sum(inputs, node_weights, node_bias)
print('Weighted sum for layer1, node1 = {}'.format(
  np.around(weighted_sum_for_node[0], decimals=2)))

Il valore restituito deve essere 3.15. Successivamente, utilizzare la funzione sigmoid_activation per calcolare un valore per questo nodo, come indicato di seguito:

node_output_value  = sigmoid_activation(weighted_sum_for_node)
print('Output value for layer1, node1 = 
  {}'.format(np.around(node_output_value[0], decimals=2)))

Il valore di output finale di questo nodo è 0,96. Questo è il valore che verrà passato a tutti i neuroni nel livello successivo.

È possibile sperimentare ed eseguire l'iterazione anche se uno dei nodi più o meno 5,600 in questa rete. In alternativa, si potrebbero ripetere i passaggi descritto per ciascuno di questi nodi per ottenere una valutazione per il volume di calcoli in una rete neurale. Naturalmente, si tratta di un'attività eseguita meglio a livello di codice. Mi occuperò di questo e su come eseguire il training di una rete neurale nella colonna successiva.

Conclusioni

Le reti neurali hanno portato a innovazioni relative incredibile di intelligenza artificiale e sono state applicate a problemi reali difficili, ad esempio riconoscimento vocale il riconoscimento e nella visione artificiale con notevole successo. Mentre le relative strutture possono essere complessi, vengono apportate degli elementi costitutivi relativamente semplice. I neuroni sono disposti su livelli in una rete neurale e ogni neurone passa i valori. Di conseguenza, i valori di input a catena in tutta la rete e influenzano sull'output.

I neuroni stessi sono semplici e di eseguono funzioni matematiche di base. Questi diventano potenti, tuttavia, quando sono connessi tra loro. Il numero di valori modificabile anche in reti neurali semplici offre una notevole controllo sull'output e può rivelarsi utile nel training.

Mentre in questo articolo è incentrato sulla compilazione di una rete neurale in Python, qualsiasi linguaggio di programmazione è stato usato per creare una rete neurale. Sono disponibili esempi online viene eseguito in JavaScript, C#, Java o un numero qualsiasi di moderni linguaggi di programmazione. Se Python è ideale, tuttavia, è la disponibilità di Framework supportato su larga scala, ad esempio Keras, per rendere più semplice la creazione di reti neurali.


Frank La Vigne lavora in Microsoft come un professionista di soluzioni di tecnologia di intelligenza artificiale dove aiuta le aziende ottenere migliori risultati per usufruire al meglio i propri dati con analitica e intelligenza artificiale. Ha inoltre CO-host il DataDriven podcast. Il suo blog è regolarmente ed è possibile guardare lui sul suo canale YouTube, "Di Frank mondo TV" (FranksWorld.TV).


Discutere di questo articolo nel forum di MSDN Magazine