Nube de Etiquetas
(Ah?)
Mostrando las entradas con la etiqueta Neural Nets. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Neural Nets. Mostrar todas las entradas

lunes, enero 29, 2018

Una especie de Pensum para aprender Machine Learning por tu cuenta

Digamos que deseas entrar en el campo de Data Science/Data Mining/Machine Learning, sin estudiar una Maestría o PhD. ¿Cómo hacer? Yo acá comparto una suerte de "pensum" autodidacta, basado en cursos y recursos online, que pudiera servir como camino para entrar en esta área.
Como video inspiracional, está este video en donde una chica cuenta cómo se inició como Data Scientist de forma autodidacta: 

Ahora, yendo al grano, la ruta que yo pensaría que podría ayudarles a entrar al tema es esta:
  1. Básico de Python para análisis y visualización de datos: https://www.coursera.org/specializations/introduction-scripting-in-python?siteID=.GqSdLGGurk-kvC_Sa81XIfCLUjkljxQYA&utm_content=10&utm_medium=partners&utm_source=linkshare&utm_campaign=*GqSdLGGurk... porque primero hay que saber examinar datos y tener una idea preliminar de qué está pasando. Saber hacer esto en Python y en excel les pone a poder aplicar como Data Analyst en cualquier país del mundo, en especial si aparte de esto aprenden SQL y Hadoop/Spark.
  2. Básico de Machine Learning (por el prof. Ng, usando Octave o Matlab):https://www.coursera.org/learn/machine-learning ...Este curso es para ya adentrarse en Machine Learning. Recomendaría instalar Octave.. simplemente porque es gratis!
  3. Luego sugeriría replicar los resultados obtenidos en el curso del prof. Ng, usando Python y las librerías de machine learning (en especial Sci Kit Learn).
  4. Si les anima, pueden ver el curso de Deep Learning para poner la guinda a la torta: https://www.youtube.com/playlist?list=PLlJy-eBtNFt6EuMxFYRiNRS07MCWN5UIA  Acá está el material del curso: http://cs231n.github.io/ ...Sin embargo, a menos que vayan a trabajar con datos que son video, imágenes, o audio, o series de tiempo, no me apuraría demasiado a aprender Deep Learning. En todo caso la recomendación base es.. NO aprender Deep Learning sin haber dominado en general análisis de datos, estadística, y los métodos clásicos de Machine Learning.
Esto es una ruta sugerida, basada en aprender Octave y Python. Hay gente que recomienda R. Yo, sin embargo, a menos que ya supiese que en donde estaré trabajando, se usará R exclusivamente, preferiría Python, por ser un lenguaje de uso general, que se convertirá en una destreza transferible para otro tipo de problemas y trabajos. No es que R sea malo, es sólo que saber Python es una herramienta que es transferible a muchas otras cosas fuera del cómputo científico.

Estoy seguro de que habrá quienes tengan propuestas y recomendaciones alternativas, y me honraría que compartieran su opinión en la sección de comentarios.

Recursos para aprender Machine Learning

En esta entrada, he querido compartir una serie de recursos que quienes quieren inicarse en el área de Machine Learning podrían encontrar interesantes:

Foros de Reddit:

Artículos de ArXiv

Blogs:

Libros:

Cursos:


viernes, mayo 04, 2012

Enfoques basados en optimización convexa para clasificación de patrones

Tal y como lo comenté anteriormente, el próximo martes 8 de mayo de 2012, en la Sala Carlos Aragone, Edf. FEI-256 (segundo piso), de la Universidad Simón Bolívar (USB), a las 2:30pm se dictará un seminario titulado:

ENFOQUES BASADOS EN OPTIMIZACION CONVEXA
PARA LA CLASIFICACION DE PATRONES

El expositor, el Prof. Orestes Manzanilla (del Dpto. Procesos y Sistemas de la USB)

Resumen

En este seminario se mostrará un enfoque novedoso para resolver un problema específico dentro de las áreas de minería de datos, aprendizaje artificial y reconocimiento de patrones: el de la clasificación de patrones. Este es un problema con diversas aplicaciones, entre las cuales se puede mencionar el apoyo en
prognosis médica, otorgamiento de créditos, categorización de textos, prospección petrolera, detección de patrones de fraude, detección de patrones físicos (sonoros, visuales, etc), análisis de perfiles de expresión genética, ADN y proteínas diversas. Se hará un breve repaso de las técnicas más comunes para la resolución de este problema,  nacidas de la estadística, y de distintos campos de “máquinas de aprendizaje”, algunos de ellos bio-inspirados, indicando brevemente las ventajas y desventajas de cada método.
Se expondrá un grupo de heurísticas basadas en optimización lineal, y lineal entera-mixta para la generación de clasificadores de patrones de tipo no-lineal (pero lineal por partes), que puede representarse tanto como redes neurales artificiales, como árboles de clasificación, explicando las ventajas y  desventajas que comparativamente se observan respecto a los métodos mencionados anteriormente.
Los métodos están orientados hacia la búsqueda de (1) la minimización de la dependencia del “éxito” de la implementación, de la experticia del implementador, cerrando la brecha "tecnológica" que actualmente mantiene a los no-expertos alejados de este tipo de problemas, y (2) la escalabilidad de la técnica, para garantizar su aplicabilidad en bases de datos masivas. Por último, se esboza el posible uso de las  estructuras no-lineales generadas en el espacio multi-dimensional, ya no tanto para la predicción de la categoría o patrón de un nuevo
indivíduo de clase desconocida, sino para la visualización de los patrones en el espacio multi-dimensional.

Palabras claves: Programación lineal, Redes neurales artificiales, Máquinas de Soporte Vectorial, Clasificadores de patrones, Máquinas de aprendizaje.

lunes, abril 04, 2011

Aceptado artículo sobre el uso de programación lineal para la construcción de clasificadores de patrones binarios

Fue aceptado en la revista Decision Support Systems (4ta revista en el ranking de las revistas de Investigación de Operaciones) el siguiente artículo:

García Palomares, U; Manzanilla, Orestes
. "Novel linear programming approach for building a piecewise nonlinear binary classifier with a priori accuracy". DECISION SUPPORT SYSTEMS. 2011. Indexada en el SCIENCE CITATION INDEX.

En este trabajo, el prof. Ubaldo García Palomares y yo hemos diseñado un algoritmo que construye una estrutura no-lineal, pero lineal por partes, que separa la data de entrenamiento de un problema de clasificación, logrando alcanzar, en ese conjunto, una precisión tan alta como se requiera.

En cada iteración, se resuelve un modelo de programación lineal, o un número arbitrariamente pequeño de modelos de programación lineal entera-mixta. Se muestran bondades que permiten el uso de procesamiento paralelo y/o distribuído.

Entre las bondades que presenta el trabajo, al igual que otros algoritmos similares como el Multi-Superficie (MSM) de Olvi Mangasarian, es que requiere de un mínimo de parámetros a utilizar por parte del usuario, haciendo que el resultado de la aplicación del modelo sea poco dependiente de las decisiones de implantación por parte del usuario.

La estructura resultante puede ser evaluada tanto como árbol de clasificación, como red neuronal artificial.

Actualización del 11 de Abril de 2011
Puede descargarse la versión preliminar enviada para la revista Decision Support Systems, en la sección de Reportes Técnicos del CESMa (Centro de Estadística y Software Matemático), correspondiente al año 2011.

lunes, febrero 07, 2011

¡Aprobadas tesis de maestría en I.O. aplicada a Machine Learning!

Orgullosamente felicito a mis dos amigas y tesistas de la maestría en Ingeniería de Sistemas de la USB (opción Investigación de Operaciones), Adriana Torres y Ana Serra, quienes este viernes en la mañana tuvieron sus respectivas defensas, con un jurado integrado por mi persona, como tutor, por el prof. Marcos Raydan, como miembro principal del jurado. Los presidentes del jurado evaluador fueron, respectivamente, Ana María Borges y Hugo Montesinos.

Los nombres de los trabajos de grado son:
  • "Clasificación multicategoría de patrones mediante optimización de multisuperficies" - Adriana Torres
  •  "Algoritmo de Boosting en Métodos Multi-superficies para clasificación binaria" - Ana Serra
Ambas defensas tuvieron lugar en la sala de reuniones del Centro de Estadística y Software Matemático.

Felicidades por un trabajo bien hecho! Es un placer contar con tesistas de ese calibre.

lunes, junio 01, 2009

Charla: Clasificadores multi-superficie con minimización asimétrica de errores


En el contexto del Primer Ciclo de Charlas de los Postgrados en Estadística a realizarse los días jueves de las semanas impares de este trimestre, este jueves 4 de junio de 2009 dictaré esta charla, a las 11:30 am en el edificio MyS oficina 108. Específicamente, se realizará en la sala de seminarios del CESMa-USB.

Las charlas están pensadas para que estudiantes o egresados de nuestros programas compartan resultados o avances de sus trabajos de grado, estimulando el intercambio de ideas entre los participantes.

El tema de mi ponencia, en esta ocasión, versará sobre el uso de heurísticas de optimización, para la generación de un clasificador de patrones (reconocedor de patrones) multi-superficie. Se hablará sobre las Redes Neurales Artificiales de Clasificación Binaria (perceptrones de una capa oculta), Máquinas de Vectores de Soporte (SVMs), y sobre enfoques innovadores en el tratamiento asimétrico de errores de clasificación.

domingo, marzo 30, 2008

Overfitting o Sobre-ajuste

Agenda:

  • Este post empieza con una sacada de navaja.
  • Luego explicaré por qué este post es una respuesta a uno de mis lectores, y recomendaré no usar este blog para citas en trabajos académicos.
  • Por último explicaré, de la forma más amena de la que sea capaz esta vez, qué es el Overfitting o Sobre-ajuste, o el Sobre-entrenamiento.
Permítanme empezar sacando la susodicha navaja:

Plurality should not be assumed without necessity
- William de Ockham, siglo XIV

O dicho de otra forma: KISS (keep it simple, stupid!). Pero antes de explicar qué tiene que ver esto (la Navaja de Ockham) con el overfitting, permítanme escribir algo sobre el contexto de este post.

Recibí en estos días un correo de Marc (no coloco el nombre completo porque lo correcto es proteger la privacidad), en donde me decía lo siguiente:

He visto tu articulo sobre las svm , pero la verdad es que me falta una
cosa de él, el problema de el sobre-aprendizaje, me puedes comentar algo sobre
el tema? lo necesito para un trabajo

Yo ya tenía en mis planes escribir sobre el overfitting, debido a que es un tema obligado al hablar de aprendizaje. Sin embargo, antes de empezar a hablar sobre ello, quiero dejar algo en claro:

no recomiendo citar lo que se escribe en este blog, en trabajos académicos.

¿Por qué? la razón es muy sencilla. Esto no es una fuente arbitrada. Y adicionalmente, la informalidad con la que están explicadas las cosas no lo hace una buena fuente para elaborar trabajos académicos. Sin embargo es una buena fuente (o al menos pretendo que lo sea lo más posible!) para adquirir entendimiento.

Si alguno de ustedes necesita referencias que puedan ser citadas sobre algún aspecto de los conversados acá, déjenme el comentario y gustoso compartiré las fuentes que yo conozca al respecto. ¿Vale?

En fin, ahora si,...


hablemos sobre overfitting: ejemplo "humano"

Hablar de overfitting es hablar de situaciones como la siguiente:

Estamos en un salón de clases, recibiendo datos de un profesor que escribe sobre la pizarra.
Nosotros podemos aprender los principios generales que él trata de transmitir usando su voz, sus gestos, y los rastros que deja la tiza sobre la pizarra durante algunos de los erráticos gestos.

Sin embargo, vemos con cierta frecuencia que hay personas que copian cada frase de lo que indica el profesor. Según mi experiencia docente me ha hecho reflexionar, hay muchas cosas que uno como profesor dice, que no es realmente necesario copiar (algunas hasta el profesor se arrepentiría de decirlas!).

Un estudiante podría copiar incluso esquemas de la gesticulación, cuantas veces la persona ha respirado en una pausa, o la intensidad de un ataque de tos. Obviamente estoy exagerando, pero ese es el punto: la exageración.

Es esa es la parte que sobra, cuando hay "sobre-entrenamiento", "sobre-aprendizaje", o "sobre-ajuste". Es decir, la parte "over" del overfitting.

Uno no necesita aprender los gestos y ruidos (palabras innecesarias) del profesor. Ellos incluso podrían distorcionar el concepto general que se trata de explicar.

En nuestro cuaderno, deberíamos ser lo más simples posibles. ¡Apéguense a la navaja de Ockham, muchachos!.


ejemplo inhumano...


De igual forma, uno puede tener una serie de datos, y usar un modelo matemático para "aprender" su patrón. Digamos que queremos hacer una regresión. El mínimo error siempre es deseable, pero no a cualquier precio. Uno podría tener puntos que son bastante cercanos a un modelo lineal, aunque los puntos no están exactamente sobre la recta que hemos trazado, lo cuál daría una cierta cantidad de error.

El caso del sobre-ajuste, sería uno en el que decidiéramos usar una función más compleja que una simple recta, para que pase por todos los puntos, tal y como se ve en la figura de abajo (cortesía de wikipedia):

En esta curva de 8vo grado (polinomio de grado 8), estamos estimando 9 parámetros para obtener la función,... para ajustarla sobre 10 puntos. Es decir, estamos consiguiendo un modelo matemático casi tan complejo como los datos que representa. Si tenemos en cuenta que un modelo se supone que debe representar de forma simple el comportamiento de los datos (una especie de "resumen" del comportamiento de los mismos), pareciera que acá terminamos teniendo un modelo "poco eficiente".

Sin embargo, no es sólo un problema de poca eficiencia. Si tenemos en cuenta que estos modelos frecuentemente se utilizan para predecir la "aparición" de otros puntos que por los momentos desconocemos, nos daremos cuenta de algo muy interesante:

A medida que aumentamos la complejidad de la función, la capacidad de pronosticar (o generalizar) al principio aumenta, pero llegado cierto punto, empieza a decaer. El principio de la navaja de Ockham, mostrado gráficamente.


¿Por qué?

La respuesta no es difícil. En la gráfica siguiente, si proyectamos como se mueve la función elaborada, entre el 0 y el 1 (en el eje "x"), vemos que se aleja bastante de la recta que pasa cerca de los puntos. Pero ¿realmente las distancias que tienen los puntos de la recta dan pie a que pensemos que el punto que va entre el 0 y el 1 esté tan lejos del valor que nos predice el modelo lineal?

La respuesta es no, inclusive de forma intuitiva, aunque, como veremos, no es necesario acudir al no tan común "sentido común" para confiar en lo que dije arriba.


típico overfitting en redes neurales


Las redes neurales artificiales han sido utilizadas con frecuencia para ajustarse a funciones. Uno consigue medir en un proceso ciertos datos, y trata de estimar la función que hay "detrás" de los datos, para tratar de predecir los datos en otros lugares en donde no hemos medido por alguna razón (imposibilidad temporal, técnica, financiera, riesgo, etc.).

Bien, típicamente esto se hace de la siguiente forma:
  1. Se elige un subconjunto de los datos, de forma aleatoria, para conformar el "conjunto de prueba" o "conjunto de validación".
  2. El resto de los datos conforman el "conjunto de entrenamiento".
  3. Se dan valores iniciales a los parámetros de todas las neuronas de la red.
  4. Se "muestra" un dato a la red, y se compara la salida de la red con la salida que debería haber dado. La diferencia entre lo deseado y lo que se ha obtenido de la red, se utiliza como información para regañar a las neuronas que se portan mal (ajustando los parámetros).
  5. Se repite el paso anterior, hasta que el error de la salida de la red se estabiliza en un margen aceptable.

Este proceso puede ser muy vario-pinto en las estrategias a seguir para:

  • elegir el número y disposición de neuronas,
  • elegir el kernel a utilizar,
  • definir la sensibilidad que tienen los ajustes respecto a los errores cometidos por la red,
  • y decidirse entre la acumulación de ajustes luego de "ver" todos los datos de entrenamiento versus la realización de ajusted luego de "ver" cada dato individual.
En la práctica, durante el proceso se evalúa el trabajo predictivo de la red ante los datos del conjunto de validación (que la red nunca ha usado para entrenarse). Esa evaluación permite observar qué tanta capacidad de generalización tiene el modelo.

La experiencia tiende a mostrar el siguiente patrón:
  1. Con los primeros ajustes, poco a poco crece la eficiencia con que se logran predecir los resultados del conjunto de validación.
  2. Llegado cierto punto, no se logra mayor mejora en la eficiencia de la red ante el conjunto de validación. Sin embargo, sigue mejorando la eficiencia ante el conjunto de entrenamiento.
  3. Más allá de ese punto, aunque la eficiencia con que la función se aproxima a los datos de entrenamiento se puede acercar a la perfección, el resultado ante el conjunto de validación ha empezado a empeorar.

El comportamiento del paso 3, es una muestra numérica del concepto que vimos anteriormente de forma intuitiva, como sobre-ajuste. Empieza a ocurrir, si lo vemos en la figura de abajo (también cortesía de wikipedia), en el momento en el que la curva de color rojo deja de bajar. Esta mide el error de la red en el conjunto de validación.


He acá al principio de la navaja de Ockham, demostrado estadísticamente.

Procesos "constructivos"

Este comportamiento también puede verse en los procesos de entrenamiento constructivos, que van generando neuronas en la red (o ramificaciones en un árbol), haciéndola cada vez más compleja, para ir aprendiendo el patrón. Al inicio, con pocas neuronas (o en árboles de clasificación, con pocas hojas) ambas eficiencias crecen, y la de entrenamiento logra la perfección absoluta, mientras que en algún momento el bulto del conjunto de validación se nos ha caído en el camino.



En la imágen de arriba (nuevamente cortesía de wikipedia) se observa claramente como el clasificador representado por la línea verde se ajusta a la perfección a la data de entrenamiento. Sin embargo, el clasificador de la línea negra (mucho más sencillo), probablemente tendrá mejor capacidad de geralización. Éste es un buen ejemplo del tipo de superficies clasificadoras que resultan cuando una red tiene demasiadas neuronas, y demasiado entrenadas. [adición del autor el 31-03-08]

Esto que acabo de comentar es el tipo de procesos como el que hablamos sobre el polinomio de grado 8. Ir hacia la derecha en el gráfico de arriba, es ir aumentando el nivel del polinomio a usar para hacer la regresión sobre los datos.


¿Y cómo hacemos?

La manera de apegarse a la navaja de Ockham más evidente, es ir revisando el comportamiento de nuestro modelo sobre data de validación.

Se recomiendan técnicas como:

En general, estas herramientas permiten algún nivel de análisis para determinar si un trabajo más complejo o largo, está ayudando o no a la capacidad de generalización (predecir valores no vistos durante el entrenamiento o determinación de parámetros).

En un trabajo que estoy realizando actualmente en conjunto con el Prof. Ubaldo García Palomares, hemos incluído dentro de un algoritmo de generación y entrenamiento de una red neural de una capa oculta, para clasificación binaria, unas instrucciones que permiten que el algoritmo se detenga cuando ya no es posible mejorar la capacidad de generalización. Pero eso es parte de otra historia...

¡Espero que esto pueda ayudarte, Marc!

domingo, marzo 23, 2008

¿Qué son las SVM?

Por ahí Alfredo me preguntó qué eran las SVM o Support Vector Machines... y realmente ese debería ser tema obligado para este blog! así que ya es hora de acometer esa tarea.


Una especie de definición

Las SVM (o Máquinas de Vectores de Soporte) son un tipo de Máquinas de Aprendizaje. En particular son de esas que necesitan primero entrenarse con situaciones en las que se les dice la respuesta correcta sobre muchos ejemplos, y una vez ella se ha entrenado, entra en fase de "uso", y simplemente se convierte en una caja que devuelve la respuesta ante un nuevo caso (en pocas palabras, es un método de aprendizaje supervisado).

Quienes inventaron las SV fueron Vladimir Vapnik (una persona orientada hacia la estadística) y sus compañeros de AT&T. El método se basa en el uso de programación matemática, formulada de forma que la interpretación estadística del modelo resulta particularmente apropiada. El modelo está rigurosamente sustentado por las teorías estadísticas de aprendizaje propuestas por Vapnik.


Importancia

¿Qué tienen de particular que las hace famosas? Bueno... desde que fueron inventadas, superaron con creces la eficiencia de los algoritmos antecesores, tanto en tareas de clasificación, como de regresión. Hasta el momento, las SVMs no han sido superadas sino por ellas mismas, con los diferentes ajustes y variaciones que se han venido haciendo.


¿y para qué sirven?

Bueno, los modelos SVM nos servirán para predecir datos, siempre y cuando hayamos entrenado a la máquina. Esta predicción puede ser de varios tipos:
  • predicción de clasificación binaria
  • predicción de clasificación multi-categoría
  • predicción de regresión general.

¿y cómo funcionan?

La forma en que trabaja es muy interesante. Supongamos que tenemos la tarea de realizar predicciones de clasificación binaria (p.e.: tenemos valores de un exámen médico rutinario de una persona, y queremos saber si tiene diabetes o no). Vamos a imaginarnos que los valores recogidos en el exámen son sólo 2, en lugar de sopotocientos. Cada paciente que efectivamente tiene diabetes lo podemos poner en un plano cartesiando (donde cada eje es uno de los dos valores que recoge el exámen médico). Colocamos a los pacientes que efectivamente tenían diabetes como círculos negros en el plano en las coordenadas que corresponden a cada uno de ellos (según sus resultados de exámen), y a los que no tenían diabetes, como rombos de centro blanco. Vamos a tener algo así:
las SVM encuentran una "superficie" que intenta separar los ejemplos negativos y positivos con el margen más grande posible a ambos lados del hiperplano. En este caso, bi-dimencional, la "superficie" sería una línea. En un caso 3D (tres atributos para cada paciente) sería un plano. En un caso de más de 3 dimensiones, sería un hiper-plano o hiper-superficie con el número apropiado de variables.

Hay muchas formas de hacer esto, propuestas por métodos estadísticos, por la gente de redes neurales, por la gente de optimización, etcétera. Lo que distingue a las SVMs es que el hiper-plano resultante se consigue logrando, como dije antes, que el margen que separa los datos es el mayor posible.


...entendiendo lo del margen, o ¿por qué lejos es mejor?

¿Y qué es eso de "margen"? Bueno, primero acudamos a la intuición, y luego definiré la palabra "margen" en este contexto. Para los datos que tenemos en el ejemplo, podríamos tener varias posibles superficies (infinitas), pero tomemos como ejemplo estas dos:


Preguntémonos ¿cuál es mejor? Vapnik demuestra estadísticamente, que mientras más lejos esté el hiper-plano de los puntos a los que clasifica, mejor. En este caso, pareciera que la Superficie A es mejor que la Superficie B.

Pero dije que iba a irme primero por la intuición: preguntémonos.... ¿Por qué lejos es mejor?

Para verlo intuitivamente, podemos imaginarnos el caso extremo, es decir, que la superficie estuviese "adherida" a algunos de los puntos de uno de los conjuntos, como en la siguiente figura:

Tengamos en cuenta que esos datos son de los pacientes para los cuales, hasta ahora, sabemos si tienen diabetes o no. Si dejamos que la superficie clasificadora esté allí, "adherida" a los pacientes sanos, intuitivamente podemos imaginar que es bastante probable que aparezca algún paciente con características similares a las de alguno de los pacientes a los cuales está "adherido" el hiper-plano. Pero cuando digo "similar", intuitivamente estamos aceptando que no hay dos pacientes exactamente iguales. Debe haber alguna pequeña diferencia. ¿Cierto?

¿Y si esa pequeña diferencia hiciera que el paciente estuviese justo un ligeramente más allá de la superficie separadora? Si eso ocurriera, la máquina diría que ese paciente pertenece al grupo de los que tienen diabetes, es decir, diría que es un "círculo negro", cuando en realidad el afortunado paciente podría no tener diabetes. Estaríamos dando un falso positivo con cierta frecuencia.

Si el hiper-plano estuviese "adherido" a los pacientes del grupo de entrenamiento que eran diabéticos, estaríamos haciendo una máquina que produciría concierta frecuencia falsos negativos (porque pacientes muy parecidos a los que ya tienen diabetes, podrían estar ya el otro lado de la superficie separadora). Uno no desearía darles falsas expectativas a un paciente, así que esto tampoco es conveniente.

Para lograr alejar la superficie de los puntos de ambos conjuntos, Vapnick define el "margen" a maximizar como la distancia entre los dos hiper-planos, paralelos al hiper-plano separador, que están, cada uno, adherido a los puntos de uno de los conjuntos. En las Superficies A y B, el "margen" vendría a ser la distancia entre las líneas punteadas que se muestran abajo:
Como podemos ver, en el caso de la Superficie A, está mucho mejor que en la B. El método, adicionalmente, coloca la superficie, en general, en la mitad de esa distancia.


¿y dónde dejamos a las Redes Neurales Artificiales?


Obviamente, las SVM están relacionadas con las redes neurales. De hecho, un modelo de SVM que use una sigmoide (aproximación a la función escalón que mencioné en mi post sobre redes neurales) como función para el cálculo de la salida, es equivalente a un perceptron (una neurona de salida binaria). En otras palabras, los parámetros para una neurona de clasificación (perceptrón), podríamos hallarlos mediante el uso del método SVM.

Cuando no es posible separar completamente los puntos de los dos conjuntos, la forma matemática en que se plantean los SVM obtiene excelentes resultados, minimizando los errores.


Kernels, o ¿qué hago cuando necesito un hiper-plano torcido?

Si nos encontráramos en un caso en el que los datos no pudieran ser separados por un hiper-plano, podría ser que una superficie no-lineal pudiera separar los conjuntos, como en el ejemplo de abajo:
.. lo que se hace en SVM (y en muchas otras técnicas) es transformar el espacio de los atributos (lo que llaman el kernel). Esto suena complicado, pero si nos fijamos en el ejemplo, podemos ver que una elipse podría resolver el problema, de la siguiente forma:
Esa sería la superficie no-lineal que necesitamos. Todo lo que hemos venido hablando, ha sido referido a hiper-planos, y claramente la elipse no es un hiper-plano. Sin embargo, sabemos que la elipse es una figura "Cónica", expresada más o menos así (en nuestro eje cartesiano del ejemplo):

a*(x1 + b)^2 + c*(x2 + d)^2 = e

donde {a, b, c, d, e} es un conjunto de constantes, y {x1, x2} nuestras variables (discúlpenme por renegar del par {x,y} jejeje).

En general, cualquier superifice cónica, termina siendo algo como esto:

a1*(x1)^2 + a2*(x1) + a3*(x1)*(x2) + a4*(x2) + a5*(x2)^2 = a6

Ahora, esto ni de casualidad es lineal en un espacio definido por las variables {x1, x2}. Pero si nos imaginamos un espacio donde las variables son esas dos, mas 3 variables nuevas (tres dimensiones) extra: {x3, x4, x5}, donde cada una de ellas representa a los términos cuadráticos de la expresión de arriba, tenemos:

x3
= x1^2
x4 = x2^2
x5 = x1*x2

Y volviendo a escribir la ecuación cónica genérica (o cuadrática, como sería mejor llamarle), tenemos que nos queda así:

a1*(x3) + a2*(x1) + a3*(x5) + a4*(x2) + a5*(x4) = a6

¡Y acá estaremos todos de acuerdo con que se trata de una ecuación bastante lineal! Dense cuenta de que lo que se desprende de todo esto, es que un hiper-plano en este espacio de atributos ampliado, equivale a una elipse en nuestro espacio bi-dimensional (definido tan sólo por {x1, x2}).

Si pudiésemos representar gráficamente lo que ocurre en este espacio 5-dimensional, sería algo así:

Repito: acá aplican ahora todos los conceptos de margen y linealidad que se habían manejado anteriormente. Como puede verse, acá el SVM, aunque modelaría un simple hiper-plano separando grupos de puntos, estaría comportándose como una superficie no-lineal.


Algunas consideraciones de modelaje del SVM y el problema a optimizar

Sin embargo, quiero hacer notar una cosa importante: este kernel cuadrático resultó bastante apropiado para el problema del ejemplo. Pero podría no ser suficiente para otro problema. En general, la estrategia de complicar el kernel depende de nuestra suposición de la estructura y complejidad de los datos, y siempre aumenta la dificultad de obtener un resultado.

Si tenemos 9 atributos principales, resolver el problema cuadrático implica añadir una cantidad mucho más grande de variables "extra", representando los cuadrados de los principales y los productos entre ellas.

Un ejemplo de un problema que no podría resolverse con un kernel cuadrático, sería este, en el que se necesitaría de un kernel basado en funciones de base radial (gaussianas):

Separar conjuntos con superficies no-lineales, es algo que se ha logrado con perceptrones clásicos multi-capa (redes neurales). Sin embargo, dado que cada perceptrón posee una función de transferencia sigmoidal (buscando comportarse como una función escalón), la optimización a la que debe acudirse en las redes neurales tipo perceptrón, equivale a una optimización de este tipo:
donde o(x) es la salida de la red (su propuesta de clasificación), y c(x) es la verdadera clasificación del individuo "x". Los w, theta, nu y tau son simplemente parámetros de las neuronas del perceptrón multicapa.

¿por qué la superficie a optimizar es así? Fácil: Porque es el error cuadrático de clasificación. El algoritmo de optimización (Backpropagation y sus primos, típicamente) va ajustando el parámetro de alguna neurona o peso de dendrita, hasta que ¡Zas! una de las neuronas cambia su salida de 0 a 1, o de 1 a 0, y con ello la respuesta de la red, posiblemente. Se sigue moviendo levemente (según un parámetro de paso) los parámetros, y posiblemente no pasa nada, hasta que se cruza otro límite de alguna de las sigmoides, y ¡Zas! ocurre otro cambio de 0 a 1, o de 1 a 0.

Mientras cambias los parámetros pero no pasa nada, se comporta de forma "estacionaria" la función del error (derivada = 0). Luego encuentras otro lugar, donde hay el cambio de respuesta, y la función de error cambia de forma brusca (derivada = mucho), ya que es la subida del "escalón" aproximado de la sigmoide. Nótese que idealmente el sigmoide sería lo más parecido a una función escalón, pero para que la derivada sea manejable numéricamente por los algoritmos de backpropagation, en el lugar donde está el umbral, se disminuye bastante, por lo que la red termina teniendo respuestas "difusas" cuando los elementos caen en el borde del umbral de alguna de las neuronas. Esto, a mi modo de ver, es indieseable.

Así pues, entrenar un perceptrón multi-capa implica un problema de optimización:
  1. no convexo
  2. con múltiples puntos estacionarios (donde suelen estancarse los algoritmos de optimización)
  3. con elevada cantidad óptimos locales
  4. no acotado
  5. asume sigmoides suavizadas (por lo que la red da respuestas difusas posteriormente)
Es decir: ¡todo lo que un optimizador no desea encontrar!

Es mucho más atractivo resolver un problema como el de las SVM, porque es optimización cuadrática con restricciones lineales,... es decir: de los problemas más fáciles de solucionar. Más adelante les hablaré de un método que utiliza Programación Lineal para generar perceptrones multi-capa, sin usar Backpropagation. Si el problema de resolver una red neural, hubiese sido atacado inicialmente, por gente de investigación de operaciones, dudo que hubiésen optado por algo como el Backpropagation, realmente.


¿Y cómo es eso de "Vectores de Soporte"?

Ahora, para cerrar, quiero aclarar la duda que siempre surge cuando uno conoce a las SVMs:
¿por qué el nombre?

La respuesta es sencilla: si asumimos que cada uno de los ejemplos de los que disponemos (círculos oscuroes y rombos blancos) es un vector en el espacio, resolver SVMs es: encontrar los vectores en los que podamos apoyar los hiper-planos que definan el mayor margen de separación. Es decir, buscamos los vectores en los cuales "soportar" los hiper-planos paralelos, uno hacia un conjunto, y uno hacia el otro, para trazar justo en el medio de ambos, nuestro hiper-plano de separación. Veámoslos señalados por círculos rojos en la siguiente figura:
¡Ahí los tienen!

Ahora lo de "Máquinas de Vectores de Soporte" suena menos oscuro ¿verdad?
En verdad espero que esta explicación les haya sido de utilidad ¡y disculpen lo extenso!
Para los que deseen profundizar, les recomiendo esta página: http://www.dtreg.com/svm.htm
Es mucho menos "básica" la explicación, pero mucho más completa.

NOTA: Si alguien detecta en mi post algún error, no duden en contactarme para decírmelo, ¿vale? ¡Gracias de antemano!.

miércoles, enero 30, 2008

Máquinas de Aprendizaje ¿con Investigación de Operaciones?

El tema del "Machine Learning" o de las Máquinas de Aprendizaje es un tema que en principio está en el terreno de la inteligencia artificial, pues cuando queremos que una "máquina" (en general un "ente" artificial) aprenda, básicamente estámos tratando de emular la forma en que el ser humano, a partir de su experiencia, logra tomar deciciones apropiadas, y esto, evidentemente, es parte de lo que llamamos "inteligencia".

Claro que este blog no es un blog de inteligencia artificial, sino de Optimización y Máquinas de Aprendizaje. Así que de ahí se puede desprender una razonable sospecha de que no voy a tratar a las máquinas de aprendizaje de modo general, sino sólo en los aspectos que tiene en común con el área de la Opimización (métodos prescriptivos de Investigación de operaciones, que comenté en un post anterior).

¿Y cuáles son esos tópicos de Máquinas de Aprendizaje que tienen que ver con Optimización? No pretendo en esto mostrar una lista completa de los tópicos, ya que mis conocimientos no abarcan con suficiente profundidad todos los tópicos de las Máquinas de Aprendizaje. Simplemente diré en respuesta a ello, me referiré en particular a los Algoritmos de Aprendizaje Supervisado.

El Aprendizaje Supervisado, como casi todos los tópicos de Máquinas de Aprendizaje, ha sido atacado desde enfoques estadísticos, de redes neurales, y ciencias teóricas de la computación. Son raros los casos en los que se enfrentan estos problemas desde el enfoque de la optimización. En particular, el área del "Data Mining" o Minería de Datos tiene importantes exponentes del área de optimización como lo son las diferentes técnicas de las famosas SVM o Máquinas de Vectores de Soporte.

Estas tienen como particularidad que minimizan el error de clasificación empírico (de allí que sean de Aprendizaje Supervisado) al mismo tiempo que maximizan la distancia que tiene la superficie separadora de las dos clases respecto a los elementos de esas clases que separa. Los problemas de minimización o maximización siempre buscan el comportamiento óptimo de un sistema. En este caso, la función a optimizar es al mismo tiempo los errores y el mencionado margen. Esta optimización simultánea fue deducida por Vapnik como parte de los aportes colaterales de sus nuevas propuestas en el área de la estadística, con apoyo de Chervonenkis.

Hay otros métodos de optimización que atacan problemas de Minería de Datos, por supuesto. Uno de ellos que me parece extremadamente interesante, aunque luego de su surgimiento no ha habido grandes avances en ese respecto, son los métodos "multi-superficie". En ellos se generan, siguiendo una estrategia "golosa", múltiples superficies, que seccionan el espacio en el que se encuentran los elementos a ser clasificados. La máquina de aprendizaje resultante no hace otra cosa que evaluar en cuál de las áreas delimitadas por esas superficies está el individuo que se desea clasificar. La respuesta es: la misma clase que tienen mayoritariamente los individuos de esa área.

Este tipo de estrategias generan, como sub-producto de su uso, el diseño de una red neural (perceptrón multicapa), o un árbol de clasificación.

En mi opinión es muy interesante el hecho de que algoritmos como estos puedan generar redes neurales de clasificación binaria "sin intervención humana". Es bien sabido en la comunidad de las redes neurales, que resolver un problema con redes neurales, la mayor parte de los casos puede considerarse no sólo una ciencia sino un arte, debido a que hay muchas decisiones "arbitrarias" que tomar, y que por ende provocan largas sesiones de ensayo y error, tanteo, o entonamiento. Hay que decidir, cuantas neuronas usar, de qué tipo, conectadas en qué forma, y por si fuera poco, luego decidirse por una estrategia para el entrenamiento.

El uso de algoritmos que propongan ya de por si la estructura y parámetros de la red, hace que el proceso de construír una red neural de clasificación deje de ser un arte, para empezar a convertirse en un proceso ya automático.

Por último, en este post de reflexiones sobre el uso de la optimización para resolver problemas de máquinas de aprendizaje, quiero asomar una idea. Invariablemente, la construcción de máquinas que aprendan a hacer clasificación binaria, basándose en los errores, implica el uso de técnicas para conseguir parámetros óptimos para esas máquinas. En el caso de las redes neurales como los Perceptrones Multicapa, es común el uso de algoritmos asociados al Backpropagation. Mi comentario es el siguiente: desde el punto de vista de optimización, la forma en que se plantea el problema que resuelve la retropropagación, es el tipo de problemas que todo optimizador quiere evitar, ya que:
* la función a optimizar no es convexa
* hay abundancia de óptimos locales
* hay abundancia de puntos estacionarios en los que un algoritmo de optimización fácilmente "cree haber llegado".

Para evitar algunos de esos problemas, se "distorciona" la función de transferencia de las neuronas del perceptrón multicapa, para que la función sea una sigmoidal "suave", en lugar de una función tipo "escalón", lo que da orígen a clasificaciones difusas (sin que en ello esté involucrada la batería de herramientas de las que se aprovisiona la lógica difusa para resolver estas situaciones).

Bueno, es probable que el 99.99% de las personas que lean esto se pregunten ¿y cómo piensa Orestes entrenar un perceptrón sin usar los principios de la retropropagación? Bueno. La respuesta es: buscándole la vuelta al problema, para sólo resolver problemas convexos. Más adelante les seguiré contando.

miércoles, octubre 04, 2006

My own introduction to Neural Networks (spanish)

This entry was written for my other blog in spanish.. and I haven´t found the time to translate it, so a friend of mine suggested me to publish it here... at least while I ´m still translating! Here it is... and non-spanish-reading readers... be patient with this one! :o)
Now comes the post...

- Mi propia introducción a las Redes Neurales -

Me decidí a publicar en este blog algunas ideas que tengo en el tema de las Redes Neurales Artificiales. Sin embargo esto que escribiré en estos días no va a tener mucho sentido para quienes no han tenido la oportunidad de entrar en el tema de las redes neurales artificiales (que llamaré RNAs), entre otras cosas. Por eso, voy a contarles poco a poco, para que mis palabras sean menos extrañas. ¡Espero no ser muy aburrido!

Empecemos con las RNAs:

Una RNA no es más que una función matemática. Es decir, es una expresión matemática que recibe unos datos de entrada (se realizan ciertas operaciones con esas datos, utilizando unos parámetros (valores conocidos que forman parte de la RNA), y al final la función arroja un resultado. Lo que tienen estas funciones, que hace que se les pueda llamar RNAs, es que son funciones compuestas por muchas funciones muy sencillas, que se originaron, en principio, tomando como inspiración el modelo de una neurona (biológica).

Una neurona artificial (cada una de las funciones sencillas) tiene (a su vez) unos datos de entrada, que son la metáfora de los "estímulos" que recibe una neurona biológica. Tiene también una función de activación, que define la decisión que ella toma, en términos de "exitarse" o "inhibirse". Si los estímulos "satisfacen" a la neurona (dependiendo de "lo que diga" la función de activación), la salida o respuesta de la neurona es "grande", representando la "excitación" de la misma. De igual forma, si los estímulos no son los que "satisfacen" a la neurona, la salida de la neurona es baja, representando la inhibición.

Ejemplo: la función escalón..

Esta es una que dice: "¡Okey! si lo que me das (entrada) es positivo, te responderé con un 1 (respuesta o salida). Si lo que me das es negativo, entonces me pongo pichirre y mi respuesta será nula, es decir 0". La salida = 1 sería la de excitación, y la otra la de inhibición. La función de activación sería la "función escalón", centrada en "0". Eso de centrada en "0" se refiere a que el valor con el que se está comparando la entrada (preguntándose si es mayor o menor) es "0". Ese valor con el que se compara, también es llamado "umbral".

Ahora veamos: si lo que sale de una nerona, lo consideramos la entrada a otra neurona con otra función de activación (no necesariamente igual), entonces, en términos de "redes", la estaríamos "conectando". Varias neuronas artificiales "conectadas" entre si, conforman una RNA. Si se representa cada neurona como un círculo, y cada conexión como una flecha, podemos ver por qué se le llama Red.

(Cuando publiqué esta entrada inicialmente, escribí esto: "Todavía no se como mostrar una imágen acá en mi blog, así que pido disculpas por no ponerles un ejemplo... pero visiten wikipedia buscando Neural Networks y podrán ver la imágen que quería poner", tras lo cual mi estimada "Aire" me dejó su comentario dándome luces sobre el procedimiento para publicar!)

En la Figura 1 les he colocado una imágen que saqué de wikipedia, que representa una RNA.

Figura 1: Red Neural Artificial de Realimentación Positiva y una sola capa oculta

Volviendo al tema, nótese que:
* hay muchas "arquitecturas" de como se conectan entre si las neuronas en una RNA
* hay muchas funciones de activación, aparte del escalón.

Variando estas dos características, se obtienen RNAs que pueden servir para muchas cosas. Entre otras cosas, satisfacen necesidades no atendidas por el cómputo clásico:
* Su respuesta depende de operaciones paralelas que pueden ser masivas,
* También pueden hacerse las operaciones de forma distribuída,
* Pueden aprender,
* Pueden generalizar,
* Pueden adaptarse,
* Pueden procesar información inherente a un contexto,
* Pueden tolerar fallas (que alguna de las neuronas no funcione),
* Si se implementan en forma electrónica, son dispositivos de bajo consumo de energía.

En general, es curioso que aunque no son redes neurales biológicas, las RNAs son parecidas a estas en que, a diferencia de las arquitecturas de cómputo clásicas, su desempeño es EXCELENTE en problemas "perceptivos" como el reconocimiento de patrones. Normalmente estas tareas resultan tremendamente complicadas para los métodos clásicos.

Se usan para:
* Clasificación de patrones (reconocimiento de caracteres, voz, imágenes de rostros, tipos de ondas, tipos de células sanguíneas, inspección de circuitos electrónicos impresos en tarjetas, diagnosis médica),
* Agrupamiento (un algoritmo "explora" las similitudes entre diferentes patrones, y define grupos en los que los coloca,... esto es usado en data mining, compresión de información y análisis exploratorio de datos, por ejemplo...),
* Aproximación de Funciones (se tienen un conjunto de puntos que pertenecen a una superficie "desconocida", que la RNA puede aproximar, tratando de pasar cerca de todos los puntos conocidos, y de poder predecir el comportamiento de la función en regiones donde no se conocen puntos),
* Pronósticos (esto es muy importante y necesario para la toma de decisiones en la gestión empresarial, la ciencia y la ingeniería... ejemplos conocidos comprenden la predicción de valores en la bolsa y la predicción de condiciones meteorológicas),
* Optimización (hay problemas en matemáticas, ingeniería, estadística, medicina, economía... que se pueden entender como si fueran problemas de optimización. La idea es encontrar una solución que satisfaga unas ciertas restricciones de tal forma que una cierta función, llamada "objetivo", sea maximizada o minimizada),
* Control (hay problemas en los que un sistema que cambia en el tiempo, necesita ser estabilizado.. por ejemplo, las vibraciones de un avión ante turbulencias, que deben ser compensadas por los alerones para que la cabina esté estable... Si ese fuese el caso de control a ser resuelto, una RNA puede comportarse de forma adaptativa para controlar de manera correcta el movimiento de los alerones),

¡Como puede verse, sus aplicaciones son MUY variadas!

Antes de despedirme en esta entrada (porque ya debería ponerme a trabajar), quería aclararles que una RNA se adapta, aprende, generaliza, etc... ¡pero no lo hace sola! ... por lo general. Lo que se hace, cuando el entrenamiento es supervisado (vean wikipedia si quieren saber lo que eso significa con más detalle), es lo siguiente:
1) Darle a la red una entrada, para la que sabemos qué es lo que quisiéramos que la RNA respondiera (es decir, la salida deseada es conocida),
2) Vemos qué fue lo que respondió la RNA, y lo comparamos con lo que debería haber respondido
3) En base a cuánto se equivocó la RNA, se ajustan las características de la RNA, para que la próxima vez no se equivoque con ese ejemplo. Los parámetos son cambiados de forma apropiada, como "castigo" por haber dado una respuesta equivocada.

Luego de que una RNA ha aprendido lo suficiente como para responder bien ante una buena cantidad de ejemplos, se fijan los parámetros, y la RNA está lista para ser utilizada.

Es como cuando un niño muy pequeño no sabe la diferencia entre un caballo y un perro. El señala a un caballo y trata de adivinar.. "¡papá! ¿ese es un perro?", y el padre responderá, si la conjetura es errada, "¡no hijo! ese es un caballo bebé".. y así sucesivamente. El niño irá construyéndose su propia idea de lo que es un caballo y lo que lo diferencia de un perro, y eventualmente (luego de preguntar unas 20 veces, a lo mejor) no necesitará preguntar más a su papá si el caballo hay que sacarlo a pasear, o si puede montarse en el perro grande que está por allá... ;o)

Esto es muy distinto a que uno le diga al niño que vea si tiene pezuñas o uñas, dientes planos o "puyúos", si hace "Guau" o "gruñe", y que en base a eso sepa si es caballo o perro. Acá el niño no estaría aprendiendo en base a experiencias propias, sino que tendría una listita de cosas que resumen la experiencia del papá.

Bueno.. esto es todo por ahora...

Espero al menos haber dejado la sensación de que las RNAs son algo muy útil e interesante, y que realmente no es más que una forma de armar funciones matemáticas, y no una tecnología demasiado complicada y ajena a lo que pudimos aprender en la escuela secundaria.

Si desean conocer mi trabajo de grado en el área de RNAs, pueden visitar mi página web y allí descargar el pdf.

¡Nos vemos en el espejo!

Orestes

PD: son bienvenidos los comentarios, sugerencias, críticas constructivas, preguntas... ehh.. ¡y los comentarios jocosos también!