¿Cómo funciona una red neuronal?

Escribí una red neuronal artificial desde cero hace 2 años, y al mismo tiempo, no comprendí cómo funcionaba realmente una red neuronal artificial.

¿¿Pero cómo??

Así que hace dos años, vi un bonito tutorial de red neuronal artificial en YouTube de David Miller en c ++.

No conocía ningún C ++ en ese entonces, pero Java y C ++ tienen un aspecto algo similar.

Entonces, en ese momento, vi el tutorial, y por un momento comencé a pensar en una imagen general de lo que estaba sucediendo.

Después de 2 semanas más o menos de pensar en cómo se organizó el código de David en aquel entonces, había desarrollado un modelo mental de la red neuronal, que incluía todas las funciones y todos los atributos relevantes (a veces mi memoria no me traiciona). Entonces, desde cero, luego transcribí lo que aprendí en forma de código Java.

¡Sorprendentemente, según mi modelo mental, la red neuronal funcionó bien!

Es cierto que esa no era la mejor manera de aprender cómo funcionan realmente las redes neuronales. ¡Ese no era un modelo mental apropiado para tener redes neuronales!

Puede que haya conseguido que el modelo funcione bien en ese entonces, pero no puedo decir que poseía una imagen intuitiva de lo que estaba sucediendo.

Por supuesto, esto ahora ha cambiado, como se refleja en mi discusión actual de la red neuronal a lo largo de esta respuesta sobre quora.

¡Resulta entender las cosas de manera efectiva , requiere más que realmente poder escribir con éxito una red neuronal artificial elemental, en base a pensamientos sobre cómo se puede organizar alguna implementación de código de red neuronal artificial!

Lo clave es que, si uno tiene una comprensión intuitiva , el lenguaje de programación o la forma en que organiza el código, ¡tiene poca relación con la comprensión del mecanismo fundamental de las redes neuronales artificiales!

Esto significa que estudiar cómo se organiza algún código en algún lugar , probablemente no le dará una comprensión intuitiva del diseño básico de la red neuronal. Como resultado, es posible que no esté motivado para continuar con el apasionante campo de las redes neuronales artificiales, que es una parte fundamental de la tarea quizás más importante de la humanidad … principalmente porque puede carecer de los bloques de construcción intuitivos necesarios para aventurarse adecuadamente más allá del alcance de las redes neuronales artificiales elementales.

La siguiente respuesta probablemente lo equipará con algunos Buena intuición. (es decir, Introducción divertida + Matemáticas detalladas)!

Agregaré una agradable cobertura adicional sobre lo que es probablemente la serie de red neuronal corta de 4 videos más clara e intuitiva en YouTube por un canal llamado “3blue1brown”.

  1. Primero explicaré el topping extra intuitivo que describo arriba mientras evito las matemáticas.
  2. Luego adjuntaré un enlace de youtube a uno de los videos relevantes de 3blue1brown, mientras hago algunas matemáticas que serán fáciles de entender y más fáciles si uno mira dicho video.
  3. Esta respuesta (mi relleno adicional ) debería hacer 3blue1brown’s videos encantadoramente claros , incluso más claros !!

Digamos que queremos clasificar algunos dígitos de las imágenes individuales de los dígitos (también conocido como permitir que un modelo diga qué dígitos están en las imágenes que se alimentan).

A los humanos les resulta fácil distinguir entre muchos 2 y 1 escritos de forma creativa, pero esto no es trivial para la computadora. Bueno, podemos hacerlo trivial al pensar en la estructura de una red neuronal simple para hacerlo.

Lo que queremos hacer es hacer que la red neuronal aprenda cuáles son los dígitos, ajustando la estructura de la red neuronal en función de muchas entradas que en realidad son ejemplos de dígitos correctamente etiquetados.

¿ Pero por qué ajustar su estructura? ¿Y qué diablos es esta estructura de todos modos?

La estructura es una recopilación de datos o “parámetros” que son simplemente una forma de almacenar o memorizar qué son las imágenes, en función de las etiquetas.

De lo contrario, ¿dónde más almacenar lo que significa cada imagen de un dígito? Ciertamente no en ninguna parte.

Una red neuronal tendrá una estructura de entrada para recibir valores de las imágenes de entrada con dígitos escritos en ellas, una estructura “oculta” que actúa como una forma adicional de representar las entradas y una estructura de salida final para etiquetar o almacenar respuestas sobre la imagen de dígitos.

La estructura más oculta que existe es la mayor oportunidad de memorizar las etiquetas correctas de nuestros dígitos.

Las redes neuronales tendrán capas de cada tipo de estructura y múltiples nodos (también conocidos como neuronas) por capa. Además de eso, también hay más estructura que conecta cada capa, formando rutas desde los nodos de una capa hasta los nodos de otra capa. Estas conexiones son pesos . Así que al final hay pesos y neuronas, un conjunto de neuronas que forman cada capa y pesos que los conectan a todos.

Lo que hacemos es pasar datos de entrada, como la imagen de un dígito, en forma de una colección de números que representan cada píxel de la imagen, directamente a la capa de nodos / neuronas del receptor de entrada. Luego hay un proceso de memorización que utiliza la capa de almacenamiento de neuronas oculta o adicional, y luego los pesos comunican esta información a la capa final, que tiene neuronas [matemáticas] 10 [/ matemáticas].

La clasificación de los dígitos implica 10 respuestas posibles [matemáticas] (0-9) [/ matemáticas], por lo que la red neuronal tendrá neuronas de salida [matemáticas] 10 [/ matemáticas], cada una correspondiente a [matemáticas] 0 [/ matemáticas] o [matemáticas] 1 [/ matemáticas] o [matemáticas] 2 [/ matemáticas]… hasta [matemáticas] 9 [/ matemáticas].

El clasificador de dígitos generará [matemática] 1 [/ matemática] para cualquier dígito que cree que está viendo, de lo contrario [matemática] 0 [/ matemática] porque no cree que haya visto otro número.

Le aconsejo que vea estos videos en orden (video 1, video 2, video 3 y video 4), ya sea que aún no comprenda la idea general de la red neuronal o no. Los videos 1 -3 explican la idea general, luego el video 4 entra en el trabajo. Pertenecen al mismo tipo del que te estaba hablando, y son las lecciones más intuitivas que he visto en YouTube hasta ahora. ¡Solo agrego la cereza en la parte superior aquí para que quede súper más clara!

Ahora analicemos el video 4, donde ocurre toda la “magia” / cálculo:

Ahora, si se presta mucha atención, se puede formular lo que está ocurriendo en redes neuronales masivas, “simples”, en las 3 partes simples a continuación:

Parte I – “Hipersuperficies finales” y “Promedios del conjunto de entrenamiento”:

Es útil tener en cuenta que cuando las redes neuronales funcionan, este trabajo se puede observar simplemente calculando mediciones de cambio, desde el contexto de una neurona a la vez con respecto a algún valor objetivo, también conocido como nuestra etiqueta correcta de una imagen de entrada . (es decir, cambios que deberían ocurrir para alterar la estructura de la red neuronal a largo plazo – Ver ” Parte III – Corrección de errores” después de leer el resto de la Parte I )

Para una red neuronal de una sola neurona por capa, obtenemos una hiperesuperficie simple para cada cálculo en una neurona de contexto actual, pero para redes neuronales múltiples de neuronas por capa ( que discutimos principalmente a continuación, porque tales redes neuronales de neuronas múltiples por capa son mucho más poderosas, y podemos hacer cosas como la detección de dígitos ), obtenemos una ” hiperesuperficie final ” para cada cálculo en una neurona de contexto actual, porque necesitamos incorporar el comportamiento de otras neuronas en la misma capa que nuestra neurona actual . Cada neurona por capa tendrá algo que decir sobre los cambios que deben tener lugar en la estructura de los sesgos y los pesos en la red neuronal, por lo que a diferencia de las neuronas neuronales de una sola neurona por capa, donde podríamos preocuparnos menos por las neuronas de la misma capa ( las redes neuronales de capa solo tienen una neurona por capa) en contraste, en redes neuronales múltiples de neurona por capa, las neuronas en la misma capa que alguna neurona actual a partir de la cual se miden los cambios, son considerables como socios que tienen algo que decir sobre qué neurona actual Esta pensando. (Los “cálculos” se explicarán a continuación)

Estas hipersuperficies son componentes para calcular los costos. (Donde los cambios en los costos nos dicen qué tan mal está nuestra red neuronal artificial)

Entonces, por ejemplo, para algunos cambios de costos, calculamos:

  1. Para redes neuronales artificiales de una sola neurona de juguete por capa, en nuestros derivados, hay sumas que forman ” hiperesuperficies ” que van desde neuronas / pesos anteriores, hasta alguna neurona actual. {es decir, [matemáticas] z = (w ^ {L} \ cdot a ^ {L-1} + b ^ {L}) [/ matemáticas]} donde [matemáticas] a [/ matemáticas] es una activación sobre alguna hiperesuperficie previa , y por lo tanto escrito con [matemáticas] L-1 [/ matemáticas] mientras que [matemáticas] w [/ matemáticas] es un peso correspondiente a la misma neurona de la capa de contexto actual para la cual se está midiendo el cambio, y por lo tanto escrito con [matemáticas] L [/matemáticas]. Sin embargo, para redes neuronales artificiales más prácticas que puedan realizar tareas más sofisticadas como la detección de dígitos, tenemos que incorporar índices [matemática] j [/ matemática] y [matemática] k [/ matemática] para indicar que estamos tratando con múltiples pesos y múltiples neuronas por capa [matemática] L [/ matemática], donde [matemática] L [/ matemática] indica alguna capa con una neurona en [matemática] j [/ matemática], donde [matemática] j, k [/ matemática] indica un peso que puede corresponder con esa neurona [matemática] j [/ matemática] u otra neurona [matemática] j + n [/ matemática] en la capa [matemática] L [/ matemática] {es decir [matemática] z_j = (w_ {j , k} ^ {L} \ cdot a_k ^ {L-1} + w_ {j, k + 1} ^ {L} \ cdot a_ {k + 1} ^ {L-1} + b ^ {L}) … [/ Math]} Entonces, como puede ver, en la ecuación anterior, restringimos a [math] L-1 [/ math], pero incrementamos [math] k [/ math] en la notación de peso [math] w_ { j, k} [/ math], ya que consideramos las activaciones de cada neurona [math] k [/ math] en [math] L-1 [/ math], con respecto a cualquier neurona que comparta pesos [math] j, k [/ math] con nuestra neurona actual [math] j [/ math] en [math] L [/ math]. Tenga en cuenta que cualquier término que se vea como “ [matemática] w ^ {L} \ cdot a ^ {L-1} + b ^ {L} [/ matemática] (para neuronas individuales por capa redes neuronales artificiales) y “[matemática] (w_ {j, k} ^ {L} \ cdot a_k ^ {L-1} + w_ {j, k + 1} ^ {L} \ cdot a_ {k + 1} ^ {L-1} + b ^ {L}) [/ math] “(para redes neuronales artificiales de neuronas múltiples por capa) se llama hiperesuperficie en el aprendizaje automático.
  2. Tanto para las redes neuronales simples de una sola neurona por capa como para las redes neuronales múltiples de la neurona por capa, desde el contexto de cualquier neurona actual desde la que se producen cambios, siempre calculamos cambios en sesgos y pesos , cambios en activaciones para nuestra capa actual [matemáticas] L [/ math], pero también cambia en las activaciones de las capas anteriores , que no usamos para el contexto de nuestra neurona actual , pero guardamos para un uso posterior cuando cambiamos nuestro contexto a alguna neurona en alguna capa anterior . Para redes neuronales artificiales de una sola neurona de juguete , donde cada capa se compone de una sola neurona, desde el contexto de alguna neurona actual [matemática] L [/ matemática] ( donde me referiré indistintamente a una neurona como una capa o neurona [matemática ] L [/ math] , dado que para una red neuronal de una neurona por capa solo hay una neurona por capa y, por lo tanto, una neurona puede verse como una capa, así que cuando me veas decir cosas como “neurona en nuestra capa anterior L” … Supongamos simplemente que esa capa L es la neurona.): Calculamos el “gradiente negativo”, también conocido como nuestro costo [matemática] – \ nabla C [/ matemática] por la ecuación [matemática] C = [\ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {W ^ {L}}}, \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {B ^ {L}}}, moreWeightChangeAverages ..] [/ math] donde calculamos los cambios en las activaciones para la capa anterior [math] L [/ matemática] : [matemática] \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {A ^ {L-1} }} [/ math] (observe [math] A ^ {L-1} [/ math]) y almacénelo en alguna variable y guárdelo para uso posterior para alguna neurona en alguna capa anterior [matemática] L-1 [/ matemática]. (Además, tenga en cuenta que a lo largo de este tutorial, uso [matemática] C_g [/ matemática], en lugar de [matemática] C_k [/ matemática] como se ve en el video 4, para evitar confusión con la neurona [matemática] k [/ matemática] ‘ s etiqueta de índice; para [matemática] g [/ matemática] representa un recuento de costo general sobre cualquier cambio medido por el sesgo, el peso o la activación, y no necesita abarcar índices de neurona.) Para la neurona actual [matemática] L [/ matemática], [matemática] C [/ matemática] almacenará las derivadas de Costo [matemática] (a ^ {L} -y) ^ 2 [/ matemática] con respecto a los cambios en los pesos : [matemática] \ frac {\ parcial {C_g}} {\ partial {W ^ {L}}} [/ math] (aviso [math] W ^ L [/ math]), y cambios en los sesgos [math] \ frac {\ partial {C_g}} { \ parcial {B ^ {L}}} [/ matemáticas] (aviso [matemáticas] B ^ L [/ matemáticas]), que incorporan los cambios en las activaciones en [matemáticas] L [/ matemáticas] pero no los cambios en las activaciones de capas anteriores que involucran [matemáticas] A ^ {L-1} [/ matemáticas] presentado anteriormente (cuando dije “aviso [matemática] A ^ {L-1} [/ matemática]”) … ( mirando el árbol de costos en el minuto 5:49 en el video 4 , verá el costo [matemática] C_g [/ matemática ] como elemento inferior del árbol, y una [matemática] a ^ L [/ matemática] como elemento superior. [matemática] \ frac {\ partial {C}} {\ partial {w ^ {L}}} = \ frac {\ partial {z ^ L}} {\ partial {w ^ {L}}} \ frac {\ parcial {a ^ L}} {\ partial {z ^ {L}}} \ frac {\ partial {C_g}} {\ partial {a ^ {L}}} [/ math] puede notar que [math] a ^ L [/ math] es el [math] a ^ L [/ math] en el árbol de costos también, lo que representa la activación en la capa actual [math] L [/ math], pero no de la capa anterior [math] L- 1 [/ matemáticas] ) . Pero, ¿por qué calcular los cambios en las activaciones para alguna capa anterior , y también los cambios en las activaciones en nuestra capa actual ? Ya sabes por qué calculamos los cambios en las activaciones con respecto a nuestra capa actual . (Como se ve en la discusión sobre el minuto 5:49 en el video 4 anterior) Pero qué diablos haremos con esos cambios de activación calculados para la capa anterior ? Calculamos [matemáticas] \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {A ^ {L-1}}} [/ matemáticas], porque representa el cambio con respecto a nuestra activación en nuestra capa anterior; cuando es hora de cambiar el contexto a alguna neurona, en nuestra capa anterior [matemáticas] L-1 [/ matemáticas], calculamos [matemáticas] \ frac {\ partial {C_g}} {\ partial {w ^ {L-1 }}} [/ math] (aviso [math] w ^ {L-1} [/ math]) en lugar de [math] \ frac {\ partial {C_g}} {\ partial {w ^ {L}}} [ / math] (observe [math] w ^ L [/ math]), es decir, nuestro cambio de peso en nuestra nueva capa [math] L-1 [/ math] adyacente a nuestra neurona de contexto actual [math] L [/ matemáticas] en nuestra capa anterior. Por lo tanto, no utilizamos el antiguo término [matemático] \ frac {\ partial {C_g}} {\ partial {a ^ {L}}} [/ matemático] (de [matemático] \ frac {\ parcial {z ^ L}} {\ partial {w ^ {L}}} \ frac {\ partial {a ^ L}} {\ partial {z ^ {L}}} \ frac {\ partial {C_g}} {\ partial {a ^ {L}}} [/ math]) que pertenecía a nuestra capa de salida [math] L [/ math], pero en su lugar utilizamos la nueva [math] \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {A ^ {L-1}}} [/ matemática] término, que se calculó cuando estábamos en alguna neurona de contexto actual [matemática] L [/matemáticas]. (De hecho, al subir en nuestro árbol de costos de cambio en el minuto 2:27 del video 4, puede notar que en lugar de [matemáticas] a ^ L [/ matemáticas], tenemos [matemáticas] a ^ {L-1} [ / matemáticas] !!!) Por supuesto, siguiendo la tradición, calculamos el cambio de activación de costos para nuestra capa anterior [matemáticas] L-2 [/ matemáticas] con respecto a nuestra neurona de contexto actual en [matemáticas] L-1 [ / math], para que podamos guardarlo cuando estemos listos para cambiar los contextos nuevamente a alguna neurona de alguna capa anterior [math] L-2 [/ math]. Se vería así: [matemáticas] \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {A ^ {L-2} }} [/ matemática] aviso [matemática] A ^ {L-2} [/ matemática] ha cambiado de ([matemática] {A ^ {L-1}} [/ matemática]), observando el antiguo término de ecuación [ matemática] \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} {\ partial {A ^ {L-1}}} [/ math]. De todos modos, todos estos cambios, también conocidos como gradientes , eventualmente se usarán para alterar los pesos, sesgos y activaciones en la estructura de nuestra red neuronal. (no cambiamos las activaciones directamente , se calculan a partir de la estructura de pesos y sesgos, mediante funciones de transformación como [math] \ sigma [/ math] en las hipersuperficies que definimos en la Parte I (1) anterior, en algunos “adelante” -pass ”donde simplemente pasamos señales de la imagen de entrada a través de la red sin calcular ningún costo, en lugar de la secuencia de mutación que se ve en la Parte III – Corrección de errores ) Entonces, ahora puede notar que [math] C [/ math] no en realidad existen como neuronas / nodos o pesos en nuestra red neuronal, pero sus valores se usan para afectar la estructura de la red neuronal de sesgos y activaciones de pesos. De todos modos, para redes neuronales artificiales más prácticas que puedan realizar tareas más sofisticadas como la detección de dígitos , también conocidas como redes neuronales de múltiples neuronas por capa; donde cada capa se compone de múltiples neuronas, desde el contexto de alguna neurona actual [matemáticas] j [/ matemáticas] ( enseguida se da cuenta de que ya no nos referimos a neuronas por [matemáticas] L [/ matemáticas] , sino [matemáticas] j [/ math] en [math] L [/ math] , ya que aquí hay varias neuronas en una capa ) : Como de costumbre, calculamos el “gradiente negativo”, también conocido como nuestro costo [math] – \ nabla C [/ math] por ecuación [matemáticas] C = [\ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {W_ {j, k} ^ {L}}}, \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {B_j ^ {L}}} , moreWeightChangeAverages ..] [/ math] donde calculamos los cambios en las activaciones para la capa anterior [math] L [/ math] : [math] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ { L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [/ matemáticas] (aviso [matemáticas] A_k ^ {L-1} [/ matemáticas]) y almacenar en alguna variable, y guárdelo para su uso posterior para alguna neurona en alguna capa anterior [matemática] L-1 [/ matemática]. Para la neurona actual [matemática] L [/ matemática], [matemática] C [/ matemática] almacenará las derivadas de Costo [matemática] (a ^ {L} -y) ^ 2 [/ matemática] con respecto a los cambios en pesos : [matemática] \ frac {\ partial {C_g}} {\ parcial {W_ {j, k} ^ {L}}} [/ matemática] (aviso [matemática] W_ {j, k} ^ L [/ matemática ]) y cambios en los sesgos [matemática] \ frac {\ partial {C_g}} {\ partial {B_j ^ {L}}} [/ matemática] (aviso [matemática] B_j ^ L [/ matemática]), que incorporan como de costumbre, los cambios en las activaciones pero no los cambios en las activaciones de capas anteriores que involucran [matemática] A_k ^ {L-1} [/ matemática]. (Similar a cuando discutimos el árbol de costos en el minuto a las 5:49 en el video 4 para redes neuronales de una sola neurona por capa arriba) De todos modos, por ahora, ya sabes por qué calculamos cambios en las activaciones para alguna capa anterior , y también cambios en activaciones wrt nuestra capa actual; Además de saber por qué calculamos los cambios en las activaciones con respecto a nuestra capa actual, usted sabe que con los cambios de activación calculados para la capa anterior , calculamos algo como [matemática] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [/ math], porque representa el cambio con respecto a nuestra activación en nuestro capa anterior; para que cuando sea el momento de cambiar el contexto a alguna neurona [matemática] k [/ matemática] en nuestra capa anterior [matemática] L-1 [/ matemática], calculemos [matemática] \ frac {\ parcial {C_g}} { \ parcial {w_ {j, k} ^ {L-1}}} [/ matemática] (aviso [matemática] w_ {j, k} ^ {L-1} [/ matemática]) en lugar de [matemática] \ frac {\ partial {C_g}} {\ partial {w_ {j, k} ^ {L}}} [/ math] (aviso [math] w_ {j, k} ^ L [/ math]), es decir, nuestro cambio de peso en nuestra nueva capa de contexto [matemática] L-1 [/ matemática] adyacente a nuestra neurona de contexto actual [matemática] j [/ matemática] en la capa [matemática] L [/ matemática]. En este nuevo escenario o contexto o neurona desde el cual estamos midiendo el cambio, no utilizamos el antiguo término [matemática] \ frac {\ partial {C_g}} {\ partial {a_j ^ {L}}} [/ matemática] (de [matemáticas] \ frac {\ partial {z_j ^ L}} {\ partial {w_ {j, k} ^ {L}}} \ frac {\ partial {a_j ^ L}} {\ partial {z_j ^ { L}}} \ frac {\ partial {C_g}} {\ partial {a_j ^ {L}}} [/ math]) que pertenecía a nuestra capa de salida [math] L [/ math], pero en su lugar utilizamos el nuevo [matemáticas] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [ / matemática], que se calculó cuando estábamos en alguna neurona de contexto actual [matemática] j [/ matemática] en nuestra capa de salida [matemática] L [/ matemática] (aviso [matemática] j [/ matemática] en [matemática ] \ sum_ {j = 0} ^ {n_ {L-1}} [/ math]). (Similar a cuando discutimos el minuto 2:27 del video 4, para redes neuronales de una sola neurona por capa arriba) Por supuesto, siguiendo la tradición, luego calculamos el cambio de activación de costo para nuestra capa anterior [matemáticas] L-2 [/ matemáticas ] con respecto a nuestra neurona de contexto actual [matemática] k [/ matemática] en [matemática] L-1 [/ matemática], para que podamos guardarla cuando estemos listos para cambiar contextos nuevamente a alguna neurona de alguna neurona anterior [matemática ] p [/ math] en [math] L-2 [/ math]. Se vería así: [matemáticas] \ frac {1} {n} \ sum_ {k = 0} ^ {n_ {L-2}} \ frac {\ partial {C_g}} {\ partial {A_p ^ {L -2}}} [/ matemática] aviso [matemático] \ sum_ {j = 0} [/ matemático] ha cambiado a [matemático] \ sum_ {k = 0} [/ matemático], y también, aviso [matemático] A_p ^ {L-2} [/ math] ha cambiado de ([math] {A_k ^ {L-1}} [/ math]), mirando el antiguo término de ecuación: [math] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [/ math]. (Puede notar que [matemática] C_g [/ matemática] no cambia en nuestra red neuronal múltiple por capa neuronal por capa, de cómo apareció en nuestra red neuronal neuronal por capa individual, porque esta g no se trata de la capa [matemática] L [/ matemática] o neurona [matemática] j [/ matemática] versus capa [matemática] L-1 [/ matemática] o referencia de neurona [matemática] k [/ matemática], pero se refiere a un conteo de costos generales, que naturalmente cubrirá cualquier capa.) Observe que hay una ligera diferencia entre los costos de redes neuronales de una sola neurona por capa: [matemática] \ frac {1} {n} \ sum_ {j = 0} ^ {n-1} [/ matemática], y redes neuronales múltiples por capa: [matemática] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} [/ matemática]; como puede ver, las redes neuronales múltiples por capa retienen una [matemática] n_ {L-1} [/ matemática] en el límite de la suma, mientras que las neuronas neuronales individuales por capa solo suman [matemática] n-1 [ /matemáticas]. Esto se debe a que simplemente no tenemos que preocuparnos por considerar el número de neuronas por capa en una red neuronal de una sola neurona por capa, por lo que técnicamente, las capas realmente no existen, cada neurona en la red neuronal de cada neurona por capa actúa como una capa. Es por eso que no necesitamos [math] n_ {L-1} [/ math] para unir nuestra suma en redes neuronales de una sola neurona por capa, como se ve en las redes neuronales múltiples más complicadas por capa.

Entonces, esencialmente estoy diciendo que eso:

  • Para las redes neuronales artificiales de una sola neurona por capa, tenemos una ” hiperesuperficie simple ” por cálculo en una neurona porque podemos sumar de esta manera: {[matemáticas] z = (w ^ L \ cdot a ^ {L-1} + b ^ L) [/ math]} con respecto a alguna neurona anterior, y una ” hipersuperficie final ” por cálculo en una neurona porque sumamos así: {[math] z = (w_ {j, k} ^ {L} \ cdot a_ {k} ^ {L-1} + w_ {j, k + 1} ^ {L} \ cdot a_ {k + 1} ^ {L-1} + b ^ L)… [/ math]} con respecto a neuronas anteriores, para múltiples neuronas por capa redes neuronales artificiales.
  • La notación [matemática] \ frac {1} {n} [/ matemática] muestra que tratamos con “promedios de conjunto de entrenamiento” que en realidad son nuestros costos, también conocidos como “gradientes negativos” [matemática] – \ nabla C [/ matemática]. Este costo se produce para ambas redes neuronales artificiales de una sola neurona por capa, [matemática] C = [\ frac {1} {n} \ sum_ {k = 0} ^ {n-1} \ frac {\ partial {C_g}} { \ parcial {W ^ {L}}},…] [/ matemáticas] y múltiples neuronas por capa redes neuronales artificiales: [matemáticas] C = [\ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {W_ {j, k} ^ {L}}}, …] [/ matemáticas]. Para cualquier caso, se necesita [math] \ frac {1} {n} [/ math], porque estamos sumando todos los casos de capacitación, es decir, cualquier cantidad de imágenes de entrada procesadas hasta ahora, por lo que tenemos que dividir por [math] n [/ math], donde [math] n [/ math] corresponde al número total de casos de entrenamiento anteriores. De todos modos, para redes neuronales más prácticas, que son las redes neuronales artificiales de múltiples neuronas por capa, hacemos lo mismo.

(Consulte la versión de alta calidad del diagrama anterior aquí: https://i.imgur.com/iQEDfXq.png)

Además, observe que en la imagen de arriba, en sumas particulares, uso la notación [math] \ frac {1} {T} [/ math], donde [math] T [/ math] es el número de muestras de entrenamiento. En contraste, [math] \ frac {1} {n} [/ math] se usa en toda la Parte I antes de la imagen de arriba por suma, porque no hay neurona [math] n’th [/ math] discutida antes de la imagen de arriba, y así podría [matemática] n [/ matemática] utilizarse distintivamente para el total de la muestra de entrenamiento sin confusión con los índices de neuronas.

Parte II – “Sumas de neuronas asociadas – Un énfasis en” hipersuperficies finales “:

Esta parte se referirá a la Parte I sección (1), en lo que respecta a la discusión sobre dónde “restringimos a [matemáticas] L-1 [/ matemáticas]”.

Esta parte es solo para enfatizar que tenemos hipersuperficies finales en múltiples redes neuronales por capa neuronal (que son redes neuronales útiles para tareas como la detección de dígitos).

A diferencia de las redes neuronales de una sola neurona por capa, las redes neuronales de varias neuronas por capa requieren hiperesuperficies (en lugar de una simple hipersuperficie) para cualquier neurona que comparta pesos con cualquier otra neurona en una capa.

Considerando alguna ” neurona actual ” [matemática] j [/ matemática], también conocida como una neurona a partir de la cual se puede calcular el cambio con respecto a las neuronas vecinas [matemática] j + n [/ matemática] en la misma capa, afectada por cierto número de neuronas [matemática] k + n [/ matemática] en nuestra capa anterior [matemática] L-1 [/ matemática]; Podemos pensar que estos cálculos involucran neuronas asociadas (donde [matemática] j [/ matemática] y cierto número de neuronas [matemática] j + n [/ matemática] pueden ser “compañeras” a través de cierta cantidad de neuronas previas [matemática] k + n [/ math] ) , que se asocia al compartir la carga del cálculo del hipersuperficie, que implica una suma que incluye:

  • Neuronas [matemáticas] k + n [/ matemáticas] conectados por pesos [matemática] j, k + n [/ matemática] , que se conectan a una neurona de capa actual [matemática] j [/ matemática], a partir del cual se mide el cambio.
  • Algunos sesgos asociados con la neurona [matemática] j [/ matemática] anterior, perteneciente a la capa [matemática] L [/ matemática].
  • Activaciones múltiples relacionadas con los pesos [matemática] j, k + n [/ matemática] que se conectan a las neuronas [matemática] j + n [/ matemática] en la misma capa que la neurona [matemática] j [/ matemática] anterior. (Donde la neurona [matemáticas] j [/ matemáticas] también está conectada a cualquier peso que se conecte a las neuronas [matemáticas] j + n [/ matemáticas]).

Parte III – “Corrección de errores – Aplicación de costos de las hipersuperficies posteriores”:

Ahora, toda la razón para el cálculo de la función de costo, y el algoritmo de propagación inversa, fue hacer que nuestra red neuronal artificial aprenda mejores pesos para producir mejores y mejores respuestas ; por lo tanto, elimina lenta pero seguramente sus errores, ya que está expuesto a más y más ejemplos de datos de entrada correctamente etiquetados. (Tenga en cuenta que aunque acabo de mencionar este paso, se realiza de forma iterativa junto con los pasos anteriores)

  1. Recuerde que la función de costo fue el gradiente negativo del error contenido en la matriz [matemática] C [/ matemática].
  2. Al final de cada ciclo, habríamos calculado los cambios wrt a la función de costo, [matemática] – \ nabla C [/ matemática], y habríamos colocado una secuencia de cambios también conocidos como “ gradientes negativos ” en [matemática] C [/ matemática]. ( Recordatorio : la producción de un gradiente negativo regular es el descenso más pronunciado en la dirección de mejores y mejores respuestas, y la producción de un gradiente negativo basado en mini lotes es un gradiente estocástico decente )
  3. Recuerde también que existe otra matriz crucial, nuestra matriz de pesos [matemática] M [/ matemática], que podemos decir que contenía nuestros pesos , ¡pero también sesgos y activaciones relacionadas! (Es por esto que podemos agregar nuestra lista de cambios en pesos y sesgos [matemática] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g} } {\ partial {W_ {j, k} ^ {L}}}, \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g} } {\ parcial {B_j ^ {L}}}… [/ matemática] en [matemática] C [/ matemática] a [matemática] M [/ matemática], porque [matemática] M [/ matemática] habría contenido el correspondiente pesos y sesgos de nuestra red neuronal. Recuerde, [matemáticas] C [/ matemáticas] en realidad no existe como neuronas / nodos o pesos en nuestra red neuronal, sino simplemente como una lista de cambios o costos que debemos incorporar a nuestro modelo .) Entonces, aunque calculamos el cambio de costo en el término [math] A_k ^ {L-1} [/ math] (visto en [math] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ { L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [/ math]), en realidad no lo almacenamos en [math] C [/ math], en su lugar, se utilizó como se explica en la Parte I, elemento 2.
  4. Calcular la matriz de costos [matemática] C [/ matemática] mostró dónde la red neuronal salió mal, pero la red neuronal en sí no ha cambiado y todavía no ha aprendido de sus errores.
  5. Para permitir que la red neuronal cambie sus viejas y sucias formas erróneas, propagamos la señal de error nuevamente dentro de la red. (es decir, propagación hacia atrás) Para propagar la señal de error hacia atrás, es otra forma de decir que ajustamos los pesos [matemáticos] M [/ matemáticos] de la red neuronal, de modo que los errores se reflejen en el error en términos de [matemática] C [/matemáticas]. Así que simplemente agregamos [matemáticas] C [/ matemáticas] a [matemáticas] M [/ matemáticas], es decir, [matemáticas] M = M + C [/ matemáticas]. ( Nota: mirando el paso 2 , aunque los contenidos de [matemáticas] C [/ matemáticas] se denominan “ gradientes negativos ”, no creamos intencionalmente una ecuación de resta [matemáticas] M = M – C. [/ Matemáticas] De manera crucial , si decidiéramos actualizar los pesos por ecuación de resta, [matemática] M = M – C [/ matemática] no estaríamos actualizando los pesos por los cambios correctos, porque entonces si un valor en [matemática] C [/ matemática ] es negativo, sucedería una suma y ese cambio negativo , también conocido como valor negativo, no se reflejaría en la actualización . En cambio, al crear una ecuación de suma [matemática] M = M + C [/ matemática] para la actualización de peso, se garantiza que la actualización los pesos correctamente, cambiando nuestros pesos en términos de los valores reales de la matriz de costos [matemática] C, [/ matemática] si ese valor de [matemática] C [/ matemática] es positivo o negativo. Observe que incluso si un valor en [matemática] C [/ matemática] es negativa, en nuestra ecuación de suma ese valor negativo aún se restará , ya que positivo más negativo es en realidad una resta. El nombre “ grad negativo ients ‘simplemente se aplica porque la función de costo que puebla la matriz [matemática] C [/ matemática] se observa de manera demostrable en la literatura y la práctica para disminuir en algún rango de entrada como nuestros procesos derivados en la Parte I, II, luego el proceso aditivo aquí en la Parte III ocurre. Esta disminución nos da el nombre de nuestros gradientes en matriz [matemáticas] C [/ matemáticas].
  6. function gtElInit() {var lib = new google.translate.TranslateService();lib.translatePage(‘en’, ‘es’, function () {});} Mirando un árbol de cambio de costos, en el minuto 2:23 del video 4, aunque ese árbol se refería a la red neuronal de una sola neurona por capa si pretendemos que el árbol contenía los índices para una red neuronal de múltiples neuronas por capa, entonces otra cosa crucial para tome nota de que calculamos tripletas de costos por ciclo, incluidos los cambios en los pesos: [matemática] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ parcial {C_g}} {\ partial {W {j, k} ^ {L}}} [/ math], cambios en sesgos: [math] \ frac {1} {n} \ sum_ {j = 0} ^ { n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {B_j ^ {L}}} [/ math] , y finalmente cambia en las activaciones para la capa anterior [math] L-1 [/ math] : [matemáticas] \ frac {1} {n} \ sum_ {j = 0} ^ {n_ {L-1}} \ frac {\ partial {C_g}} {\ partial {A_k ^ {L-1}}} [/matemáticas]. Ya sabe que estos cambios en las activaciones de la capa anterior o anterior se guardan para el cálculo de los cambios en los sesgos y los pesos cuando cambiamos los contextos a alguna capa anterior . (Como se discutió en la Parte I, elemento 2 ) De todos modos, nuestros cambios en las activaciones en [matemáticas] L-1 [/ matemáticas], que contiene el término [matemáticas] A_k ^ {L-1} [/ matemáticas] , es lo que desencadena el Fenómenos de “seguimiento de la hipersuperficie” (Esto se debe a que para redes neuronales de múltiples neuronas por capa, [matemática] z [/ matemática] se ve así: [matemática] z = (w_ {j, k} ^ {L} \ cdot a_ {k } ^ {L-1} + w_ {j, k + 1} ^ {L} \ cdot a_ {k + 1} ^ {L-1} + b ^ L) [/ math] en lugar de esto: [math] z = (w ^ L \ cdot a ^ {L-1} + b ^ L) [/ math], como se ve en las redes neuronales de una sola neurona por capa). Como tal, este cómputo de “hiperesuperficie final” de los cambios / promedios en las activaciones (de la capa anterior [matemática] L-1 [/ matemática]) genera alguna relación de ” neurona compañera “. ( Ver Parte II) La explicación rápida es que podemos ver, al observar las redes neuronales de una sola neurona por capa, que la relación de ” neurona compañera ” debe ocurrir en nuestra red neuronal múltiple de neuronas por capa, porque ahora en lugar de considerar simplemente las activaciones de las capas anteriores [matemáticas ] L-1 [/ matemática] (como se ve en las redes neuronales de una sola neurona por capa), ahora también debemos considerar las activaciones que afectan a cualquier neurona vecina (o neurona en la misma capa que nuestra neurona de contexto actual) en relación con cualquier otra neurona en un punto desde el cual se mide el cambio. Entonces, al final, en las redes neuronales de múltiples neuronas por capa, debemos aplicar esta relación de ” neurona compañera “, ya que estamos tratando con muchas neuronas por capa por caso de entrenamiento, es decir , cada vez que la red neuronal se expone a una imagen de un dígito. También seguiríamos calculando tripletas para redes neuronales de una sola neurona por capa (como se ve en un árbol de cambio de costos, en el minuto 2:23 del video 4), pero tendríamos un pequeño número de tripletas de costos calculadas, proporcional a ese pequeño número de neuronas Por lo general, cuanto más grande es la red neuronal, más trillizos serán necesarios.

Entonces, después de que se realiza el proceso anterior (es decir, muchos ciclos de actualizaciones de [matemáticas] M [/ matemáticas] en [matemáticas] M = M + C [/ matemáticas], donde cada vez que ocurre esta adición , nos acercamos más y más a una mejor red neuronal), la red neuronal artificial podrá adivinar lo que dice la entrada no marcada . De esta manera, la red neuronal se ha generalizado más allá de los “datos de entrenamiento” o “muestras correctamente etiquetadas” que se ven en el descenso más empinado, ¡y así ha aprendido la tarea de detección de dígitos! ¡Ahora puede ver que las redes neuronales basales son muchas adiciones de grandes matrices de datos (compuestas de composiciones de funciones, es decir, derivados en muchas proporciones con respecto a los pesos y activaciones)!

Pero, ¿cómo sabemos que nuestra red neuronal se ha “generalizado” más allá del conjunto de entrenamiento (también conocido como cómo sabemos si la red neuronal realmente aprendió a detectar dígitos de las imágenes de entrada)? Sabemos cuándo intentamos realmente “probar” nuestra red neuronal. Cuando hayamos terminado de corregir nuestros pesos, wrt a algunas entradas correctamente etiquetadas, también conocidos como ejemplos de entrenamiento, ahora podemos probar nuestro modelo tomando un valor de la capa de salida , donde se almacenan nuestras respuestas .

  • Probamos nuestro modelo mostrándole una imagen de un dígito que no era parte del conjunto de entrenamiento, para ver si realmente aprendió (Mostrarle una imagen de un dígito en el conjunto de entrenamiento no se reflejaría por completo si realmente aprendió … así que para estar seguros, es mejor exponerlo a conjuntos de píxeles, es decir, imágenes de dígitos que aún no se han visto … , una vez más, el objetivo es hacer un detector de dígitos, no solo un detector de dígitos en ejemplos predefinidos de imágenes correctamente etiquetadas, sino un detector de dígitos en general, ¡eso es algo que puede detectar dígitos recién vistos , en particular, dígitos sin etiquetar! ¡¿Tendría sentido si siempre mostráramos nuestra red neuronal artificial solo imágenes correctamente etiquetadas, que también siempre dicen lo que representa cada imagen ? “¿Cómo podríamos saber que ha aprendido de todos modos? Entonces, esta es la razón por la que probamos con datos frescos no etiquetados de imágenes invisibles de dígitos” .

Ahora, para una entrada con un dígito 3, si el descenso más pronunciado, también conocido como descenso de gradiente, funcionó bien, aunque todas las neuronas de salida, también conocidas como neuronas de respuesta , tendrían un valor, la neurona para 3 tendría un valor especialmente mayor que las otras neuronas, porque la neuronal net cree que está viendo un 3 (es decir, contando desde la neurona cero), encontramos la respuesta de la neurona para 3 en la cuarta neurona, porque el recuento de neuronas comenzó en 0).

Entonces, para obtener nuestra respuesta final, ¡todo lo que hacemos es tomar el máximo del conjunto de números almacenados en nuestra capa de salida! (donde cada neurona de respuesta / salida tiene un número)

Aunque todas las tuercas y tornillos de una red neuronal artificial con capacidad de detección de dígitos elemental son fáciles de entender a largo plazo, la red neuronal lamentablemente consta de miles de partes móviles, por lo que quizás sea tedioso comprender la imagen completa.

1) “Parte I – Hipersuperficies finales” y “Promedios del conjunto de entrenamiento”:

https://www.researchgate.net/publication/321162382_Artificial_Neural_Nets_For_Kids

2) “Parte II – Sumas de neuronas asociadas – Un énfasis en” hipersuperficies finales “:

Ver publicación en imgur.com

3) “Parte III – Corrección de errores – Aplicación de costos de las hipersuperficies posteriores”:

https://www.researchgate.net/publication/321162382_Artificial_Neural_Nets_For_Kids

Notablemente, la Parte II es simplemente una forma de aclarar la parte I, por lo que básicamente la red neuronal es solo 2 cosas :

1) Una secuencia de cálculos de ” hiperesuperficie ” wrt a alguna función de costo.

2) Una aplicación de costos, también conocida como “gradientes negativos” (utilizando los cálculos de la hiperesuperficie ) para actualizar la estructura de la red neuronal a medida que se expone a más y más ejemplos de entrenamiento. Y así, la red neuronal mejora con el tiempo.

¡Eso es, ese es el infame algoritmo de respaldo, junto con toda una red neuronal artificial elemental pero poderosa!

¡Ahora estás listo para tomar el curso en línea “duro” de Geoffrey Hinton en redes neuronales!

La respuesta anterior también está disponible en formato pdf: https://www.researchgate.net/pub…

La mejor analogía que se me ocurre, después de haber estudiado y utilizado redes neuronales durante 40 años, es buscar una forma automática de producir un programa de computadora que tenga una cierta relación de entrada-salida dada solo pares de entrada-salida, es decir, sin programación !

Una red neuronal es una forma de representar soluciones a problemas.

La representación usa nodos y pesos entre los nodos. Hay muchos tipos de tales redes, pero restringiré mi respuesta a las llamadas redes de Backpropagation.

La tarea de una red neuronal es generalizar una relación de entrada y salida dada solo un conjunto de ejemplos.

Se puede mostrar para cualquier relación de entrada y salida que si la red tiene dos o más capas, entonces, en condiciones razonables, hay un conjunto de pesos que reproducen esta relación.

El problema es cómo podemos encontrar el conjunto de pesos que se sabe que existen.

No se garantiza que el algoritmo de retropropagación funcione, pero en muchos casos hace un buen trabajo para encontrar los pesos requeridos.

La red neuronal es básicamente una gran malla de conexión de nodo (inspirada en la conexión neuronal en el cerebro).

Cada conexión lleva un valor (comúnmente llamado pesos). Inicialmente, estos pesos se asignan aleatoriamente y luego estos pesos se adaptan para alinearse con el valor de entrada para dar la salida deseada.

Como la red neuronal es un sistema impulsado por datos (aprende de los datos), pasamos todos estos datos como entrada al sistema. También tenemos una función (comúnmente llamada función de pérdida / error) para encontrar el error desde la salida hasta la salida deseada (si es un sistema supervisado).

El ajuste de este peso para alinearlo con la entrada para dar la salida deseada se llama aprendizaje. El algoritmo de aprendizaje más popular se llama backpropagation (backprop). Backprop calcula el gradiente de la función de error con respecto a los pesos de la red neuronal. Básicamente verifica cuál es el cambio en la pérdida con respecto a la entrada y ajusta estos pesos de una manera que obtengamos la menor pérdida posible.

Por lo general, no ajustamos estos pesos drásticamente, damos pequeños pasos hacia el objetivo (resultado deseado) que tomamos pasos enormes. Estos pequeños pasos se denominan tasa de aprendizaje, la tasa a la que aprendemos (ajustamos los pesos).

Esta sería la cáscara de nuez. Espero que haya ayudado.

Las redes neuronales artificiales son modelos de aprendizaje estadístico, inspirados en redes neuronales biológicas (sistemas nerviosos centrales, como el cerebro), que se utilizan en el aprendizaje automático. Estas redes se representan como sistemas de “neuronas” interconectadas, que se envían mensajes entre sí.

Para comprender mejor la computación neuronal artificial, es importante saber primero cómo una computadora ‘serial’ convencional y su software procesan la información. Una computadora en serie tiene un procesador central que puede direccionar una variedad de ubicaciones de memoria donde se almacenan datos e instrucciones. El procesador realiza los cálculos leyendo una instrucción, así como cualquier dato que la instrucción requiera de las direcciones de memoria, la instrucción se ejecuta y los resultados se guardan en una ubicación de memoria específica según sea necesario. En un sistema en serie (y también en uno paralelo estándar), los pasos computacionales son deterministas, secuenciales y lógicos, y el estado de una variable dada se puede rastrear de una operación a otra.

En comparación, los ANN no son secuenciales ni necesariamente deterministas. No hay procesadores centrales complejos, más bien hay muchos simples que generalmente no hacen más que tomar la suma ponderada de sus entradas de otros procesadores. Las ANN no ejecutan instrucciones programadas; responden en paralelo (simulado o real) al patrón de entradas que se le presenta. Tampoco hay direcciones de memoria separadas para almacenar datos. En cambio, la información está contenida en el “estado” de activación general de la red. Por lo tanto, el “conocimiento” está representado por la propia red, que es literalmente más que la suma de sus componentes individuales.

Existen diferentes modelos de ANN (como Perceptron, MNN, modelo de propagación hacia atrás, red recurrente, etc.) que funcionan de manera diferente. Pero el mecanismo básico es similar, que es cómo aprende un cerebro humano. Corrige su aprendizaje al experimentar cada vez más ejemplos. Supongamos que un niño pequeño solo puede reconocer a un ‘gato blanco’ como gato, pero a un ‘gato negro’ como otra cosa. Pero si un supervisor le enseña al niño que el gato negro también es un gato, entonces ella ajustará su aprendizaje y la próxima vez reconocerá a un gato negro. Una red neuronal artificial aprende de manera similar. Hay entradas y salidas a una neurona artificial. Cada entrada tiene un peso adjunto. Según la entrada y el peso, una función de activación genera una salida. Al buscar más y más datos, una red neuronal artificial ajusta continuamente sus pesos de entrada para que coincida con una salida objetivo correcta de los conjuntos de datos. Cuando los pesos están perfectamente ajustados, se espera que un ANN prediga la salida de un conjunto de datos desconocido (sin salida objetivo).

La entrada para NN podría ser una imagen, datos numéricos, etc. y estos datos están presentes en forma de matriz / vectores que luego se pasan a la capa de entrada y los pesos deben ajustarse para imitar a NN el comportamiento esperado.

Ej .: Puertas lógicas Y / O / NO.

Puede obtener más información sobre el NN de Welch Labs, está disponible en YouTube y sus videos son mucho más informativos.

Para una mejor comprensión de NN debe tomar el curso de Machine Learning de Andrew Ng

Aprendizaje automático – Universidad de Stanford | Coursera