¿Cómo podría construir una biblioteca de aprendizaje automático?

Para construir un sistema complejo, piense que ese sistema complejo consiste en módulos más simples. El truco es identificar esos módulos más simples, dado un problema complejo, debe digerir el problema en componentes que pueda asimilar o implementar.

Dicho esto, puedes comenzar diseñando una base escalable, es decir, una base sobre la que construirás con el tiempo. Piense en el crecimiento, por eso la naturaleza se trata de eso, todo crece. Entonces, una vez que tenga una base escalable planificada, puede comenzar desde allí.

Lo primero es escribir código legible, todas las funciones deben ser largas, no demasiado largas y descriptivas, no tiene que depender de la documentación, sino simplemente observando los nombres de las funciones o clases debe poder tener una idea sobre de qué se tratan. Por supuesto, debe documentar la biblioteca, especialmente si desea hacerla pública, pero debe ser intuitiva y ese es un aspecto importante.

Con las bibliotecas, necesita un núcleo desde el cual se puedan extender otras bibliotecas, el núcleo debe manejar las cosas de bajo nivel que son muy comunes en todas las aplicaciones de ML, como el código matemático optimizado por GPU. Este núcleo es importante porque lo ayudará a escribir otras bibliotecas encima de él, ahorrándole mucho tiempo en el futuro.

Específicamente con ML hay una gran cantidad de multiplicación de matrices y codificación de GPU, por lo que comenzaría con la implementación de un módulo de álgebra lineal altamente eficiente, tomándome mi tiempo hasta que funcione bien. Lo diseñaría de tal manera que este módulo manejaría todos los cálculos desde clasificadores lineales más simples hasta redes neuronales profundas.

Una vez que tiene implementadas las funcionalidades centrales en el núcleo, necesita pasar a la parte de shell, es decir, algoritmos que son de propósito menos general y más orientados a la aplicación. Puede agregar soporte para redes neuronales y eventualmente aprendizaje profundo más adelante a medida que avanza. Recuerde que el truco es hacer crecer una biblioteca de ML 🙂 agregar más funciones con el tiempo y eliminar los errores a medida que avanza.

Espero que esto ayude.

Construí un kit de herramientas de aprendizaje profundo desde cero en Matlab / C llamado Cortexsys. Puedes verlo en GitHub. joncox123 / Cortexsys

Puede mirar el código para ver cómo se implementan los diferentes tipos de red. Sin embargo, le sugiero que descargue los diversos documentos del archivo e-Print de arXiv.org y lo busque en Google Scholar. Entonces simplemente tiene que implementar los métodos del documento. Es la mejor manera de aprender y comprender.

Además, ayuda tener algunos buenos libros, como Pattern Recognition y Machine Learning | Christopher Bishop | Springer o Machine Learning: una perspectiva probabilística.

Por cierto, no recomendaría usar solo C. Muchos de estos algoritmos son mucho más fáciles de implementar como herramientas en un lenguaje orientado a objetos como C ++, Java o Python. Parece que hay una gran cantidad de código Python y Java ML en estos días, por lo que tal vez un kit de herramientas C ++ sólido pero fácil de usar es algo en lo que podría trabajar.

Desde cero?

Comience con regresión lineal, luego regresión logística, luego perceptrón, k-vecino más cercano y k-medias. Entonces quizás un método basado en un árbol o una red neuronal.

El curso de aprendizaje automático en curso con Andrew Ng proporciona detalles algorítmicos adecuados para implementar la mayoría de ellos, y las clases de introducción de algoritmos (como la de Sedgewick) le enseñarán cómo hacer árboles binarios (para knn, kmeans, etc.)

Aprendizaje automático – Universidad de Stanford | Coursera

Algoritmos, Parte I – Universidad de Princeton | Coursera

Depende de qué tan bajo quieras ir. Hemos estado construyendo Deeplearning4j durante los últimos dos años y hemos cambiado. Comenzamos construyendo un algoritmo DL (máquinas Boltzmann restringidas) y luego nos expandimos para incluir redes recurrentes, redes convolucionales y word2vec, entre otros. A medida que progresas, aprendes a construir algo cada vez más general.

Terminamos construyendo nuestra propia biblioteca de matriz para DL4J llamada Nd4J, o matrices n-dimensionales para Java, ya que nada más hizo eso. Básicamente es Numpy para JVM, una biblioteca tensorial que te permite extender a cualquier algoritmo. Pero Java era lento, no importaba cómo lo cortaras, así que terminamos implementando el cálculo en C ++ en una biblioteca llamada libND4J. El aprendizaje profundo es computacionalmente intensivo, por lo que tuvimos que optimizar en varios chips: GPU NVIDIA, Intel x86 e IBM Power8. Y eso es lo que llamamos exageración …

Deeplearning4j.org

Repositorios de Github:

deeplearning4j / deeplearning4j

deeplearning4j / nd4j

deeplearning4j / libnd4j