Com es crea una xarxa neuronal des de zero a Python

Bloc

Com es crea una xarxa neuronal des de zero a Python

Com es crea una xarxa neuronal des de zero a Python

Què és una xarxa neuronal?

Xarxes neuronals són com els cavalls de treball de Aprenentatge profund . Amb prou dades i potència computacional, es poden utilitzar per resoldre la majoria dels problemes de l’aprenentatge profund. És molt fàcil utilitzar una biblioteca Python o R per crear una xarxa neuronal i entrenar-la en qualsevol conjunt de dades i obtenir una gran precisió.



La majoria de textos introductoris a les xarxes neuronals presenten analogies cerebrals a l’hora de descriure-les. Sense aprofundir en les analogies cerebrals, em resulta més fàcil descriure simplement les xarxes neuronals com una funció matemàtica que assigna una entrada determinada a una sortida desitjada.

Les xarxes neuronals consten dels components següents



  • An capa d’entrada , x
  • Una quantitat arbitrària de capes amagades
  • An capa de sortida , ŷ
  • Un conjunt de peses i biaixos entre cada capa, W i b
  • Una elecció de funció d’activació per a cada capa oculta, σ . En aquest tutorial, utilitzarem una funció d’activació de Sigmoid.

El diagrama següent mostra l’arquitectura d’una xarxa neuronal de 2 capes ( tingueu en compte que la capa d’entrada normalment s’exclou quan es compta el nombre de capes d’una xarxa neuronal )
Com es crea una xarxa neuronal des de zero a Python
Arquitectura d'una xarxa neuronal de 2 capes

Crear una classe de xarxa neuronal a Python és fàcil.



class NeuralNetwork: def __init__(self, x, y): self.input = x self.weights1 = np.random.rand(self.input.shape[1],4) self.weights2 = np.random.rand(4,1) self.y = y self.output = np.zeros(y.shape)

Formació de la xarxa neuronal

reacciona el selector desplegable natiu

La sortida ŷ d'una xarxa neuronal simple de dues capes és:

Com es crea una xarxa neuronal des de zero a Python

És possible que noteu que a l’equació anterior, els pesos IN i els biaixos b són les úniques variables que afecten la sortida ŷ.

Naturalment, els valors adequats per als pesos i els biaixos determinen la força de les prediccions. Es coneix com a procés d’ajust dels pesos i biaixos a partir de les dades d’entrada formació de la xarxa neuronal.

Cada iteració del procés de formació consisteix en els passos següents:

  • Càlcul de la sortida prevista ŷ , conegut com feedforward
  • Actualització dels pesos i biaixos, coneguts com propagació posterior

El gràfic seqüencial següent il·lustra el procés.

Com es crea una xarxa neuronal des de zero a Python

Feedforward

Com hem vist al gràfic seqüencial anterior, el feedforward és simplement un càlcul simple i, per a una xarxa neuronal bàsica de 2 capes, la sortida de la xarxa neuronal és:

com canviar la contrasenya del mojang

Com es crea una xarxa neuronal des de zero a Python

Afegim una funció feedforward al nostre codi Python per fer exactament això. Tingueu en compte que per simplicitat, hem assumit que els biaixos són 0.

class NeuralNetwork: def __init__(self, x, y): self.input = x self.weights1 = np.random.rand(self.input.shape[1],4) self.weights2 = np.random.rand(4,1) self.y = y self.output = np.zeros(self.y.shape) def feedforward(self): self.layer1 = sigmoid(np.dot(self.input, self.weights1)) self.output = sigmoid(np.dot(self.layer1, self.weights2))

Tot i això, encara necessitem una manera d’avaluar la bondat de les nostres prediccions (és a dir, a quina distància estan les nostres prediccions)? El Funció de pèrdua ens permet fer exactament això.

Funció de pèrdua

Hi ha moltes funcions de pèrdua disponibles i la naturalesa del nostre problema hauria de dictar la nostra elecció de la funció de pèrdua. En aquest tutorial, farem servir un senzill error de suma de places com la nostra funció de pèrdua.

Com es crea una xarxa neuronal des de zero a Python

És a dir, l’error de suma de quadrats és simplement la suma de la diferència entre cada valor predit i el valor real. La diferència es quadra de manera que mesurem el valor absolut de la diferència.

El nostre objectiu en l’entrenament és trobar el millor conjunt de pesos i biaixos que minimitzi la funció de pèrdua.

Propagació posterior

Ara que hem mesurat l’error de la nostra predicció (pèrdua), hem de trobar una manera de fer-ho propagar tornar l’error i actualitzar els nostres pesos i biaixos.

Per conèixer la quantitat adequada per ajustar els pesos i els biaixos, hem de conèixer el derivada de la funció de pèrdua respecte als pesos i biaixos .

Recordem a partir del càlcul que la derivada d’una funció és simplement el pendent de la funció.

Com es crea una xarxa neuronal des de zero a Python
Algorisme de descens de gradient

Si tenim la derivada, simplement podem actualitzar els pesos i els biaixos augmentant / reduint amb ella (consulteu el diagrama anterior). Això es coneix com baixada de gradient .

Tot i això, no podem calcular directament la derivada de la funció de pèrdua respecte als pesos i els biaixos perquè l’equació de la funció de pèrdua no conté els pesos i els biaixos. Per tant, necessitem el regla de cadena per ajudar-nos a calcular-lo.

Com es crea una xarxa neuronal des de zero a Python
Regla de cadena per calcular la derivada de la funció de pèrdua respecte als pesos. Tingueu en compte que per simplicitat, només hem mostrat la derivada parcial suposant una xarxa neuronal d’una capa.

Uf! Això era lleig, però ens permet obtenir el que necessitàvem: la derivada (pendent) de la funció de pèrdua respecte als pesos, de manera que podem ajustar els pesos en conseqüència.

Ara que ho tenim, afegim la funció de propagació posterior al nostre codi Python.

class NeuralNetwork: def __init__(self, x, y): self.input = x self.weights1 = np.random.rand(self.input.shape[1],4) self.weights2 = np.random.rand(4,1) self.y = y self.output = np.zeros(self.y.shape) def feedforward(self): self.layer1 = sigmoid(np.dot(self.input, self.weights1)) self.output = sigmoid(np.dot(self.layer1, self.weights2)) def backprop(self): # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1 d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output))) d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1))) # update the weights with the derivative (slope) of the loss function self.weights1 += d_weights1 self.weights2 += d_weights2

Per obtenir una comprensió més profunda de l'aplicació del càlcul i la regla de la cadena en la propagació posterior, us recomano aquest tutorial de 3Blue1Brown.

on comprar cummies

Unint-ho tot

Ara que tenim el nostre codi python complet per avançar i propagar-nos enrere, apliquem la nostra xarxa neuronal en un exemple i vegem com funciona.

Com es crea una xarxa neuronal des de zero a Python

La nostra xarxa neuronal hauria d'aprendre el conjunt ideal de peses per representar aquesta funció. Tingueu en compte que no és exactament trivial que calculem els pesos només mitjançant la inspecció.

Formem la xarxa neuronal per a 1500 iteracions i vegem què passa. Si observem el gràfic de pèrdues per iteració següent, podem veure clarament la pèrdua decreix monotònicament cap al mínim. Això és coherent amb l'algorisme de descens de gradient que hem comentat anteriorment.

Com es crea una xarxa neuronal des de zero a Python

Vegem la predicció (sortida) final de la xarxa neuronal després de 1500 iteracions.

Com es crea una xarxa neuronal des de zero a Python
Prediccions després de 1500 iteracions d'entrenament

Ho hem fet! El nostre algoritme de retroalimentació i propagació inversa va entrenar la xarxa neuronal amb èxit i les prediccions convergien als valors reals.

Tingueu en compte que hi ha una lleugera diferència entre les prediccions i els valors reals. Això és desitjable, ja que impedeix excés d’adequació i permet que la xarxa neuronal ho faci generalitzar és millor que no es vegin dades.

Que segueix?

Afortunadament per a nosaltres, el nostre viatge no s’ha acabat. Encara n’hi ha molt per conèixer les xarxes neuronals i l'aprenentatge profund. Per exemple:

pàgina d'inici de sessió per correu electrònic sbcglobal.net
  • Quina altra funció d’activació podem utilitzar a més de la funció Sigmoid?
  • Utilitzant un fitxer taxa d’aprenentatge a l’hora d’entrenar la xarxa neuronal
  • Utilitzant convolucions per a tasques de classificació d'imatges

Aviat escriuré més sobre aquests temes, així que seguiu-me a Medium i estigueu atents a ells.

Pensaments finals

Sens dubte, he après molt a escriure la meva pròpia xarxa neuronal des de zero.

Tot i que les biblioteques d’aprenentatge profund com TensorFlow i Keras faciliten la creació de xarxes profundes sense entendre completament el funcionament intern d’una xarxa neuronal, trobo que és beneficiós per als aspirants a científic de dades a obtenir una comprensió més profunda de les xarxes neuronals.

Aquest exercici ha suposat una gran inversió del meu temps i espero que també us sigui útil.

# aprenentatge profund #python # aprenentatge automàtic # ciència de dades