3 votos

¿Cómo decidir si reutilizar el código antiguo o reinventar la rueda?

Llevo mucho tiempo pensando en trabajar con redes neuronales y algoritmos genéticos. Nunca he podido decidir si tiene sentido empezar a escribir mi propio código, o reutilizar las muchísimas opciones hechas por otros.

En mi experiencia, asumiendo que el programador sabe lo que está haciendo hasta un punto razonable, hay muy poco que sustituya al código C o C++ elaborado según las preferencias de cada usuario. Por un lado, te permite hacer casi cualquier cosa con el código debido a que tienes un conocimiento completo de su funcionamiento. Uno puede, por ejemplo, incorporar cualquier nuevo avance que lea en la literatura.

Por otro lado, una sola persona suele tener dificultades para hacer tanto como un equipo de personas. Como individuo, siempre es posible que uno pase por alto varios fallos. Hay muchas otras desventajas de ser un solitario.

Así que, para aquellos que tienen algo de experiencia en el aprendizaje automático, me gustaría escuchar lo que realmente funciona en el mundo real. ¿Es más común el uso de algunos paquetes de programación conocidos o mucha gente escribe sus propias implementaciones personalizadas? Estoy específicamente interesado en las áreas de RBM, redes neuronales, programación genética y clustering.

Supongamos que estoy dispuesto a dedicar mucho tiempo a aprender sobre el aprendizaje automático y que le dedicaré al menos tanto tiempo y esfuerzo como lo haría un estudiante de posgrado.

4voto

Amadiere Puntos 5606

Esta medalla tiene dos caras.

Por un lado, aunque ya hay mucho código, también hay muchos errores en este código. Puede que se haya probado sólo en conjuntos de datos muy pequeños, y una vez que se ejecuta en datos mucho más grandes se vuelve increíblemente lento. O está estrechamente ligado a datos bidimensionales, a un tipo de datos concreto, lo que sea. Así que al reutilizar el código existente, puedes acabar descubriendo que es incorrecto, lento o que necesita ser reescrito para funcionar con tus datos.

Por otro lado, es probable que también cometa algunos errores o decisiones que limiten el rendimiento de sus códigos. Es posible que estos problemas ya se hayan solucionado en el código existente. El uso de bibliotecas existentes también puede proporcionarle una funcionalidad que no consideraba necesaria al principio, pero que al final le resulta muy valiosa. Además, puede darle acceso a la comparación con otros métodos, la visualización, la depuración, la evaluación, etc.

Mi recomendación es la siguiente:

Haga buscar los códigos existentes. Pero compruebe si son realmente escrito y diseñado para la extensibilidad y la reutilización . Hay algunos buenos ejemplos: libSVM es el estándar de facto para las máquinas de vectores de apoyo, y se utiliza en casi todas partes. Debe haber enlaces para más de 20 idiomas. En lugar de reescribir SVM, este es definitivamente un código para reutilizar. O ELKI de la que soy bastante fan, es un marco de trabajo Java para la agrupación y la detección de valores atípicos (aunque todavía no tiene aprendizaje automático). Cuesta un poco acostumbrarse a él, debido a su mezcla de orientación a objetos y optimización entretejida. Pero esto lo hace sorprendentemente rápido (definitivamente supera a R para mí) y muchas de las cosas se pueden implementar en unas pocas líneas y luego todavía se beneficiarán de estas optimizaciones. Lo que lo hace reutilizable es la arquitectura modular. He escrito una función de distancia personalizada, y puedo utilizarla en todos los algoritmos, y he escrito un algoritmo en el que se pueden introducir funciones de distancia arbitrarias. He intentado estas cosas en R antes, pero o bien el módulo estaba limitado a las distancias euclidianas y tal, o necesitaría una matriz de distancia en la memoria, que toma $\mathcal{O}(n^2)$ memoria y tiempo. Además, al final puedo hacer miles de combinaciones distancia+algoritmo+índice para comparar y ver si mi nuevo material sirve para algo. Por ejemplo, aprendí de esta manera que la distancia de Canberra funciona sorprendentemente bien en una serie de escenarios, y a menudo sería una opción mucho mejor que la distancia euclidiana.

Por otro lado, hay mucho código en la red que es una mierda . Estaba buscando el algoritmo de clustering OPTICS. He encontrado versiones en Matlab y Python: http://chemometria.us.edu.pl/download/optics.py pero ambos eran una mierda. Lento, y el resultado era esencialmente un resultado DBSCAN. OPTICS en Weka tiene una bonita vista de la trama, pero no agrupa realmente, y es increíblemente lento. La versión ELKI de OPTICS era una liga completamente diferente. Me imagino que alguien simplemente volcó lo que había llegado, pero el código nunca fue revisado o incluso probado adecuadamente. La versión de python aparentemente está basada en la versión de Matlab, que tal vez fue transcrita de la versión incompleta de Weka. ¡Ouch!

2voto

Raffael Puntos 154

Implementar una red neuronal no es realmente un reto técnico, especialmente si se planea entrenarlas con un algoritmo genético en lugar de con retropropagación o algo así. Puede utilizar este tutorial como un buen punto de partida si quieres ir por ese camino.

En general, me parece que hasta que no haya puesto en práctica un algoritmo no entenderé los detalles que he glosado al leer el documento. Si tu propósito es entender realmente las redes neuronales, te recomiendo encarecidamente que las implementes. Una vez que tenga algo en su lugar, vaya a implementar la retropropagación. Añade el impulso para mejorar los tiempos de entrenamiento. Utiliza la implementación como experiencia de aprendizaje.

Por otro lado, si sólo quieres ejecutar el algoritmo en algunos datos y ver los resultados, probablemente sea mejor tomar alguna implementación del estante y correr con ella. Hay muchos paquetes en prácticamente cualquier lenguaje que te permitan poner en marcha rápidamente una red neuronal.

En resumen, el hecho de implementar un algoritmo o utilizar un paquete estándar depende de si se quiere profundizar en los detalles del algoritmo o si sólo se quiere juguetear.

0voto

Te recomiendo absolutamente que te olvides de poner esfuerzo en C/C++ para este propósito, y te conviertas al lenguaje de programación R. En R, hay un gran número de paquetes ya desarrollados y disponibles gratuitamente para cualquier propósito y puedes reutilizarlos fácilmente.

¡Hacer una prueba estadística difícil de desarrollar, ejecutar un Análisis de Componentes Principales, aprender una Red Neuronal o encontrar la Máquina de Vectores de Apoyo se hacen con comandos ÚNICOS!

Para las áreas que has mencionado casi no hay necesidad de desarrollar las cosas básicas en R. ¡Sólo debes desarrollar tu coche sobre la base de las ruedas disponibles!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X