¿Cómo desarrollar una intuición para diseñar nuevos algoritmos?

Creo que un “lenguaje” con el que puede estar satisfecho es el de los modelos generativos y, en particular, los modelos gráficos probabilísticos.

Los modelos gráficos son para el aprendizaje automático casi lo que los diagramas de entidad-relación para las bases de datos o UML son para la programación orientada a objetos, le dan un modelo de sus algoritmos. Un ejemplo del modelo gráfico subyacente a la asignación de Dirichlet latente (imagen tomada del blog de @ shuyo: http://shuyo.wordpress.com/2011/…)


Empieza escribiendo variables relevantes para sus problemas. Estos generalmente están segmentados en cosas que puede observar y variables latentes que corresponden a causas ocultas subyacentes. El segundo paso es tratar de modelar la estructura de relación probabilística entre estas variables. Por lo general, significa relaciones de independencia condicional, que pueden ilustrarse como gráficos de diferente tipo. De ahí el nombre de modelos gráficos. Una vez que haya especificado su modelo probabilístico de esta manera, hay varios métodos de inferencia que puede elegir, que varían en velocidad y precisión. Los ejemplos incluyen propagación de expectativas, MCMC, aprendizaje de máxima probabilidad, EM, etc.

Hay varios buenos libros que puedes leer sobre esto, y el aprendizaje automático probabilístico en general. Los exámenes son:

Modelos gráficos probabilísticos: principios y técnicas http://amzn.to/MgiZ2F
Razonamiento bayesiano y aprendizaje automático [pdf gratuito] http://web4.cs.ucl.ac.uk/staff/D…
Reconocimiento de patrones y aprendizaje automático http://research.microsoft.com/en…
También, vea las conferencias de Zoubin Ghahramani aquí http://videolectures.net/mlss07_…

Si tiene interés y experiencia en lenguajes de programación, como se desprende de su pregunta, examinaría los llamados lenguajes de programación probabilísticos como infer.net o CHURCH. Puede que no sea la herramienta que quiera usar todos los días para resolver problemas, pero son buenos para ilustrar el concepto. El punto es que aquí escribes un programa, que expresa cómo generarías un conjunto de datos como el que tienes, luego un compilador lo compila en otro programa que implementa un algoritmo de aprendizaje automático para inferencia.

infer.net: http://research.microsoft.com/en…
IGLESIA: http://projects.csail.mit.edu/ch…

Aquí hay algo que podría no responder directamente a su pregunta, pero podría ayudarlo un poco. Probablemente soy mucho más novato que tú, pero puedes encontrar algo de valor en la clase en línea de Andrew Ng en Coursera: https://www.coursera.org/course/ml

El curso fue mucho menos matemático que un curso de ML de pregrado que hice en la universidad, pero a pesar del contenido simple del curso, su forma de enseñar me dio una sensación más intuitiva sobre cómo podría aplicar Machine Learning a problemas del mundo real con fluidez ya que puedo crear estructuras de datos y algoritmos para tareas regulares. Comienza con algo tan simple como la regresión para una variable, luego regresión para múltiples variables, regresión logística, sesgo-varianza, y el material del curso se acumula gradualmente en ese orden, a partir de las fórmulas de regresión más básicas, y realmente no asustarlo al proporcionarle instantáneas repentinas de temas complejos que pueden parecer abrumadores y desconectados para un principiante. Si realiza las tareas de programación en el curso, si bien son realmente triviales la mayor parte del tiempo, si revisa los documentos adjuntos en detalle, puede tener una idea bastante decente de cómo usar ML en aplicaciones de la vida real y escenarios como LOC. ¿Cómo se seleccionan las características, cómo se construye un modelo de aprendizaje para él y cómo se evitaría un ajuste excesivo y un ajuste insuficiente? Estos son temas importantes y están cubiertos suficientemente en el curso.

Una de las cosas que hace que el ML tradicional parezca poco intuitivo a veces es su tendencia a tratar los problemas en forma de una gran caja negra de variables desconectadas al principio. A menudo, puede tener ideas intuitivas sobre cómo ciertas variables pueden influir en otras, y realmente no sabe cómo incorporar en este dominio el conocimiento que tiene, en un modelo regular. En estas situaciones, los modelos gráficos probabilísticos son un concepto importante. También hay un curso para PGM en Coursera, es un curso bastante intenso pero vale la pena el tiempo. Hacer el curso de ML y el curso de PGM o al menos algunas de las tareas puede ayudarlo a progresar para sentirse más seguro al aplicar estas ideas en aplicaciones del mundo real.

En general, no es necesario desarrollar un nuevo algoritmo, sino utilizar correctamente los algoritmos existentes donde se necesitan. Por ejemplo, la agrupación se puede realizar de varias maneras, considerando una gran cantidad de distancias posibles. Incluso si se elige mal (o mejor dicho al azar), el par de método de agrupamiento y la distancia producirán un resultado, sin embargo, no el deseado.

Como se dijo anteriormente, la necesidad de un nuevo algoritmo es muy rara, pero ocurre cuando sus datos no son exactamente los mismos que los del algoritmo esperado. Por ejemplo, tiene un árbol, pero el algoritmo que desea usar espera un vector. En este caso, mi enfoque es: identificar claramente la entrada y la salida esperada, proporcionar una solución simple de fuerza bruta o bootstrap, optimizar la complejidad del algoritmo, para que el rendimiento sea satisfactorio.

Mi principal barrera al diseñar un modelo es la falta de conocimiento “interno” sobre el modelo en sí. Incluso cuando se acerca a un experto en dominios, uno necesita dominar la terminología básica del campo y comprender el diagrama Entidad-Relación de los conceptos que está manejando.

La mejor manera de aprender un campo complejo es a la antigua: como aprendiz. La ruta tradicional es obtener un doctorado. Si no puede hacer eso, busque un mentor, como el científico jefe de su empresa. También podría comenzar un club o una reunión e invitar a algunas personas mayores a él. Lo importante aquí no es tratar de elegir sus cerebros para resolver sus problemas en el trabajo, sino simplemente obtener una comprensión fundamental.

Trabajar en la industria es tan abrumador que la mayoría de las personas inteligentes están felices de tener a alguien con quien conversar.

Aprendes las matemáticas y lees muchos documentos de aprendizaje automático. Cuando creo nuevos algoritmos, generalmente empiezo mirando qué piezas pueden ir bien juntas pero que aún no se han probado. Por ejemplo, la regresión Morse-Smale se basa en una función de regresión lineal ajustada a cada partición. Sin embargo, pueden existir efectos multivariados, por lo que usar algo como bosque aleatorio en lugar de regresión lineal podría mejorar el rendimiento en simulaciones y datos reales. (Y lo hace, vea mi perfil de Google Académico para un artículo reciente que demuestre esto).

Sin embargo, no es probable que diseñe un mejor algoritmo si no comprende las matemáticas. Hay ciertas piezas que “juegan bien juntas” pero podrían no jugar bien con otras piezas. Las razones detrás de esto tienen que ver con la maquinaria matemática y sus supuestos.

Hay tres formas en las que debe analizar cualquier problema.

Primero, debes mirar la estructura. Haga un diseño de arriba hacia abajo para describir la lógica de lo que está sucediendo.

En segundo lugar, debe mirar el flujo de datos. ¿En qué orden entran los datos, en qué orden se procesan los datos, en qué orden salen los datos? Desea terminar con una imagen con muchas líneas, círculos, fusiones y divisiones.

Tercero, debes mirar el flujo de tiempo. ¿Puedes vincular un punto dado en el flujo de datos a un punto en la estructura? Si hay datos paralelos, ¿dónde están las cerraduras y las barreras? ¿Cuál es el camino crítico? ¿Qué problemas de contención hay?

Una vez que tenga estas respuestas, los algoritmos y las estructuras de datos deberían encajar en gran medida.

More Interesting

¿Cuál es una buena fuente o explicación sobre la tasa de error de fonema (PER) y la tasa de error independiente de la posición, o la tasa de error de letras?

¿Por qué las redes convolucionales profundas llegaron tan tarde?

¿Cuáles son los mejores solucionadores de programas cuadráticos?

Cómo dominar el aprendizaje automático en Python

¿Hay alguna diferencia entre el modelado de temas y el clúster?

¿Cuáles son los pros y los contras comparativos de usar Python, MATLAB / Octave y R para el análisis de datos y el aprendizaje automático?

Como programador novato, ¿realmente necesito conocer toda la documentación de un lenguaje o marco de programación para comenzar, o lo aprenderé acumulativamente mientras trabajo en un proyecto pequeño?

¿Cuál es la regla de entrenamiento para redes de perceptrón de capa única con umbral?

Cómo optimizar la clasificación de varias clases si ya conozco el número de ocurrencias de cada clase en el conjunto de datos de prueba

¿Cuáles son los mejores métodos para el reconocimiento robusto de caracteres en MATLAB u OPENCV?

Como el sistema de recomendación está relacionado con el aprendizaje automático, ¿cuál será la próxima moda en los sistemas de recomendación?

¿Qué significa decir que dos clasificadores son independientes?

¿Amazon Web es una buena alternativa para que yo use redes neuronales si mi computadora no tiene suficiente energía?

¿Es generalmente una buena idea entrenar en caso real, desarrollar y probar conjuntos de datos para la traducción automática?

En la extracción de relaciones (PNL), ¿cuál es la diferencia entre la extracción de relaciones supervisada, semi-supervisada y no supervisada?