Introducción
El deep learning es una disciplina que se engloba en lo que se conoce como representation learning y esta a su vez está contenida en el archi-conocido machine learning.
Pero, ¿de qué se trata?, ahora todo el mundo habla de deep learning, de la cantidad de cosas que se pueden hacer con este método y de lo maravilloso que es.
En el mundo de la tecnología añadir la etiqueta deep learning a un producto se está convirtiendo en lo mismo que hace unos años añadir IoT, web semántica, cloud o mucho más lejos en el tiempo AJAX.
Actualmente trabajo con deep learning para construir modelos que permitan perfilar a un usuario en base al comportamiento que tiene en una web, este tipo de información te permite conocer un poco mejor a tu usuario: como utiliza el ratón y el teclado, desde donde se conecta, cuando se conecta, que acciones se supone que va a realizar después, etc. Dado que trabajo en el sector de la seguridad informática, esto es por ejemplo útil para tratar de determinar si un usuario es quien dice ser, o por el contrario ha sido suplantado y hay que prestar mayor atención a sus acciones, por ejemplo a la hora de realizar una transferencia bancaria.
La motivación para escribir este articulo es la escasa información que existe en lengua Cervantina sobre el tema, esto es algo normal, puesto que es algo novedoso y está en pleno crecimiento.
Además, me voy a permitir la licencia de construir la casa por el tejado, en vez de explicar las bases sobre las que se asienta el deep learning voy a explicar a nivel muy general como funciona y más adelante entraré en detalles concretos.
Quiero construir una serie de artículos que demuestre de forma práctica para que vale el deep learning y como nos está ayudando en nuestro día a día sin que lo sepamos. Para conseguirlo contruiré un modelo de deep learning utilizando tensorflow que permita predecir el valor que va a tomar bitcoin en base a sus valores anteriores y a lo que la gente comenta en twitter. Esto será utilizando únicamente deep learning. Para ello me apoyaré en un repositorio de github donde iré desarrollando cada parte con las explicaciones pertinentes.
Para los que no lo sepáis, tensorflow es la herramienta de Google para la creación de modelos de deep learning, la cual se está convirtiendo en un estandar de facto con el paso del tiempo, pero hay otrás que han sido y son muy populares.
Deep learning
Y ahora vayamos al lío, ¿qué es el deep learning?. El deep learning es un método que nos va a permitir generalmente clasificar cosas, es cierto que nos puede ayudar en otros áreas como por ejemplo: predicciones, sistemas de compresión, generación automática de contenidos, traducciones, etc. Pero estas áreas no van a dejar de ser un subconjunto del problema de clasificación.
El deep learning se sustenta en el uso de redes neuronales, aunque podéis leer muchas cosas por ahí, estas redes no se basan en el funcionamiento del cerebro, básicamente porque desconocemos el funcionamiento exacto del cerebro. Este hecho es muy importante en cuanto a terminología, una red neuronal no está formada de neuronas, está formada de unidades.
De momento veamos lo que es una red neuronal:
Una red neuronal puede ser representada básicamente por la ilustración superior. Es una función que acepta una serie parámetros (x1, x2, ..., xn) y devuelve uno o más valores (y1, y2, ..., ym).
La particularidad que tiene esta función es que normalmente es suficientemente compleja como para adaptarse a una clasificación que utilizaríamos en la vida real, como por ejemplo etiquetar una imagen con el valor del número que contiene.
Veamos un ejemplo práctico utilizando un conjunto de datos público llamado MNIST, este conjunto de datos es muy popular para validar modelos y contiene 70000 números escritos a mano y etiquetados. Estar etiquetado significa que existe metainformación que indica que número contiene la imagen correspondiente, la resolución de las imágenes es de 28x28x1 (ancho x alto x profundidad de color):
Para transformar la imagen en algo entendible por la red tenemos que preguntarnos qué es una imagen del MNIST. Una imagen del MNIST es una matriz cuadrada (o tensor de orden 2) que contiene valores de 0 a 255, siendo 0 los pixeles de color negro más oscuro y 255 el color blanco más intenso, como ejemplo la siguiente imagen (tensorflow.rstudio.com/tensorflow/articles/tutorial_mnist_beginners.ht):
En este caso los valores están normalizados entre 0 y 1 una imagen de MNIST únicamente tenemos que dividir la matriz entre el escalar 255. La normalización es un tema de gran importancia en el deep learning pero lo trataremos más adelante. Los colores también están invertidos, pero para este caso nos resulta indiferente.
Ahora tenemos una matriz cuadrada y normalizada de 28x28, pero necesitamos convertirla en un vector (tensor de orden 1), el proceso para conseguirlo es muy sencillo, simplemente concatenaremos todas las filas una detrás de otra para acabar teniendo un tensor de rango 1 que tiene 784 componentes.
Por otro lado tenemos la salida, otro tensor de orden 1 con 10 componentes, cada componente representa una categoría, así por ejemplo y1 representa la categoría del número 0, y2 representa la categoría del número 1, y3 del 2, etc.
Lo que vamos a tratar de buscar, es que cuando metamos una imagen que represente ún número, la componente de la salida que representa la categoría de la entrada (en este caso 4) valga un valor muy cercano a 1 y el resto de componentes su valor sea cercano al 0.
En el caso de la imagen de arriba, donde se introduce un 4 a la red neuronal, vemos que la salida es perfecta: todas las componentes valen 0 excepto y5 que representa la categoría 4 y vale exactamente 1. Lamentablemente esta exactitud es muy dificil que suceda en la vida real.
Aunque no es estrictamente necesario, lo habitual es que la suma de todas las componentes del tensor de salida sumen 1, para conseguir esto el modelo suele aplicar una función que se llama softmax como última función.
Modelo
Bueno, ya tenemos un modelo que podría llegar a predecir algo, pero por desgracia, si le pasaramos una imagen convertida en un tensor únicamente acertaríamos un 10% de las veces, como si la clasificación fuera aleatoria. Si resulta que a vosotros os acierta nada más construir el modelo, dejad esta tontería del deep learning e idos a echar la lotería inmediatamente, eso sí, echad un boleto por mi y mandádmelo.
¿Por qué sucede esto?, bueno, esto sucede por como funciona internamente una red neuronal. Hemos visto como funciona a nivel general, pero una red neuronal está formado por pequeños componentes llamados unidades, estas unidades son funciones más pequeñas que aportan cierto valor a la salida de la red neuronal.
Observemos la imagen siguiente:
Cada circulo pequeño representa una unidad de la red neuronal, como podéis ver en la imagen, están agrupados en capas, y cada capa está completamente conectada a la siguiente. ¿Qué significa estar completamente conectadas?, significa únicamente que la salida de cada unidad es la entrada de cada unidad de la siguiente capa.
Vamos a ir un poquito más allá para entender como se conectan las unidades entre sí, pa ello veremos a detalle el funcionamiento de una unidad:
Como podéis ver, la imagen de arriba representa la función:
y = f(x1*w1 + x2*w2 + x3*w3 + x4*w4 + x5*w5)
Siendo f la función de activación, xn los valores de entrada de la unidad y w los pesos. Normalmente a la función se le añade una variable más llamada peso de sesgo que permitirá activar o desactivar la unidad, por lo que la función quedaría:
y = f(x1*w1 + x2*w2 + x3*w3 + x4*w4 + x5*w5 + b)
Siendo es este caso b el peso de sesgo (bias) y que no está representado en la ilustración superior.
La función de activación (f) que se suele aplicar varía dependiendo de lo que queremos conseguir, pueden ser funciones lineales o no lineales. Habitualmente se usan alguna de las siguientes funciones: sigmoide, relu o leaky relu o la tangente hiperbólica.
Perfecto, esta última parte ha sido un poco más intensa que la anterior, pero era necesaria para explicar lo que viene a continuación. Lo único que nos tiene que quedar claro es que hay un montón de pesos (w) y sesgos (b), y estas variables influyen en el valor de salida de cada unidad y por ende el valor de salida de la red neuronal.
Forward pass
El forward pass es el proceso por el cual dada una entrada a la red neuronal, por ejemplo la imagen con el número 4, obtenemos una salida (0, 0, 0, 0, 1, 0, 0, 0, 0, 0), esto básicamente se consigue multiplicando, sumando y aplicando funciones de activación de manera encadenada hasta que llegamos a la salida de la red neuronal. Es decir, es aplicar la función red neuronal a una entrada.
Para que la salida sea la que esperamos, antes debemos ajustar los pesos (w) y sesgos (b) para que cuando se hagan todos los cálculos el resultado que obtengamos sea el que esperamos.
¿Los podemos ajustar a mano?, bueno, todo depende de tu paciencia, pero en general ajustarlos a mano únicamente vale para aproximar funciones sencillas como por ejemplo la función AND, OR, XOR, etc. Para todo lo demás deberemos utilizar otro método.
Hay que tener en cuenta que los modelos pueden tener decenas de capas, con cientos de unidades en cada capa y cuya salida influye en el resto de unidades que están por delante, ajustar todo a ojo sería lo más cercano al infierno que puede existir.
Backward pass
El backward pass es lo que el común de los mortales suele llamar entrenamiento, el objetivo de esta fase es ir ajustando poco a poco las variables de peso (w) y sesgo (b) para que ajusten la salida de la red neuronal a lo que nosotros esperamos, para ello necesitaremos bastantes datos de entrada y el valor que esperamos obtener como salida en la red neuronal, en el caso del MNIST tendremos un montón de imágenes con números y el valor del número de la imagen.
Vamos a introducir otra función llamada función de coste o función de perdida, esta función va a tomar como entrada lo que devuelve la red neuronal y va a devolver cuanto nos hemos confundido, algo tal que así:
Nuestro objetivo es minimizar el error, es decir, loss debe valer el menor valor posible, aunque no quiero entrar en mucho detalle, seguro que recordaréis con cariño vuestras clases de cálculo encontrando mínimos en funciones. Pues esto es lo mismo pero con una función con miles de variables: nuestros amigos los pesos (w) y sesgos (b).
La imagen superior pertenece a: www.deeplearningbook.org/
Comentarios
A los que os interese el tema podéis pasaros por DDataScience, que está muy solitario aquello
Estaría muy bien empezar a ver este tipo de temas por menéame
#17 Un articulillo para empezar: https://www.linkedin.com/pulse/answers-computer-vision-jes%C3%BAs-seijas-de-la-fuente
#17 A mí me interesa el tema, pero no sabia ni que existiese ese sub... =P
Comentarios después de una lectura:
- De repente hablas de pesos sin explicar qué son, como se calculan, para qué sirven...
- Y no está explicado para qué sirven las capas, como se decide utilizar una o siete.
#1 Tienes razón, pero es una introducción, faltan decenas de cosas por explicar , trato de explicarte en el comentario lo que preguntas:
Los pesos son simplemente variables que pueden ser modificadas en el proceso de aprendizaje, estas variables aportan "parte del valor a la salida de la unidad". Indican como de "importante" es una entrada de la unidad. El sesgo sin embargo indica como de importante es una unidad en si misma.
Los pesos incialmente se establecen a un valor aleatorio muy perqueño, cuantas mayor es el número de entradas, más pequeños es el valor, hay varias formas de inicializarlo, una particularmente popular que se llama inicialización de Xavier (http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization) y es la que se suele utilizar. Inicializar bien los pesos es muy importante, si no lo haces puede que tardes mucho o no encuentres un mínimo aceptable de la función de perdida de tu modelo.
Existen algunas estrategias que te pueden permitir cometer errores a la hora de elegir los valores iniciales de los pesos, como por ejemplo modificar el funcionamiento interno de las unidades y añadir una capa de normalización donde toda la media de los valores de salida de toda la capa es 0 y la desviación típica 1.
Los valores de estas variables son modificados mediante el entrenamiento o backward pass, normalmente este cálculo se lleva a cabo mediante algoritmos iterativos que he puse arriba, SGD, Adam, Adagrad, etc. Aunque no 100% es exacto, de lo que se trata es buscar los mejores valores de w calculando derivadas parciales, muchas derivadas parciales.
"Acertar" con los pesos implica que tienes una función "red neuronal" que hace lo que quieres y que no necesita entrenamiento.
El tema de las capas depende del problema, pero no hay una regla para establecer el número de capas. Al añadir más capas (o unidades a las capas) estás añadiendo más expresividad a tu modelo, pero al tener más variables que calcular estás haciendo que la convergencia de tu modelo sea más costosa computacionalmente.
En modelos sencillos que solo implican capas completamente conectadas o densas (las que he puesto) se suele partir de la utilización de 3 capas, en modelos convolucionales no es raro ver 7 capas. Pero vamos, actualmente nunca vas a ver un modelo con cientos de capas y raro va a ser el que te encuentres con decenas.
Aqui tienes una web que es bastante visual y te permite hacer pruebas:
http://playground.tensorflow.org/
#1 Veo que ya te ha contestado #2 pero si quieres te lo traduzco para profanos.
Los pesos es la importancia que el sistema le da a cada entrada. Por ejemplo entre 0 y 1. Si el peso es 1, el valor de la entrada se mantiene, digamos que es muy valioso. Si el peso es 0, el valor de la entrada se anula, porque el sistema considera que no es útil. Cualquier valor entre 0 y 1 puede ser usado.
Respecto a las capas, como bien dice #2, no hay una regla general. Las capas sirven para representar el problema lo mejor posible, por lo tanto su número depende de la complejidad del problema. No obstante, para la mayoría de problemas del mundo real, con dos capas es suficiente usando redes neuronales. En redes de convolución o Deep learning, el número de capas puede aumentar, pero también puede aumentar la imprecisión y el coste, así que es un toma y daca.
#6 #1
Si buscas "peso" en el artículo, verás que la primera vez que dice esa palabra es en este texto:
-----
Como podéis ver, la imagen de arriba representa la función:
y = f(x1*w1 + x2*w2 + x3*w3 + x4*w4 + x5*w5)
Siendo f la función de activación, xn los valores de entrada de la unidad y w los pesos. Normalmente a la función se le añade una variable más llamada peso de sesgo que permitirá activar o desactivar la unidad, por lo que la función quedaría:
y = f(x1*w1 + x2*w2 + x3*w3 + x4*w4 + x5*w5 + b)
Siendo es este caso b el peso de sesgo (bias) y que no está representado en la ilustración superior.
----
Si miras con atención ves que sí te ha dicho a qué se refiere con "pesos" cuando habla, son números usados en cada unidad ('neurona' artificial) para calcular la salida. Esos números (w1, w2, w3, w4 y w5) se multiplican cada uno por un valor de entrada... (el w1 se multiplica por x1, el w2 por x2 y así... ).
Aunque no lo dice el texto, creo que no es difícil adivinar que la w viene de la palabra inglesa "weight" (peso) y la letra b viene de la palabra inglesa "bias" (sesgo) aunque yo he visto que a veces se le llama "threshold" ( 'umbral' ) porque es algo así como hacer una suma y ver si supera cierto valor, cierto umbral...
Y como ha dicho #3 esta multiplicación hace que "amplifiques" / 'aumentes el valor' de una entrada... de forma que si el peso es 0 estás multiplicando por 0, y, por tanto, anulando esa entrada. Digamos que anular una entrada implica que su valor no tiene ninguna importancia a la hora de calcular la salida... porque sea cual sea la entrada Xi al multiplicar por 0 queda Xi*0 = 0 y ese 0 se suma pero no vale de nada. Da igual que Xi sea 0.1 , que sea 0.5 o que sea 0.9 ... o que sea 200. Porque al multiplicar por 0 resulta 0.
En esa parte explica que según el valor que tengan los pesos, el valor de salida de una unidad cambia. La salida y = f ( entradas, pesos). Para unas mismas entradas, con unos pesos te da una salida y con otros otra salida.
Después, en otra parte posterior del artículo, explica que hay una operación llamada Backward Pass, o 'entrenamiento' que modifica los pesos, intentando que la salida sea la quieres... Y que la 'y' que obtienes (y_real) sea más parecida a la "y" que deseas ( que podemos llamar y_objetivo, o y_ideal) es lo mismo que decir que el error sea el mínimo... Ej: si (y_ideal - y_real) , es decir, la resta, la diferencia, es pequeña o es menor que antes entonces la distancia es pequeña o es menor y quiere decir que estás más cerca, que tu y_real está más cerca de la Y_ideal que quieres que te de la red.
En resumen:
los pesos (incluyendo el peso de sesgo) son números variables que definen el "estado" de la red y ese "estado" determina el valor de salida que obtienes para cada vector de entradas.
El entrenamiento de la red consiste en cambiar esos pesos (ej: unos los disminuyes, otros los aumentas, etc) para acercarte más y más a los valores de salida que deseas para cada entrada.
Cuando el valor de salida, para cada entrada, es el que deseas, o suficientemente cercano, ya puedes dar por finalizado el entrenamiento y mágicamente tu red neuronal artificial ha "aprendido" a clasificar las entradas en los grupos que querías. En el ejemplo del artículo, cuando la salida da 4 para cada conjunto de vectores que sean imágenes del número 4, y cuando da 5 para las imágenes de 5, y da 6 para las del 6.... la red ha aprendido a clasificar bien las imágenes, reconociéndolas cada una como el número que refleja. Al menos con ese conjunto de imágenes de entrada... porque podría fallar con otra imagen de un número que yo escriba, que no sea igual a esos con los que se ha entrenado.
cc #2
#2 Lo que quería decir es que el artículo usa términos que no explica, y como tú dices es una introducción, se supone que el lector no conoce ninguno
#2 Todo esto se entendería mejor con un ejemplo numérico simple.
#31 Yo la que conocía es la del año pasado el NIPS, dónde interrumpió la conferencia para decirle al Goodfellow que las GAN eran invención suya. Un tio con un par de huevos.
#44 Esa fue la mas sonada, pero ha tenido otras.
+1 por llamarlo deeplearning. Pero un par de matices. Primero, no es un campo moderno, la primera red de Deep learning es de los 90, pero hasta 2012 no existió ni la tecnología ni un conjunto de datos lo suficientemente grande para que esté método brillará. Hablo de los investigadores usando AlexNet sobre una GPU para ganar ImageNet. Segundo, las redes neuronales si se inspiran bastante en lo que sabemos del cerebro y cada vez tratan de hacerlo más por los avances que ello ha supuesto. Cada neurona se llama así porque es un modelo matemático de una neurona, las Redes convolución alea están inspiradas en como las neuronas de la visión se conectan, recientemente se añadió atención a los modelos que es una capacidad de la mente humana y está dando unos resultados muy buenos. Por último la función de perdida, loss, ha de ser un valor positivo lo más pequeño posible. Los métodos que menciones para optimizar la función de perdida don todos descuente del gradiente, pero con ligeras modificaciones. Hay otros no basados en descenso del gradiente pero son más costosos de calcular.
#4 De 1990? Que no te oiga Jürgen Schmidhuber.
1965: First Deep Learners: Ivakhnenko and Lapa published the first general, working learning algorithm for supervised deep feedforward multilayer perceptrons...
#7 http://www.scholarpedia.org/article/Deep_Learning The ancient term "Deep Learning" was first introduced to Machine Learning by Dechter (1986), and to Artificial Neural Networks (NNs) by Aizenberg et al (2000)
No creo que sea correcto llamar a un perceptron multicapa deep learning. Hubo muchos problemas que solucionar para poder llegar a arquitecturas con más de un par de capas.
#8
¿No será una cosa de terminología?
Si vemos lo que se llama "Deep Learning" por lo que he visto se trata de (1) estructuras de múltiples capas y (2) un aprendizaje (normalmente supervisado, pero podría ser no supervisado)... así que, desde este punto de vista, un perceptrón multicapa por sí solo no tiene por qué cumplir el punto (2) pero desde el momento que se usaron algoritmos de aprendizaje como el de Retropropagación ( Back Propagation , en 1986 )
https://en.wikipedia.org/wiki/Backpropagation#History
para esos Perceptrones Multicapa ya se puede decir que eran lo que hoy llamamos Deep Learning.
Lo que pasa es que:
* Hasta 1993 no se prestaba mucha atención a ese método... fue en ese año cuando un sistema basado en Retropropagación ganó una competición internacional de reconocimiento de patrones.
* Hasta el año 2010 o por ahí, cuando empezaron a usar las GPU para esto, el entrenamiento era muy lento, como dijo #4
* Por lo que he visto, ahora es mucho más común aplicar formas de conectar (la entrada o una capa con la siguiente) que no son densas, no son capas completamente conectadas... mientras que los modelos inciales, como el Perceptrón Multicapa eran densos: conectaban todo con todo y se suponía que eso ya incluía la posibilidad de falta de conexiones a base de hacer pesos iguales a cero, que es equivalente a quitar conexiones.
Lógicamente, el exceso de conexiones de los modelos iniciales hacía más pesado / lento y más cuestión de azar el entrenamiento.
Por ejemplo, en un reconocimiento de imágenes, en el modelo tradicional cada pixel de entrada se conectaba a todo en la segunda capa, de forma que el modelo no tenía en cuenta lo cerca que estaba un pixel del otro... lo cual tiene su importancia. Pero los modelos más recientes, los píxeles cercanos se conectan a las mismas neuronas (o la mayoría son las mismas) de la primera capa oculta... de forma que un pixel alejado no está conectado a ninguna que se conecta el otro (o una parte muy pequeña).
Vamos, que antes del año 2000 no se usaba ese término (Deep Learning) pero se hacía lo mismo que hoy llamamos Deep Learning aunque lo llamaban con otro nombre (entrenamiento de redes neuronales multicapa, etc).
cc #7
#23 Lo que dices de conectar capas que no son densas tampoco es una idea nueva, es de finales de los 90 con la arquitectura LeNet si no recuerdo mal. Por no mencionar los diferentes tipos de arquitecturas como las rede ART o las redes Hopfield. Desde que se utilizó el método de backpropagation hasta el punto de inflexión de 2012 ha habido que solucionar muchos problemas. Por mencionar algunos: la forma de inicializar los pesos de las neuronas, el Vanishing gradient problem que dejaba a 0 los gradientes en pocas capas, etc.
El punto de inflexión sigue siendo 2012: un gran conjunto de datos (ImageNet) y un modelo computacional mucho más rápido (GPUs). La teoría ya estaba allí, ya que llevaba desarrollandose desde los 90, pero sin demasiado interes porque no habia buenos resultados comparados con otras técnicas.
#24 Sí, vale, pero:
¿El perceptrón multicapa (MLP) tiene varias capas (de unidades no-lineales, etc)? Si, luego es Deep
¿El MLP con backprop es un sistema con aprendizaje? Sí, luego es Learning
Por tanto, era Deep Learning
* No tenía mucho éxito... pero era lo que llamamos Deep Learning
* Era lento... pero era Deep Learning
* Tenía problemas, que hoy se han solucionado / mejorado... sí, pero era Deep Learning
#25 Un MLP con backpropagaiton es Deep Learning? No, básicamente porque a partir de la tercera capa los gradientes son 0 y no aprende. No te puedo decir una fecha donde se pase de learning a deep learning, es más bien un proceso que empieza en los 90 y se desarrolla en los 90 y 2000 hasta culminar en 2012.
#26 ¿Es necesario tener más de 3 capas para que sea Deep Learning?
#27 ¿Llamarias a algo con 2 capas deep?
#4 #26 Yo diria que deep learning és un modelo basado en capas más un conjunto de hacks para hacerlo funcionar. Considerar sólo la red sin todo lo demás me parece insuficiente, nunca conseguirás entrenar una red sólo con backprop. Es la unión de las dos cosas lo que lo hace funcionar. Creo.
#23 Segun veia las ilustraciones , me venia a la mente un articulo de Omni sobre perceptrones y retropropagacion que leí a finales de los 80 asi que si , podemos decir que el deep learning sobre ordenadores es de esa epoca , pero por otro lado , las redes fisicas con reles y bobinas creo que ya estaban en marcha sobre finales de los 60 y los estudios matematicos son incluso anteriores , asi que ambos andais meneando razon
Me encanta que se publiquen estas cosas por y para meneantes.
#50
"redes fisicas con reles y bobinas"
Me extraña esto que dices... más que nada porque no veo cómo se podría entrenar una red de relés y bobinas... Otra cosa sería entrenar un modelo matemático y una vez entrenado construir físicamente los pesos en algún tipo de circuito.
Se que existen circuitos específicos de Redes Neuronales, es decir, chips... que, claro está, imagino que sí admiten entrenamiento y supongo que son digitales, pero estos no estarían formados únicamente por relés y bobinas sino básicamente por transistores y similares. Y creo recordar que los primeros son los de los 90 aunque no se si se haría alguno a finales de los 80. Me extraña que se hicieran antes. Pero, vamos, hablo de memoria, no me he puesto a consultar.
#51 Yo tambien hablo de memoria de un articulo que lei hace como 30 años...bastante hago acordandome que fue en Omni y que fue a finales de los 80
He buscado y lo que usaban era memristores
https://en.wikipedia.org/wiki/ADALINE
#52
Ah, pues sí, el famoso ADALINE que luego tenía una versión de múltiples capas llamada MADALINE.
Pero no son memristores / "memristors" (que existen y son otra cosa) sino memistores / "memistors", es decir un tipo de resistencia (resistor) con memoria. El memistor tiene 3 "patas" y permite cambiar el valor de la resistencia, que haría el papel de un peso asociado a una entrada, que se multiplicaría por otro valor y que además es variable, con lo cual sí permite el entrenamiento.
Ahora bien, el ADALINE por sí mismo no define un entrenamiento, no dice ni establece un mecanismo concreto sobre una forma de modificar los pesos para obtener un resultado deseado... Por tanto, si no define un "Learning" no sería Deep Learning. Tampoco es Deep porque ADALINE es una capa y una de las cosas que implica el Deep son múltiples capas. El MADALINE con un algoritmo de entrenamiento que le permita aprender sí empezaría ya a poderse considerar Deep Learning (bueno, quizá), aunque lo cierto es que 3 capas no son muchas y los algoritmos que había cuando se propuso el MADALINE en 1962 no eran muy buenos, no era mucho "Learning" que digamos.
Aquí el artículo de 1960 sobre ADALINE:
http://www-isl.stanford.edu/~widrow/papers/t1960anadaptive.pdf
#7 completo tu referencia con el estudio histórico de Schmidhuber https://arxiv.org/abs/1404.7828
#29 Estaba buscando el video de una conferencia, no se si de Bengio o LeCun, en el que en el apartado de preguntas les echa en cara el que no citen a Ivakhnenko &cia. No lo conoceras, no?
#0
"redes neuronales, aunque podéis leer muchas cosas por ahí, estas redes no se basan en el funcionamiento del cerebro, básicamente porque desconocemos el funcionamiento exacto del cerebro. Este hecho es muy importante en cuanto a terminología, una red neuronal no está formada de neuronas, está formada de unidades."
Yo también diría, como #4 que sí se inspiran en el funcionamiento de neuronas biológicas, así que aunque no se podría decir que "funcionan igual que un cerebro" o "igual que una neurona de un cerebro", sí se podría decir que "se basan" (se inspiran) en el "funcionamiento" (mecanismos y estructuras que sí conocemos) del cerebro.
En cuanto a terminología sí se puede puede hablar de "neurona artificial" o "neurona de McCulloch y Pitts" o "neurona MCP"
https://es.wikipedia.org/wiki/Neurona_de_McCulloch-Pitts
En ese artículo de Wikipedia se puede ver que el modelo matemático de la neurona artificial que definieron en 1943 Warren McCulloch (un neurólogo, máster en Psicología y doctorado en Medicina) y Walter Pitts (matemático especializado en lógica) era el mismo que se usa en las "unidades" del Deep Learning: los pesos que se multiplican por entradas, se suman esas multiplicaciones, se aplica un umbral (se suma, o se resta) y por último una función de activación no lineal. Creo que es claro que este modelo está basado en neuronas biológicas reales, con el conocimiento que se tenía de ellas. Así que... sí, esas cosas llamadas "unidades" sí están basadas o al menos inspiradas en las neuronas biológicas reales, y se puede ver que habitualmente se las ha llamado "neuronas artificiales" sin ningún tipo de problema.
Eso en cuanto a las neuronas individuales, pero es que también el hecho de tener varias neuronas independientes que reciben las mismas entradas y operan en paralelo (mientras una hace unos cálculos / operaciones otra u otras 100 ó 1000 neuronas hacen otros cálculos / operaciones) también es la forma en la que funciona un cerebro biológico, y es algo fundamental que se suele poner como característica distintiva de un cerebro biológico y un ordenador tradicional, secuencial, ya que este último hace una operación en cada instante y no puede hacer 2 operaciones a la vez. Aunque es cierto que los ordenadores actuales tienen varios núcleos (que pueden hacer sus operaciones de forma independiente, en paralelo) y se da el importante hecho de que las GPU pueden hacer muchísimas operaciones en paralelo. Pero, vamos, que tanto la neurona individual, como la estructura de varias neuronas en paralelo, como ciertas configuraciones de conexiones SÍ están "basadas" o "inspiradas" en cerebros biológicos. Lo cual, evidentemente, no significa que sean iguales a un cerebro biológico... Un avión o un dron que mueve las alas puede estar "basado" o inspirado en un pájaro, y puede volar, pero es evidente que no es igual que un pájaro.
El articulo da un poco de grima, la verdad... Pretende ser una introducción pero mantiene una jerga absurda que para nada facilita la comprensión de alguien que no conozca el tema ¿"Pesos sinápticos"? Joer, que son los coeficientes de toda la vida de una combinación lineal... ¿"Unión sumadora"? ¿No queda mejor el clásico "suma"? "...a la función se le añade una variable más llamada peso de sesgo que permitirá activar o desactivar la unidad...". Es la ordenada en el origen de toda la vida y no, no sirve para activar o desactivar nada...
Al final un tema interesante se echa a perder, una pena.
Ah, y por supuesto que un perceptron multicapa con backpropagation es deep learning, vaya debates absurdos que montáis algunos...
#30 Para serte sincero la imagen es de la Wikipedia (https://en.wikipedia.org/wiki/Multilayer_perceptron). La jerga es la que se usa en el ámbito de las redes neuronales, al final es multiplicar matrices por matrices y sumar un offset. De heco al final una unidad se representa por una columna en la matriz.
Lo de activar o desactivar unidades tampoco es una terminología incorrecta. Es cierto que es la ordenada en el origen, un offset o llámalo como quieras. Pero cuando se utiliza con una función de activación del estilo ReLu (https://en.wikipedia.org/wiki/Rectifier_(neural_networks)) esa suma permite que la función de activación devuelva siempre 0 independientemente de la entrada. Como en la capa siguiente al final lo que tienes una multiplicación de matrices, lo que aporta esa unidad "no es nada" (aporta un 0 que ya es bastante ) y comunmente se dice que la unidad se desactiva o se muere (dying ReLu) aquí viene explicado con más detalle: https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0
Obviamente todo esto depende de la función de activación, en el caso de la sigmoide el problema que aparece es el vanishing gradient (https://en.wikipedia.org/wiki/Vanishing_gradient_problem)
#34 Precisamente la jerga que se usa es mas que cuestionable. Parece creada expresamente para inflar una burbuja. Por eso no me parece adecuada para un escrito de introducción (a ningún tema).
Lo de activar o desactivar unidades, por ejemplo, solo es cierto para un caso particular de función de activación. ¿Crees adecuado entonces usar esa expresion hablando del caso general?
#35 Entiendo lo que dices, pero no soy yo quien va a juzgar la moda. Al final es terminología para acercarse a un tema concreto. Es decir, te pongo el ejemplo de un websocket, no deja de ser un socket normal y corriente donde hay un stream de datos, pero cuando dices websocket ya contextualizas. Aunque obviamente si aparece un tío de hace 20 años lo más probable es que nos insulte y nos mande a la mierda por tal aberración.
Respecto a la desactivación, puede que tengas razón, solo trataba de que fuera más fácil visualizar para que puede servir esa variable. En cualquier caso, la desactivación es bastante común que ocurra, casi todos los modelos usan ReLu por lo fácil que es de calcular y sus propiedades.
#30 Al principio se les llamaban synaptic weigths. A día de hoy todavía uno de los libros de texto de referencia es el "Neural Networks" de Haykin, que es en el que parece basarse el diagrama que está puesto ahí "castellanizado". A día de hoy se les llama simplemente weights, en castellano, al menos con los compañeros de doctorado, les llamamos pesos y no coeficientes.
A lo que él llama "peso de sesgo" le llamamos bias y punto, no lo traducimos al castellano así que no sabría decirte si alguien le llama comunmente "ordenada en el origen". Pero sí que seguramente lo correcto sería llamarle sesgo porque al menos cuando una red está muy "biased" sí decimos que está sesgada.
En cuanto a la activación, efectivamente el bias no activa o desactiva, lo que hace es desplazar la función de activación (shift). Sea una sigmoide, tanh o ReLu, un desplazamiento a la derecha puede causar que un input que activaría ya no lo haga, y a la izquierda un input que no activaba sí lo haga.
Muy buen artículo! Pensaba escribir yo uno a la vuelta de vacaciones, pero si ya está tratado el tema supongo que ya nada Felicidades! Si puedo poner una pega pequeña es que no es moderno, lo que es moderno es usar convoluciones, y luego inception y resnet. En el año 95 el ejercicio final de sistemas conexionistas en la universidad ya era hacer una red de reconocimiento de imagen con Matlab. También recuerdo echar unas risas cuando las cosas se resolvían "por Kohonen".
#47 2000 para todo MNIST, es decir, 200 por número (del 0 al 9), y el accuracy y el loss ya será suficientemente aceptable como para que si sigues entrenando no observes cambios significativos. Puedes probarlo tú mismo entrenando con el propio navegador: http://cs.stanford.edu/people/karpathy/convnetjs/demo/mnist.html
#48 ahh, ok. Muchas gracias
#0 Utilizas una imagen de stock con marcas de agua. Ademas de quedar como el culo haciendo esto das a entender que el tiempo y trabajo del artista digital autor de la imagen te importa bastante poco. Luego querrás que la gente menee este artículo y deje comentarios valorando que bien articulado está tu texto. Te pediría que por favor elimines la imagen del artículo, o mejor aún, que compres la imagen original, por respeto al trabajo intelectual que tanto deberíamos apreciar en Menéame.
#5 ¿Cómo sabes que las está usando sin permiso? ¿Eres el autor de las imágenes?
#5 Tienes toda la razón excepto en que no sabes si el legítimo propietario de la imagen le ha dado derechos de reproducción o de si ha utilizado, como es bien sabidos para fines académicos el derecho relativo a la LPI...en definitiva. El que tenga una marca de agua no demuestra nada y en todo caso, si se cita la fuente y en este caso valdría con seguir el rastro de su origen con su url, existe el derecho de cita.
Otra cosa es que se lucrase de dicha imagen o la difundiera para fines espurios sin marca de agua. Para todo lo demás el copyleft: si eres bueno no necesitas copyright. De hecho, el copyright solo protege hasta cierto punto, ya que las ideas al final son mezcla de otras, por mucho que conozca la LPI no dejo de pensarlo y estar cada vez más a favor del copyleft y de pedir que se use algo con campañas de marketing (no confundir con publicidad) en condiciones: ejemplo: Iron Maiden
#5 #11 Tan sencillo come que si hubiese comprado la imagen en https://www.bigstockphoto.com/image-118747484/stock-photo-cybernetic-brain habría utilizado la imagen sin marca de agua. No sé si utilizar la imagen con marca de agua en otros sitios aparte del de la tienda online va en contra de los Términos y Condiciones de la propia tienda. Pero desde luego lo que muestra es una falta de respeto hacia el autor original que no recibirá ninguna retribución por este uso.
#12 o también una excelente promoción de tal imagen y su autor si los humanos que lo ven se sienten interesados en más material de este tipo. El problema es que todo termina derivando en trolls de patentes y afortunadamente en Europa las aprendes de software las tenemos que disfrazar de algoritmos que tienen parte física en un hardware específico y en los que el hardware en si supone un avance y guarda todas las características de una patente. (no podemos a las claras patentar software que no sea parte de un sistema físico) y todo va por LPI. (Un 70% igual y todas esas evidencias)
En definitiva, lo que falla no es el respeto, como falsamente nos vendió la sgae y otros lobbies muy a sabiendas: Está fallando el modelo de negocio
#14 No te vayas por los cerros de Úbeda. El autor del artículo buscó una imagen en Google para acompañar el texto y esta del cerebro mecánico salió en los primeros puestos y le gustó. En lugar de registrarse en la tienda de imágenes en stock y pagar por la imagen, le pareció que no merecía ni su esfuerzo ni su dinero. El problema es que en este caso lo que tienes que hacer es o buscar una alternativa abierta o no usar la imagen. Pero no usarla sin licencia. El autor vive de los royalties de la imagen no de la publicidad.
#15 El problema es el sistema de "vivir de royalties", que genera una plusvalía que no debería tener, ya que el valor de una creación al tener estos tipos de licencias genera que todo se pervierta: i.e. mueren personas porque no pueden cultivar con semillas que han cultivado de una multinacional o acceder a un medicamento: lo de que la investigación es carísima es cubrirse las espaldas (te lo digo yo).
Deberías hablar 10 minutos como he hecho yo con Richard Stallman y luego igual pensabas de otra forma.
Legalmente tienes razón: moralmente en el medio y largo plazo ¡NO!
#18 El autor de la imagen es legítimo propietario de ella y la comercializa como quiere. Lo que tu llamas 'vivir de royalties' se llama trabajo digno para la mayoría de artistas digitales y fotógrafos. No sé a quien tienes en mente si los Rolling Stones o la familia de Elvis Presley. Pero la mayoría de autores (como el de la foto en cuestión) son autores pequeños donde un uso particular de una foto significa parte del sueldo mensual.
Quizás tendrías que ponerte en la piel de muchos pequeños artistas y fotógrafos y le cuentas la misma historia de las multinacionales. Y aunque supusiésemos que el artista detrás de esta imagen es un multimillonario con puro, esmoquin y sombrero de copa alta y planteases esta acción como un acto de rebeldía ante una supuesta ley injusta, este no es el caso. El autor del artículo simplemente copió y pegó la imagen sin importarle un pimiento la autoría ni los royalties ni ninguna ley inmoral.
#20 Estoy criticando el modelo de negocio y lo que implica incluyendo el empobrecimiento de tu autor
#5 Te doy la razón, ha estado mal copiar la imagen con marcas de agua, quito la imagen, que además no aporta nada sustancial al artículo.
"la resolución de las imágenes es de 28x28x1 (ancho x alto x profundidad de color)"
y después
"Una imagen del MNIST es una matriz cuadrada (o tensor de orden 2) que contiene valores de 0 a 255"
Si la imagen tiene 255 tonalidades de gris, entonces sería una imagen de 8bits, ¿no?
Por lo que la afirmación inicial sería:
"la resolución de las imágenes es de 28x28x8 (ancho x alto x profundidad de color)"
#40 Nope. En el input la profundidad es el número de colores. Piensa que internamente son números reales, no bits. Lo que sí se hace es normalizar cada color, en este caso convertirlo en un número entre -0.5 y 0.5. Paara hacerlo tan sencillo como p/255-0.5
A ver si dejáis ya las drogas...
Muchas gracias por tu tiempo, por tu resumen y por usar la jerga del aprendizaje profundo (deep learning).
Unas primeras dudas que surgen, al comenzar a entender qué piezas participan en este complejo sistema es: el backward pass. Es decir, cómo le decimos al sistema que el resultado es el que queremos.
Y más concretamente, ¿cuántas veces le tenemos que decir que una imagen es un 4 para que las siguientes imágenes de un 4 las acierte?
#42 Va a depender de muchas cosas: la topología, el learning rate, si usas data augmentation... de todas maneras piensa que no acertará el 100%, igual que un humano no siempre acierta con la letra de otra persona. Pero por poner un ejemplo con MNIST, entrenado con adadelta, y una topología fácil (conv relu pool conv relu pool softmax) con 2000 ejemplos vistos ya tira bien.
#46 2000 veces hay que decirle manualmente al sistema si ha acertado ?
no he entendido la mitad de lo que has escrito pero lo considero sumamente interesante y ademas agradezco que compartas lo que sabes, de momento he aprendido que el deep learning es un proceso por capas en el cual los datos se van filtrando de una a otra con distintos baremos hasta que una vez filtrados son comprensibles por el ordenador, me recuerda a los arboles de toma de decisiones por lo del peso y eso, esperando las otras 3 partes, aunque no me entere
y el 2 de 4 ?
@dmoran muchas gracias por esta introducción. Me ha sido muy útil
#37 Te animo a que sigas publicando las otras partes de tu artículo. A mi me interesan, y conocía solo algunas cosas. Veo que te han puesto algunos negativos, pero no haría mucho caso. Lo que si te pido es si puedes actualizar el artículo principal con las correcciones o aportaciones que te han hecho algunos compañeros (a no ser que vayan a ir en las siguientes partes). Gracias.
¿Qué licencia tendrán tus artículos?
En https://tech.io se puede montar un curso igual pero con los ejercicios y ejemplos que corran dentro de una máquina virtual.
Si la licencia es MIT y los ejercicios no requieren de mucho tiempo de CPU y recursos normalitos supongo que se puede portar y tener el curso con los ejercicios de tensorflow interactivos.
#16 Anda, no conocía tech.io, le echaré un ojo. La verdad que el artículo lo puedes usar para lo que quieras . A no ser que algún voluntario me vaya a dar unos millones...