Cómo diseñar algoritmos de aprendizaje automático desde cero

Como ejemplo, permítanme explicar cómo haría para implementar la regresión lineal, usando Python y NumPy. La regresión lineal es un algoritmo de aprendizaje supervisado y uno de los algoritmos más simples en todo el aprendizaje automático.

Saqué un conjunto de datos aleatorio de Internet con chirridos de cricket versus temperatura.

Mayor temperatura, más chirridos. Tiene sentido. Ahora, a la implementación.

En términos generales, un algoritmo de aprendizaje supervisado utiliza tres funciones: una función de hipótesis, una función de costo y una función de optimización. Necesitamos implementar esto.

Función de la hipótesis

Nuestra hipótesis lineal está en la forma

[matemáticas] h_ \ Theta (x) = \ Theta_0 + \ Theta_1 * x_1 [/ matemáticas]

usando lo que yo llamo “notación Andrew Ng”, porque esto es lo que usó en el curso de Machine Learning en Coursera.

La hipótesis generalizada de regresión lineal es

[matemáticas] h_ \ Theta (x) = x \ cdot \ Theta = \ Theta_0 * x_0 + \ Theta_1 * x_1 +… + \ Theta_n * x_n [/ math]

¿Cómo traducimos eso en código?

def predecir (X, Theta):
return X.dot (Theta)

¡Tan sencillo como eso!

Llamo a la función predecir , ya que la usaría para predecir valores Y invisibles con nuevas muestras de X. Se generaliza a un número arbitrario de características, aunque solo tengamos una en este caso.

Nota: Agregaré un 1 a cada muestra de [matemáticas] X [/ matemáticas] como un término de sesgo. [math] \ Theta_n [/ math] es entonces el sesgo. Te dejo que descubras cómo implementar esto.

Función de costo

La función de costo nos dice qué tan bien funciona el algoritmo en los datos de entrenamiento. Para la regresión lineal, se ve así:

[matemáticas] J (\ Theta) = \ frac {1} {2m} \ sum_ {i = 1} ^ {m} (h_ \ Theta (x ^ {(i)}) – y ^ {(i)}) ^ 2 [/ matemáticas]

Saqué esto directamente del material del curso Coursera. Implementar esto en código es sencillo.

costo de def (X, Y, Theta):
return np.sum ((predecir (X, Theta) – Y) ** 2) / (2 * len (X))

Función de optimización

Para aprender nuestro modelo, implementaremos el algoritmo de optimización más utilizado en aprendizaje automático, descenso de gradiente. Esta es la regla de actualización:

[matemáticas] \ Theta: = \ Theta – \ alpha \ frac {1} {m} \ sum_ {i = 1} ^ {m} (h_ \ Theta (x ^ {(i)}) – y ^ {(i )}) x ^ {(i)} [/ math]

Nuevamente, se trata simplemente de traducir esto directamente al código.

def descender (X, Y, Theta):
retorno Theta – ALFA * (np.mean ((predecir (X, Theta) -Y) * XT, eje = 1))

Idealmente, debe agregar un término de regularización como L1 o L2, pero para este ejemplo simple realmente no lo necesitamos.

Ahora, hemos implementado las tres funciones que necesitábamos, cada una en una línea de código. Es hora de ejecutar el experimento de aprendizaje.

Configurando el experimento

Ya tengo los vectores X (con términos de sesgo adicionales) e Y.

Inicializamos [math] \ Theta [/ math] en números aleatorios entre -1 y 1. En nuestro caso de regresión lineal simple, [math] \ Theta [/ math] consistirá en dos números, un peso para la función y uno por el sesgo

def init_weights (X):
return np.random.uniform (-1,1, X.shape [1])

Theta = pesos_inicial (X)

También necesitamos algunas constantes. La constante de aprendizaje, [math] \ alpha [/ math], y el número de iteraciones para nuestro experimento.

ALFA = 0.002
ITERACIONES = 50

correr

Ahora, descendemos 50 veces.

costos = []
para i en rango (ITERACIONES):
Theta = descender (X, Y, Theta)
cost.append (costo (X, Y, Theta))

Solo por diversión, llevo un registro de la función de costo para cada iteración. Aquí está el resultado.

El algoritmo converge vergonzosamente rápido, pero este es un conjunto de datos de juguete, después de todo.

Ahora tracemos la línea de regresión sobre el conjunto de datos.

Se ve bien.

Este es el enfoque general para implementar algoritmos de aprendizaje supervisado. Predecir, optimizar y calcular el costo. Encuentre la definición teórica de estas tres funciones y escríbalas en código.

Como a veces me gusta decir: una vez que entiendes este sencillo ejemplo, entiendes el aprendizaje automático. Todo a partir de ahí es solo una complejidad añadida.

Muchas veces uno no necesitará implementar cosas de aprendizaje automático (ML) desde cero. Sin embargo, cuando esté aprendiendo, intente implementar los algoritmos más importantes desde cero. Por ejemplo, el algoritmo de retropropagación en redes neuronales convolucionales (convNet) y redes neuronales profundas completamente conectadas (DNN) es muy importante, así que intente implementarlo y vea si comprende lo que está sucediendo. También descubrí que implementar backprop con una capa de salida softmax es bastante confuso, este tipo de desafíos interesantes deben implementarse desde cero.

Sí, eso se trata principalmente de aprender, pero cuando consideras diseñar algoritmos ML desde cero, eso significa algo completamente diferente. Estás tratando de encontrar algo un poco diferente de lo que existe. Para poder hacer eso, necesita ampliar su conocimiento leyendo revista tras revista de las principales conferencias y los mejores equipos de investigación como OpenAI, DeepMind, FAIR, Microsoft Research y Baidu.

En el diseño, normalmente utilizo tres etapas para decidir qué hacer.

  1. El primer paso para diseñar es definir el problema de una manera ejecutable muy simple. ¿Qué intentas resolver? Si está trabajando en una empresa, el problema tiene algo que ver con mejorar un servicio o proceso de producción para alinearse con los objetivos comerciales de esa empresa.
  2. El segundo paso es buscar lo que está disponible por ahí. Esto es importante si la línea de tiempo del proyecto es ajustada. Hay muchas bibliotecas por ahí para poner en marcha algo, pero puede que no sea el enfoque más eficiente.
  3. Si nada cumple con sus objetivos, despliegue el suyo. Es hora de cambiar al modo “hágalo usted mismo”. Necesitará experiencia en lenguajes de codificación como C / C ++ para este. Este tercer paso se produce porque la mayoría de las bibliotecas son de alto nivel y se adaptan a las necesidades de una empresa en particular. TensorFlow, por ejemplo, está más adaptado a Google al igual que el kit de herramientas cognitivas (CNTK) es más adecuado para Microsoft. La mayoría de las bibliotecas tienen un gran alcance, que tiene un precio de ineficiencia computacional. Por lo tanto, algunas bibliotecas pueden ser lentas, especialmente si uno de sus objetivos es el rendimiento en tiempo real. He construido una biblioteca de visión en tiempo real de alta velocidad que es varias veces más rápida que OpenCV porque esa biblioteca es pequeña y altamente especializada. Ahora estoy construyendo una biblioteca ML adaptada a mis necesidades de diseño ya que la mayoría de las bibliotecas no me permitirán hacer cosas locas de bajo nivel. Estoy trabajando en este loco sistema de visión basado en ML. Si usted es un equipo, este modo no es un modo de “hágalo usted mismo”.

Pero, en general, los algoritmos de ML comparten muchas cosas en común, como lo describe Håkon Hapnes Strand en la respuesta a esta pregunta. Notará que necesita modelar el problema y definir una función objetivo que tenga que ser diferenciable si desea utilizar algoritmos de optimización basados ​​en el descenso de gradiente en el aprendizaje. Todavía puede elegir objetivos complejos y utilizar una mezcla de optimización libre de gradientes y métodos de agrupación no supervisados, como k-means, agrupación aglomerativa o métodos de agrupación jerárquica recíproca del vecino más cercano. Sin embargo, depende de la complejidad del problema en cuestión.

Por lo tanto, no es fácil ni siempre es necesario diseñar nuevos algoritmos desde cero, por eso la mayoría de los casos de uso se refieren al uso de bibliotecas existentes como TensorFlow. Pero personalmente no aprendí el aprendizaje automático solo por un trabajo, hay problemas que estoy interesado en resolver especialmente en visión por computadora (CV). Es por eso que me esforcé por comenzar a escribir bibliotecas desde cero porque lo que estoy implementando es un poco diferente de las cosas aquí.

En mi sistema de visión, por ejemplo, que he desarrollado desde cero, tuve que diseñar e implementar nuevos algoritmos de visión en tiempo real desde cero. Hubieran sido lentos si hubiera decidido implementarlos en OpenCV.

Entonces, cuando eliges esta ruta de diseño de tus propias cosas desde cero, prepárate, es un viaje muy largo y desafiante. Incluso Ian Goodfellow tuvo que implementar las redes de confrontación generativa (GAN) después de una leve discusión en un bar. Era su momento eureka, necesitarás esos momentos de vez en cuando. Pero no digo ir a los bares para encontrar el efecto eureka.

Espero que esto ayude.

No hay daño en atacar algoritmos de ML desde cero. para esto, necesitaría comprender claramente los algoritmos y los principios básicos en los que se basan los algos. Entonces necesitaría el dominio del lenguaje popular para escribir algoritmos como Perl o Python o Matlabs.

Sin embargo, la pregunta clave es: ¿por qué querrías hacerlo? Hay tantos paquetes implementados que ya existen. Paquetes de código abierto donde las personas han pasado meses y años de esfuerzo. Intenta hacer una reutilización de estos.

Personalmente, no pierdo el tiempo implementando algoritmos de aprendizaje automático desde cero.
Si es necesario, compraré un libro de algoritmos de aprendizaje automático. Reviso un algoritmo y lo implemento, sin paquetes externos. Haré lo mismo para todos los algoritmos del libro de aprendizaje automático. Voy a través, implemento sin paquetes externos. Compro un nuevo libro y continúo implementando nuevos algoritmos. Luego, después de terminar con las implementaciones. Rápidamente, organizo mi código de manera significativa, como elementos en el mismo lugar. Ahora comenzaré a probar mi implementación.

Al final, lo que logré debería estar cerca del paquete en Proyectos que usan Eigen Eigen

Aprenda las matemáticas detrás de muchos algoritmos, luego elija los que mejor se adapten al problema. Una vez que conozca las matemáticas detrás de los pasos de varios algoritmos, puede comenzar a combinarlos o cambiar un paso por otro.

More Interesting

¿Cómo puedo calcular de manera eficiente el número de intercambios requeridos por los métodos de ordenación lenta como la ordenación por inserción y la ordenación por burbujas para ordenar una matriz determinada?

¿Cuáles son los algoritmos de nivel básico con los que debemos comenzar y cuáles son los algoritmos avanzados que debemos estudiar?

¿Cuáles son los mejores algoritmos para el análisis de sentimientos?

¿Cuál es la diferencia entre los algoritmos Reheap up y Reheap down?

¿Cómo funciona el retroceso en el caso de encontrar un subconjunto de una suma particular?

¿Cuál es el algoritmo de programación monotónico de velocidad en los sistemas operativos?

¿Es posible aplicar de manera eficiente algoritmos de aprendizaje automático para problemas de optimización combinatoria?

¿En qué lenguaje de programación están escritos los algoritmos de aprendizaje automático de Google: C ++ o Java? ¿Por qué?

¿Cuál es el mejor camino para dominar el aprendizaje profundo?

¿Cuáles son las opciones de carrera en ingeniería informática?

¿Cuál es el enfoque para encontrar un acuerdo que produzca el salario mínimo?

¿Cómo funciona Swype?

¿Qué algoritmos de clasificación tienen la mejor complejidad de tiempo de caso?

Si hay una matriz de 101 números que consiste en números del 1 al 100 con el número repetido, ¿cómo encuentra el número repetido en el número mínimo de iteraciones (en el programa C)?

¿Cómo se usa la programación dinámica para resolver la pregunta Problema TRT (Trato para las vacas) en Sphere Online Judge (SPOJ)?