¿Es una pérdida de tiempo aprender bibliotecas de aprendizaje automático, como TensorFlow, en lugar de implementar los algoritmos desde cero?

“Con un gran poder viene una gran responsabilidad.”

Este es un dicho popular en el mundo real. En informática, toda la abstracción utiliza esencialmente esta idea: cuando construye herramientas de alto nivel (abstractas) para realizar alguna acción, reduce la potencia otorgada al usuario y, en consecuencia, la responsabilidad sobre el usuario es menor, lo que hace que el código menos propenso a errores A medida que intenta trabajar con herramientas de nivel inferior, obtiene más control (más “potencia”), pero debe tener mucho cuidado con los pequeños detalles para que las cosas funcionen correctamente.

Por ejemplo, con un lenguaje de alto nivel como Python, debe prácticamente no administrar la memoria, mientras que con un lenguaje de nivel inferior como C, trabaja con punteros y tiene que administrar la memoria usted mismo. C le brinda más potencia (mejor utilización del hardware), pero también debe esforzarse más para lograr la misma funcionalidad.

Del mismo modo, si va más abajo, los programas en código de máquina pueden optimizarse mucho más de lo que los compiladores pueden lograr al convertir programas de alto nivel en código de máquina.

Del lado del hardware, un FPGA se puede usar para crear circuitos electrónicos para tareas específicas y, por lo tanto, son más eficientes que el hardware de uso general.

Cuál es mejor depende de su aplicación y requisitos. Si desea escribir código para la industria donde el rendimiento (en términos de velocidad, uso de hardware, etc.) es muy crucial, es probable que necesite trabajar con herramientas de bajo nivel para tener el mayor control. Sin embargo, la mayoría de las veces, los requisitos no son tan estrictos y trabajar con herramientas de alto nivel es mucho más fácil y eficiente y, lo que es más importante, más fácil de mantener. Esa es la razón por la que escribe la mayoría del código en C ++ / Java / Python y no en lenguaje ensamblador. La mayoría de la creación de prototipos se realiza con herramientas de alto nivel, y la mayoría del código en producción finalmente también utiliza herramientas de alto nivel. Solo algunas partes muy específicas que pueden acelerarse significativamente se implementan típicamente con herramientas de nivel inferior. Por lo tanto, aprender TensorFlow y scikit-learn es importante si quieres trabajar en ML.

Otro argumento para usar estas herramientas es que no tiene sentido reinventar la rueda. Cuando alguien ha escrito un código GPU para realizar operaciones complejas para el aprendizaje profundo, y le ha proporcionado API de alto nivel, volver a implementar el código con la misma funcionalidad es una pérdida de tiempo y esfuerzo. Además, herramientas como estas han sido utilizadas por miles de programadores, por lo que en su mayoría están libres de errores. Si escribe su propio código, deberá pasar una cantidad considerable de tiempo para asegurarse de que esté libre de errores.

Sin embargo, permítanme señalar que, aunque normalmente usaría estas herramientas, mientras aprende ML, es una buena idea implementar algunos algoritmos de ML desde cero para obtener una buena comprensión del funcionamiento interno de estas técnicas. Ver

  • La respuesta de Prasoon Goyal a ¿Cómo aprendo Machine Learning en 10 días?
  • La respuesta de Prasoon Goyal a ¿Cómo aprendo el aprendizaje automático?

para más detalles.

Ahora vea, hay dos tipos de ingenieros de aprendizaje automático (aprendizaje profundo).

  1. El primer tipo que usa modelos existentes para resolver algún problema común en cualquier campo.
  2. El segundo tipo que intenta hacer nuevos modelos o algoritmos por decir.

El primer tipo son los conocidos popularmente como ingenieros de aprendizaje automático en blogs y sitios web de ciencias. Son contratados por empresas a granel para trabajar en proyectos y otras cosas.

El segundo tipo son aquellos que están investigando en el campo de la teoría del aprendizaje, encontrando formas más eficientes para la tarea o resolviendo problemas únicos en la gran variedad de campos en los que trabajan.

De cualquier manera, debe saber usar una biblioteca como Tensorflow, Caffe, Theano, etc., ya que construir todo desde cero es tonto cuando ya se ha implementado de manera eficiente. Pero especialmente para el segundo tipo, si no sabes cómo funcionan realmente las cosas debajo, entonces sería un problema para ti. La única forma de comprender completamente los niveles subyacentes es implementar al menos algunas cosas básicas desde cero como un SVM, Softmax, CNN, RNN; no grandes redes sino pequeñas con solo los bloques de construcción básicos.

PD: Antes de que estalle la sección de comentarios, un descargo de responsabilidad. No quise faltarle el respeto a ningún tipo. Ambos son útiles para el mundo a su manera. Un campo solo florece cuando la teoría se inventa con aplicación simultánea en el mundo real. Si no, ¿de qué sirve?

Tl; dr en la parte inferior

De acuerdo, me gusta el espíritu de la pregunta, la programación con solo una vista de recuadro negro de todo es cómo te reemplazan en unos años, por lo que realmente deberías tener una comprensión más profunda de lo que está sucediendo que simplemente sklearn.LinearRegression (). Dicho esto, no implementar directamente el código es el camino a seguir.

Echemos un vistazo al código sklearn para la regresión lineal derecha scikit-learn / scikit-learn. ¡Son 600 líneas de código python! que honestamente es bastante Es cierto que hacen mucho allí por razones de eficiencia y características adicionales, pero aún así, no hay nada que temer. Ahora, no estoy seguro si sabe cómo funciona la regresión lineal, pero sin siquiera pasar por ese código, puedo decirle que todo lo que es matemáticamente importante para optimizar un modelo de regresión lineal probablemente se puede hacer en menos de 10 líneas de código en python. Sin embargo, hay mucho más por hacer para implementarlo, debes hacer toda la creación de la clase, escribir algunos métodos diferentes para ajustar las cosas, obtener coeficientes, etc., todo lo cual no te ayudará realmente Entiende lo que realmente está sucediendo.

Aquí está la matemática detrás de la regresión lineal.

Ahora, te estarás preguntando, ¿qué da? Le acabo de decir que el código podría implementarse en menos de 10 líneas y lo vinculé a un documento gigante. Bueno, resulta que si bien la optimización de un modelo de regresión lineal tiene una solución de forma cerrada realmente agradable, que es bastante fácil de implementar, llegar allí no es una tarea trivial para alguien sin un fondo matemático decente; Por cierto, solo codificar las 10 líneas de código de Python que calcula sus coeficientes para usted no lo llevará a un lugar donde realmente entienda lo que está sucediendo.

Si realmente quieres saber qué está pasando, te sugiero que abras algunos libros sobre ml y los revises mientras haces los ejercicios en el camino. Sé que la introducción al aprendizaje estadístico es una buena opción; sin embargo, si no tiene una buena base en álgebra lineal y probabilidad, sugiero comenzar allí. Otra opción que es mucho más popular es pasar por un mooc como cs 229, todo está publicado en línea y hay mucho apoyo ya que el curso es muy popular.

Tl; dR

El espíritu de la pregunta está en la dirección correcta, sin embargo, implementar las cosas es demasiado esencial. Si comprende el psuedocode y la matemática detrás de los algoritmos, obtendrá mucho más de su tiempo.

¿Cuál es tu objetivo? Consideremos dos casos:

  1. Tiene un problema en la mano y desea utilizar el marco ML existente para encontrar una solución. En este caso, se supone que ciertamente encontrará una solución dentro del marco existente. La novedad no radica en los métodos sino en la aplicación. La participación del tiempo será menor. Sin embargo, puede haber problemas al usar esos marcos en la práctica, especialmente si desea monetizar sus ideas (no soy un experto en eso, y es posible que desee leer sobre sus acuerdos de licencia).
  2. Tiene un problema a mano, no tiene una solución a mano, probó los marcos existentes pero no le dieron lo que desea lograr. Empiezas a construir tu propia solución. Esto solo sucederá cuando comprenda totalmente las deficiencias de los marcos existentes para resolver su problema. En este caso, la novedad radica tanto en el marco de ML que está desarrollando como en la aplicación en cuestión. Sin embargo, esto puede llevar mucho tiempo.

No lo es.

Las bibliotecas como TensorFlow y scikit-learn ocultan tantos detalles debajo del capó que puede crear un objeto de manera simple y llamar a varios métodos para implementar algoritmos complejos de CNN o RNN.

Eso suena como un cumplido para esas bibliotecas. No veo ningún punto negativo de ocultar ” tantos detalles debajo del capó “.

La única impresión negativa relacionada con esas bibliotecas que tengo es que algunos estudiantes las usaron para llevar a cabo su ” investigación ” sin comprender mucho lo que sucede debajo del capó. Como resultado, sus modelos fueron extraños y el resultado fue horrible. Pero eso es completamente su culpa, no las bibliotecas.

Si va a aprender aprendizaje automático (ML), sus 101 cursos requieren que implemente algoritmos desde cero al menos una vez. Es imprescindible para entender el tema. Sin embargo, no es productivo repetir el mismo procedimiento para todos los proyectos posteriores. Incluso si mantiene su propia biblioteca, sus características serían muy limitadas. Y si te esfuerzas tanto por llevarlo al mismo nivel con TensorFlow (TF), es mejor usar TF en su lugar.

Si eres un entusiasta, tienes poco conocimiento de ML y te gustaría probar ML. Es bastante difícil implementar el algoritmo desde cero. Entonces, usar la biblioteca es una opción obvia.

Las bibliotecas proporcionan herramientas básicas y avanzadas para construir algo grandioso. Vale la pena entender el funcionamiento básico de cualquier cosa, pero cuando se trata de negocios o productos para personas donde se necesitan aplicaciones de alta calidad, las bibliotecas como TensorFlow ayudan mucho. Las cosas que tardan mucho tiempo en codificarse se pueden hacer en menos líneas y rápidamente.

mi segundo punto es que si alguien está atascado en el nivel básico desde cero, entonces él / ella no puede ir más allá de las cosas avanzadas. use TensorFlow para crear cosas más extraordinarias que no están disponibles.

Por ejemplo, tomemos una regresión lineal simple, en TensorFlow está en líneas muy de código y mejor. Consulte la regresión lineal en TensorFlow en Introducción a la regresión lineal. Este enlace es bastante útil.

¡Hola!

Hay dos tipos de desarrolladores que estarán interesados ​​en ML:

  • Desarrolladores de negocios
  • Científicos de ML

Los desarrolladores de negocios deben hacer que las cosas funcionen: tener que codificar todo desde cero es una carga enormemente costosa. Bibliotecas como esas reducirán eso a una porción manejable.

Y sin embargo … incluso los científicos de ML en ciernes se beneficiarían al comenzar con una biblioteca. La razón es que una biblioteca les permite ver los dominios problemáticos sin verse agobiados por los detalles esenciales de lo que sucede debajo del capó. Sostengo que todo el primer año de aprendizaje automático debe gastarse usando bibliotecas existentes (sí, plural) porque de esa manera se exponen a lo que los desarrolladores comerciales estarán expuestos.

Todos los otros tipos de científicos básicamente caen bajo la etiqueta de “desarrollador de negocios” en este caso, a menos que estén trabajando con un equipo de ML desde el principio. ¿Se imaginan realmente a los biólogos que tienen que codificar su camino hacia el LD para obtener resultados? Creo que es ridículo y poco práctico.

Hay varias razones diferentes por las cuales implementar algoritmos desde cero puede ser útil:

  • Puede ayudarnos a comprender el funcionamiento interno de un algoritmo.
  • podríamos intentar implementar un algoritmo de manera más eficiente
  • podemos agregar nuevas características a un algoritmo o experimentar con diferentes variaciones de la idea central
  • evitamos problemas de licencia (por ejemplo, Linux vs. Unix) o restricciones de plataforma
  • queremos inventar nuevos algoritmos o implementar algoritmos que nadie haya implementado / compartido aún
  • no estamos satisfechos con la API y / o queremos integrarla más “naturalmente” en una biblioteca de software existente

    Por lo tanto, creo que es útil implementarlo desde cero en lugar de usar bibliotecas.

Te estás perdiendo el punto de usar TensorFlow, caffe o cualquier otra biblioteca para el caso. No tiene que ocuparse de reinventar cosas simples como tomar imágenes / datos y preprocesar, preparar conjuntos de datos y visualizar gráficos. Todo lo cual ha ayudado a los investigadores a dedicar más tiempo al problema en lugar de jugar con las herramientas. Es una bendición para las personas que desean utilizar los modelos pre / capacitados en todas las plataformas y hacer uso del procesamiento distribuido, que de lo contrario tomaría una gran cantidad de tiempo y recursos para hacerlo solo. Intenta buscar en Google el síndrome no inventado aquí.

Nadie te está obligando a seguir ningún marco, por lo que si aprenderlo es una pérdida de tiempo depende de lo que quieras hacer con él y tu tiempo.

Desde una perspectiva gerneral, no un experto en IA, tome el cálculo como ejemplo. Yo compararía los cursos de pregrado de cálculo aplicado con el uso de tensorflow. En el cálculo de pregrado, aprendemos a usar las técnicas, no cómo probarlas. Suponemos que están probados y simplemente practican su uso. Más adelante, en los cursos de matemáticas de nivel superior, podemos probarlos con un curso de análisis real.

Revisar ejemplos de flujo de tensor y usarlos probablemente no sea un mal lugar para comenzar. Además, dependiendo de los problemas que necesite abordar, usar una biblioteca madura podría ser ventajoso e incluso deseable. A menos que esté planeando contribuir académicamente o lograr un gran avance en el campo, realmente debe preguntarse si vale la pena reinventar la rueda o aplicarla para resolver problemas reales, especialmente si no está buscando un título formal.

En programación, todo lo que hacemos descansa sobre los hombros de todos los que nos han precedido. No hacemos nada desde cero.

Independientemente del lenguaje de programación que elijamos, utilizamos las “bibliotecas estándar” que vienen con él. También utilizamos bibliotecas de terceros. Alguien escribió esas bibliotecas para ahorrarnos el esfuerzo de hacer todo desde cero.

Utilizamos marcos en dominios de aplicaciones particulares por la misma razón. Ya sea que sea Qt para escritorio, o Laravel para web, o Unity para juegos, o TensorFlow para aprendizaje automático, es la misma razón. Todos tienen “magia” y no importa nada.

Al final, se trata de ahorrar tiempo, esfuerzo y costos .