Esto depende mucho de los antecedentes del ingeniero de software. Y depende de qué parte del aprendizaje automático desea dominar. Entonces, en aras de la concreción, asumamos que estamos hablando de un ingeniero junior que tiene 4 años de universidad y un año de dos en la industria. Y supongamos que se trata de alguien que quiere trabajar en publicidad computacional, procesamiento de lenguaje natural, análisis de imágenes, redes sociales, búsqueda y clasificación. Comencemos con los requisitos para realizar el aprendizaje automático (exención de responsabilidad de mis colegas académicos: esta lista está muy incompleta, pida disculpas por adelantado si sus artículos no están incluidos).
- Álgebra lineal
Mucho aprendizaje automático, estadísticas y optimización lo necesita. Y esta es la razón por la que las GPU son mucho mejores que las CPU para hacer un aprendizaje profundo. Necesitas tener al menos un dominio básico en lo siguiente - Scalars, vectores, matrices, tensores. Piense en ellos como objetos de cero, uno, dos, tres y dimensiones superiores que puede componer y usar para transformar otro. Un poco como Lego. Proporcionan las transformaciones de datos básicos.
- Vectores propios, normas, aproximaciones matriciales, descomposiciones. Básicamente se trata de sentirse cómodo con las cosas que hacen los objetos de álgebra lineal. Si desea analizar cómo funciona una matriz (por ejemplo, para comprobar por qué se están desvaneciendo sus gradientes en una red neuronal recurrente o por qué su controlador está divergiendo en un algoritmo de aprendizaje de refuerzo), debe poder comprender cuánto pueden crecer o reducirse las cosas. Al aplicarle matrices y vectores. Las aproximaciones matriciales, como el bajo rango o la factorización de Cholesky, ayudan mucho al intentar obtener un buen rendimiento y estabilidad fuera del código.
- Algebra Lineal Numérica
Esto es relevante si desea hacer algo que sea bastante pesado de optimización. Pensar en los métodos del núcleo y en el aprendizaje profundo. No es tan importante para modelos gráficos y muestreadores. - Libros
Serge Lang, Algebra Lineal
Un libro de álgebra lineal básico y está bien escrito para estudiantes de pregrado.
Bela Bolobas, Análisis Lineal
Esto es mucho más difícil y más relevante para cualquier persona que quiera hacer un montón de análisis matemático y funcional. Probablemente sea una buena idea si quieres aspirar a un doctorado.
Lloyd Trefethen y David Bau, álgebra lineal numérica
Este es uno de los muchos libros que puedes usar para esto. Recetas numéricas es otra, pero los algoritmos allí son un poco anticuados. Y luego está el libro de Golub y van Loan (Matrix Computations). - Optimización (y cálculo básico)
En muchos casos, configurar la pregunta para hacer es bastante fácil, pero no es la respuesta. Por ejemplo, si desea realizar una regresión lineal (es decir, ajustar una línea) a algunos datos, es probable que desee minimizar la suma de las distancias al cuadrado de las observaciones. Del mismo modo, si desea obtener un buen modelo para la predicción de clics, desea maximizar la precisión de sus estimaciones de probabilidad de que alguien haga clic en el anuncio. Esto significa que tenemos el problema general de algunos objetivos, algunos parámetros, muchos datos y necesitamos una manera de llegar allí. Esto importa, en particular, ya que generalmente no tenemos una solución de formulario cerrado. - Optimizacion convexa
En muchos casos, los problemas de optimización son agradables en la medida en que no tienen muchas soluciones locales. Esto sucede cuando el problema es convexo.
(Un conjunto es convexo si puede dibujar una línea entre dos puntos del conjunto y toda la línea está en el conjunto. Una función es convexa si puede dibujar una línea entre dos puntos en el gráfico y la línea está arriba del grafico.)
Probablemente el libro canónico en el campo es el de Steven Boyd y Lieven Vandenberghe. Es gratis y asombroso. Además, hay muchos juegos de diapositivas geniales de las clases de Boyd. Dimitri Bertsekas ha generado un tesoro de libros sobre optimización, control, etc. Esto debería ser suficiente para que alguien comience en esta área. - Pendiente de gradiente estocástico
Gran parte de esto comenzó como un caso especial de optimización convexa (al menos lo hicieron los primeros teoremas), pero se ha quitado un poco, sobre todo debido al aumento de los datos. A continuación, se explica por qué: imagine que tiene que pasar algunos datos y que su algoritmo debe analizar todos los datos antes de realizar un paso de actualización. Ahora, si malintencionadamente te doy 10 copias de los mismos datos, tendrás que hacer 10 veces el trabajo sin ningún beneficio real de esto. Obviamente, la realidad no es tan mala, pero es útil si realiza muchos pequeños pasos de actualización, uno después de observar cada instancia. Esto ha sido bastante transformador en el aprendizaje automático. Además, muchos de los algoritmos asociados son mucho más fáciles.
El reto, sin embargo, ha sido paralelizar esto. Probablemente, uno de los primeros pasos en esta dirección fue que nuestros Slow Learners son Fast paper de 2009. Una versión bastante reciente de esto son las variantes sin bloqueo, como el artículo de Hogwild de Niu et al. en 2013. En resumen, estos algoritmos funcionan calculando gradientes locales en las máquinas de los trabajadores y actualizando un conjunto de parámetros de consenso de forma asíncrona.
El otro desafío es cómo lidiar con las formas de controlar el sobreacuerdo, por ejemplo, mediante la regularización. Para las penalizaciones convexas hay lo que se llama algoritmos de gradiente proximal. Una de las opciones más populares es el rahter desafortunadamente llamado algoritmo FISTA de Amir Beck y Marc Teboulle. Para ver algunos códigos, consulte la caja de herramientas SPAM de Francis Bach. - Métodos no convexos
Muchos problemas de aprendizaje automático son no convexos. Esencialmente todo lo relacionado con el aprendizaje profundo es. Pero también lo son los clústeres, los modelos de temas, casi cualquier método de variable latente y casi cualquier otra cosa que sea interesante en el aprendizaje automático en la actualidad. Algunas de las técnicas de aceleración pueden ayudar. Por ejemplo, mi estudiante Sashank Reddy mostró recientemente cómo obtener buenos índices de convergencia en este caso.
Hay muchas técnicas llamadas Métodos espectrales que pueden usarse. Anima Anandkumar ha respondido esto con increíble detalle en su reciente sesión de Quora. Por favor lea sus respuestas ya que son super detalladas. En pocas palabras, los problemas convexos no son los únicos que se pueden resolver de manera confiable. En algunos casos, puede calcular el equivalente matemático de un rompecabezas para demostrar que solo una cierta elección de parámetros puede tener sentido para encontrar todos los grupos, temas, dimensiones relevantes, neuronas o lo que sea en sus datos. Esto es genial si eres capaz y estás dispuesto a tirar muchos cálculos.
Hay muchos trucos recientes cuando se trata de entrenar a Deep Networks. Me referiré a ellos a continuación, pero en algunos casos el objetivo no es solo la optimización, sino diseñar una solución de solución específica (el objetivo es casi similar a The Journey ). - Sistemas
Gran parte de la razón por la que el aprendizaje automático se está convirtiendo en el ingrediente clave de casi todo lo relacionado con las personas, las mediciones, los sensores y los datos tiene que ver con los avances en la última década en los algoritmos de escalado. No es una completa coincidencia que Jeff Dean haya dado media docena de tutoriales de aprendizaje automático en el último año. Para cualquiera que haya dormido la última década debajo de una roca: es el hombre detrás de MapReduce, el sistema de archivos de Google, BigTable y otra docena de tecnologías clave que han hecho de Google un gran sitio. Algunos datos sobre él se pueden encontrar aquí.
Bromas aparte, la investigación de sistemas ofrece un tesoro de herramientas para resolver problemas que son distribuidos, asíncronos, tolerantes a fallos, escalables y simples . Esto último es algo que los investigadores del aprendizaje automático a menudo pasan por alto. La simplicidad es una característica, no un error. Algunas de las técnicas básicas que te llevarán bastante lejos: - Tabla hash distribuida
Esto es esencialmente lo que los métodos tales como memcached, dynamo, pastelería o ceph se construyen alrededor. Todos resuelven el problema: cómo distribuir objetos en muchas máquinas de manera que no tengan que preguntar a un repositorio central dónde iban las cosas. Para hacer que esto funcione, necesita codificar la ubicación de manera aleatoria pero determinista (por lo tanto, hashing). Además, debe averiguar quién se encargará de las cosas si falla alguna máquina.
Esto es lo que usamos para el diseño de datos en el servidor de parámetros. Mi estudiante Mu Li es el cerebro detrás de este proyecto. Ver DMLC para una colección de herramientas. - Consistencia y mensajería
El padrino de todo esto es el protocolo PAXOS de Leslie Lamport. Resuelve el problema de que las máquinas lleguen a un consenso, mientras que no todas las máquinas están disponibles en todo momento y algunas pueden fallar (sí, estoy jugando rápido y suelto aquí). Si alguna vez ha usado el control de versiones, probablemente sepa cómo funciona de manera intuitiva: tiene muchas máquinas (o desarrolladores) que generan actualizaciones (o partes de código) y desea combinarlas todas de una manera que tenga sentido (por ejemplo, debería hacerlo). No aplique un diff dos veces) mientras no requiera que todos hablen con todos todo el tiempo.
En los sistemas, la solución es usar lo que se llama un reloj vectorial (ver, por ejemplo, Chubby de Google). Usamos una variante de esto en el servidor de parámetros. La diferencia clave fue (todos los créditos a Mu Li) usar relojes vectoriales para rangos de parámetros. Esto garantiza que no se quede sin memoria para las marcas de tiempo, al igual que un sistema de archivos no necesita una marca de tiempo para cada byte. - Tolerancia a fallos, escalado y la nube
La forma más fácil de aprender esto es ejecutar algoritmos en Amazon AWS, Google GWC, Microsoft Azure o en los muchos otros proveedores que puede encontrar. Es bastante emocionante la primera vez que enciendes 1,000 servidores y te das cuenta de que ahora estás ordenando lo que equivale a una red de bots absolutamente legal. En un caso, mientras trabajaba en Google, tomamos más de 5,000 máquinas de alto nivel en algún lugar de Europa para inferencia en modelos temáticos. Esta fue una fracción considerable de una central nuclear, lo que acumulamos para una factura de energía. Mi gerente me llevó aparte y me dijo que este era un experimento costoso …
Probablemente la forma más fácil de comenzar es aprender sobre la ventana acoplable. Han estado en una lágrima para desarrollar muchas herramientas para facilitar el escalado. En particular, Docker Machine y Docker Cloud son probablemente algunas de sus adiciones recientes más agradables que le permiten conectarse a diferentes nubes al igual que intercambiar controladores de impresora. - Hardware
Suena obvio, pero realmente ayuda si sabes en qué hardware se ejecutan tus algoritmos. Esto le ayuda a descubrir si su código se encuentra cerca del máximo rendimiento. Para empezar, mire los números de Jeff Dean que todo ingeniero debe saber. Una de mis preguntas favoritas de la entrevista es (probablemente a estas alturas) qué tan rápido es la computadora portátil del candidato. Saber cuáles son las limitaciones para el algoritmo es realmente útil. Es caché, ancho de banda de memoria, latencia, discos, etc. Anandtech tiene artículos introductorios realmente geniales y revisiones de arquitecturas de microprocesadores y cosas relacionadas. Échales un vistazo cada vez que Intel / ARM / AMD lanza nuevo hardware. - Estadística
He puesto deliberadamente esto último. Simplemente ya que todos piensan que esto es clave (sí, lo es) y pasa por alto todo lo demás. Las estadísticas son la clave para permitirte hacer buenas preguntas. También le ayuda a comprender cuánto de una aproximación está haciendo cuando está modelando algunos datos.
Muchas de las mejoras en cualquier cosa, desde modelos gráficos, métodos de kernel, aprendizaje profundo, etc. realmente surgen de poder hacer las preguntas correctas, es decir, definir funciones objetivas sensibles que luego puede optimizar. - Estadísticas Propias
Una buena introducción es el libro de Larry Wasserman sobre Todas las estadísticas. Como alternativa, puede consultar el libro Machine Learning de David McKay. Es gratis (y enorme y completo). Hay muchos otros grandes libros, como los de Kevin Murphy, Chris Bishop, Trevor Hastie, Rob Tibshirani y Jerome Friedman. Y sí, Bernhard Scholkopf y yo también escribimos uno. - Algoritmos aleatorios y computación probabilística
Esto es esencialmente la informática que aborda los mismos problemas. La diferencia clave es que se utilizan como una herramienta para diseñar algoritmos en lugar de un problema para ajustar parámetros. Realmente me encanta el de Michael Mitzenmacher y Eli Upfal. Es engañosamente fácil de leer a pesar de que cubre muchos problemas profundos. Otro, si desea profundizar en las herramientas es el de Rajeev Motwani y Prabhakar Raghavan. Está bien escrito pero es más difícil de entender sin tener un buen historial de estadísticas.
Esta respuesta es probablemente lo suficientemente larga ahora que casi nadie habrá llegado hasta aquí. Por lo tanto, debo mantener el resto corto. Hay un montón de contenido de video impresionante en línea. Muchos profesores ya tienen un canal de YouTube donde publican sus clases. Esto ayuda al pasar por el conjunto de herramientas a veces difíciles. Aquí está el mío. Nando de Freitas es mucho mejor.
Y luego están las herramientas. DMLC es un buen lugar para comenzar. Tiene muchos algoritmos para la inferencia escalable distribuida. Incluyendo redes neuronales a través de MXNET.
Muchas más cosas faltan: lenguajes de programación, fuentes de datos, etc. Pero esta respuesta ya es demasiado larga. Más en las otras respuestas.