Abramos la caja negra. Construiremos a continuación una red neuronal desde cero que aprende la función XOR. La elección de esta función no lineal no es por casualidad. Sin backpropagation seria difícil aprender a separar clases con una línea recta.
Para ilustrar este importante concepto, note a continuación cómo una línea recta no puede separar 0s y 1s, las salidas de la función XOR. Los problemas reales también son linealmente no separables.
La topología de la red es simple:
Entrenemos ahora el modelo. En nuestro ejemplo los valores entrenables son los pesos, pero tenga en cuenta que la investigación actual está explorando nuevos tipos de parámetros a ser optimizados. Por ejemplo: atajos entre capas, distribuciones estables en las capas, topologías, velocidades de aprendizaje, etc.
Backpropagation es un método para actualizar los pesos en la dirección (gradiente) que minimiza una métrica de error predefinida, conocida como Función de Pérdida on función de costo, dado un conjunto de observaciones etiquetadas. Este algoritmo ha sido repetidamente redescubierto y es un caso especial de una técnica mas general llamada diferenciación automática en modo acumulativo reverso.
Inicialización de la red
Inicialicemos los pesos de la red con valores aleatorios.
Propagación hacia adelante:
El objetivo de este paso es propagar hacia delante la entrada X a cada capa de la red hasta calcular un vector en la capa de salida h2.
Es así como sucede:
Calculando el error total
También conocido como "valor real menos predecido", el objetivo de la función de pérdida es cuantificar la distancia entre el vector predecido h2 y la etiqueta real proveída por un ser humano, y.
Note que la función de pérdida contiene un componente de regularización que penaliza valores de los pesos muy altos a manera de una regresión L2. En otras palabras, grandes valores cuadrados de los pesos incrementaran la función de pérdida, una métrica de error que en realidad queremos reducir.
Andres Leonardo Arevalo
Osmandi Gomez
Luis Carlos Parra Raffán
Osmandi Gomez
johan Stever Rodriguez Molina
Carlos Nexans
Hebert lughi villafuerte ccacala
Cristian Orozco Benjumea
Omar Florez
Cristian Orozco Benjumea
Maximiliano Rodríguez Porras
Juan Sebastian Torres
Gustavo David Guillen Gutierrez
Diego Forero
Gustavo David Guillen Gutierrez
Cristhian Bernal
La función sigmoide que se calcula corresponde a la siguiente:
Hola profesor Omar,
Es una manera muy práctica de explicar algo tan complejo.
Una pregunta, ¿el valor de las matrices es el resultado de las derivadas del algoritmo en el slide?
No, las matrices W son valores generados aleatoriamente, los valores de X son los valores de entrada de la red neuronal y por su puesto Y son los valores de salida de la red neuronal.
Por otro lado cuando aplicas la función Sigmoid en ese momento estas realizando o más bien simulando el proceso neuronal del cerebro humano, lo que significa aplicar la función que en videos anteriores se explicó en clase.
Hola Luis, gracias por tu respuesta.
¿Lograste correr el demo con las gráficas?
Aquí es donde me siento feliz de ser matemático.
La función XOR es simplemente la operación lógica disyunción exclusiva, en Python podríamos escribir:
def xor(p, q): return (p or q) and not (p and q)
que crjs es esto xd…! a estudiar matematicas xdxd!!!
Para aclarar unos conceptos les dejo un video de DotCSV en donde explica una red neuronal y las compuertas lógicas.
Profe ésta clase se me dificulto hubiera sido mejor construir la red desde cero y no sólo compartilo en GitHub.
Si luego vi que lo explicas en la siguiente clase.
Para los que tienen problemas para ejecutar el ejemplo, seguir estos pasos en ubuntu (Pueden hacer una máquina virtual):
Tener instalado la última versión de python 2.7.
Debes de tener instalado git y descargar el archivo como se indica.
Hay que sacar el archivo scratch_mlp.py a una carpeta superior. (Si miras el código, busca dentro de la carpeta “scratch_mlp”, eso está mal)
Si hiciera un listado del directorio quedaría así:
└── redes_neuronales ├── scratch_mlp.py ├── scratch_mlp ├── docs ├── __init__.py ├── __init__.pyc ├── plots ├── __pycache__ ├── slides ├── utils.py └── utils.pyc
Te recomiendo correr en virtualenv, pero si no sabes cómo, no hay problema.
Lirerias
Para poder correr el ejemplo tendrás que instalar python-tk. Código para instalarlo en linux:
apt-get install python-tk
Tendrás que tener instalado pip, puedes instalarlo en ubuntu con:
$ sudo apt-get install python-pip python-dev build-essential $ sudo pip install --upgrade pip $ sudo pip install --upgrade virtualenv
Y necesitarás instalar las siguientes librerias:
pip install numpy, matplotlib, ipdb, imageio
Saludos.
Faltó el tener el cuenta el vector de sesgos o bias el cual representa el bias correspondiente a cada neurona de la capa en la que se encuentre.
Tengo el siguiente error cuando intento ejecutar
Epoch 9999 Loss: 0.246042 Average L1 error: 0.492016 Accuracy: 0.540000 Traceback (most recent call last): File "scratch_mlp/scratch_mlp.py", line 125, in <module> run() File "scratch_mlp/scratch_mlp.py", line 118, in run utils.plot_decision_boundary(X, y_actual, lambda x: inference(x, [w1, w2]), NameError: name 'utils' is not defined If you suspect this is an IPython bug, please report it at: https://github.com/ipython/ipython/issues or send an email to the mailing list at ipython-dev@python.org You can print a more detailed traceback right now with "%tb", or use "%debug" to interactively debug it. Extra-detailed tracebacks for bug-reporting purposes can be enabled via: %config Application.verbose_crash=True
Sin ver el código es difícil ayudarte, lo que muestra el error es que estas usando utils pero no esta definido, ya sea porque falta importarlo o porque estas importando mal.
Pero si precisamente realize un git clone.
git clone https://github.com/omar-florez/scratch_mlp/ python scratch_mlp/scratch_mlp.py
O sea en teoria deberiafuncionar, pq no he tocado nada.
_¿Cuál es la razón para que la salida [0 1] sea 0 y [1 0] sea 1?
_Si la salida toma el valor [0 0] o [1 1] ¿Cuál sería su representación en la Tabla binaria del XOR?