paper lite data java c matlab machine-learning svm

java - data - svm lite



Sistema de alto volumen SVM(aprendizaje automático) (5)

Estoy trabajando en un posible proyecto de aprendizaje automático que se espera que haga cálculos de alta velocidad para el aprendizaje automático utilizando SVM (máquinas de vectores de soporte) y posiblemente algunas ANN.

Estoy muy cómodo trabajando en matlab con estos, pero principalmente en pequeños conjuntos de datos, solo para experimentación. Me pregunto si este enfoque basado en matlab se escalará. o debería estar buscando algo más? ¿Computación basada en C ++ / gpu? java envolviendo el código de matlab y empujándolo en el motor de la aplicación?

Por cierto, parece haber mucha literatura sobre GPU, pero no mucho sobre lo útiles que son en las aplicaciones de aprendizaje automático que usan Matlab, y ¿se puede comprar el dinero GPU con CUDA más barato? ¿Vale la pena el problema?



Nada a partir de ahora escalará más allá de un límite. libsvm tiene una herramienta para la selección de subconjuntos, para seleccionar un conjunto de puntos de datos para el entrenamiento. Olvídate de ANN, no se generalizará y no existe una teoría que ayude a elegir la cantidad de nodos ocultos, etc. Tiene que ser optimizado manualmente y puede quedar atrapado en los mínimos locales. Ir solo con SVM


Recomendaría no usar Matlab para nada más allá de la creación de prototipos. Cuando el proyecto se vuelve más complejo y extenso, la proporción de su propio código crecerá en comparación con la funcionalidad proporcionada por Matlab y las cajas de herramientas. Cuanto más desarrollado esté el proyecto, menos se beneficiará de matlab y más necesitará características, bibliotecas y, lo que es más importante, prácticas, procesos y herramientas de lenguajes de uso general.

El escalado de la solución de Matlab se logra mediante la interfaz con el código no matlab, y he visto que el proyecto de Matlab se convierte en nada más que un módulo de llamada de pegamento escrito en lenguajes multipropósito. Causando dolores diarios para todos los involucrados.

Si te sientes cómodo con Java, te recomendaría usarlo junto con una buena biblioteca de matemáticas (al menos, siempre puedes usar la interfaz MKL). Incluso con las recientes optimizaciones de Matlab, MKL + JVM es mucho más rápido: la escalabilidad y la mantenibilidad son inigualables.

C ++ con intrínsecos específicos del procesador puede proporcionar un mejor rendimiento, pero a un precio de tiempo de desarrollo y mantenimiento. Agregar CUDA aumenta aún más el rendimiento, pero la cantidad de trabajo y el conocimiento específico apenas lo valen. Ciertamente, no si no tiene experiencia previa con los cálculos de la GPU. Tan pronto como va más allá de un solo procesador, es mucho más efectivo agregar otra CPU o dos al sistema que lidiar con los cálculos de la GPU.


Tanto libsvm como SVM light tienen interfaces de matlab. Además, la mayoría de las tareas de aprendizaje son trivialmente paralelas, así que eche un vistazo a los comandos de matlab como parfor y el resto de Parallel Computing Toolbox.


Trabajo en problemas de reconocimiento de patrones. Permítanme darles algunos consejos si planean trabajar efectivamente en problemas SVM / ANN y si realmente no tienen acceso a un grupo de computadoras:

1) No use Matlab. Utilice Python y su gran cantidad de bibliotecas numéricas para la visualización / análisis de sus cálculos.
2) Secciones críticas para implementar usando C. Puede integrarlas luego con sus scripts de Python muy fácilmente.
3) CUDA / GPU no es una solución si en su mayoría se ocupa de problemas de complejidad de tiempo no polinomiales que son típicos en Machine Learning, por lo que no ofrece una gran velocidad; Los productos dot / matrix son solo una pequeña parte de los cálculos de SVM: aún tendrá que ocuparse de las extracciones de características y el procesamiento de listas / objetos, intente en cambio optimizar sus algoritmos y diseñar métodos algorítmicos efectivos. Si necesita paralelismo (por ejemplo, para ANN), use hilos o procesos.
4) Use el compilador GCC para compilar su programa C - construirá el código ejecutable muy rápido. Para acelerar los cálculos numéricos, puede probar los indicadores de optimización de GCC (por ejemplo, Streaming SIMD Extensions)
5) Ejecute su programa en cualquier CPU moderna bajo el sistema operativo Linux.

Para obtener un rendimiento realmente bueno, use clústeres de Linux.