¡No parece demasiado emocionante! Pero, ¿cómo se ve cuando lo ejecutas?
Hay que recordar que la IA es principalmente un montón de matemáticas (especialmente cuando se habla de aprendizaje automático y aprendizaje profundo). La codificación solo hace posible que la computadora la ejecute y aprenda de los datos. ¡Creo que no se trata tanto de cómo se ve y cómo escribir el código, sino de comprender mejor lo que realmente está sucediendo en el código!
¿Cómo podemos crear algo que reconozca estos dígitos escritos a mano desde la base de datos MNIST?
- ¿Cómo pueden los robots algún día volverse verdaderamente inteligentes y comenzar a pensar por sí mismos?
- ¿Cómo puede la teoría de categorías contribuir al desarrollo de una verdadera IA?
- ¿Cuáles son los proyectos de inteligencia artificial de código abierto más prometedores?
- ¿Los enemigos en los videojuegos son realmente inteligentes, o simplemente están programados para reaccionar a los movimientos de un jugador específico?
- ¿Cuán informativo / útil es usar la extrapolación de hardware para predecir cuándo realmente surgirá un AGI?
Mira esto. Solo un código de Python, pero con muchas definiciones matemáticas. [1]
¿Emocionado?
Incluso me cuesta entenderlo yo mismo.
Entonces ¿Qué es lo que hace? ¡Muchas matemáticas!
Cada dígito escrito a mano consta de 28 × 28 píxeles, lo que da un total de 784 píxeles por cada dígito. Cada píxel se usa como entrada en algo llamado red neuronal, que usamos para entrenar la red. Se considera que cada píxel es una entrada y pasa a través de una capa oculta, que en la imagen a continuación está configurada en 15 neuronas. A partir de ahí, obtenemos la estimación de qué dígito es más probable que sea. Es decir, observamos qué dígito en la capa de salida tiene la activación más alta. Para visualizarlo, tenga este aspecto: [2]
Entonces, ¿qué sucede cuando ejecutamos el código? El tipo de red que hemos configurado se denomina red neuronal de avance, lo que significa que todos los datos van en una dirección. Usamos un algoritmo de propagación hacia atrás para calcular el error que tenemos en los datos actuales, cambiamos la configuración y corremos a través de la red neuronal una vez más.
Obtenemos esta salida:
>>> importar mnist_loader
>>> training_data, validation_data, test_data = mnist_loader.load_data_wrapper ()
>>> red de importación
>>> net = network.Network ([784, 30, 10])
>>> net.SGD (training_data, 10, 10, 0.1, test_data = test_data)
Época 0: 5105/10000
Época 1: 5887/10000
Época 2: 7147/10000
Época 3: 7566/10000
Época 4: 7763/10000
Época 5: 7869/10000
Época 6: 7948/10000
Época 7: 8019/10000
Época 8: 8073/10000
Época 9: 8111/10000
Vemos que en la primera ronda, nuestra red neuronal era capaz de clasificar correctamente el 51% de todos los dígitos, y la capacitamos para clasificar correctamente el 81% de todos los dígitos escritos a mano. Una buena mejora, ¿verdad? ¡Adivinar los dígitos al azar te dará una precisión del 10%! La precisión se puede mejorar aún más, solo requiere mucha potencia computacional. Además, los cambios en el código también pueden optimizar la velocidad de aprendizaje. Probablemente podrá obtener una tasa de error de menos del 4% con una computadora normal, mientras que los mejores resultados son con una tasa de error de menos del 1% [3]
Entonces, ¿qué hicimos aquí?
>>> net = network.Network ([784, 30, 10])
En esta línea de código le decimos a la red que hay:
- 784 neuronas de entrada
- 30 capas ocultas
- 10 neuronas de salida
En esta línea de código, usamos un método llamado descenso de gradiente estocástico para entrenar nuestra red y ‘disminuir nuestros costos’:
>>> net.SGD (training_data, 10, 10, 0.1, test_data = test_data)
- Pasamos por 10 épocas, es decir, cuántas veces corremos por la red y la mejoramos.
- Queremos tener un tamaño de mini lote de 10
- Nuestra tasa de aprendizaje es 0.1
Esto es probablemente donde se hace un poco más difícil de entender. Pero imagínese el tamaño del mini lote como el tamaño de muestra que usamos de nuestra red, mientras que la tasa de aprendizaje es qué tan rápido progresamos con nuestro aprendizaje. Entonces, ¿por qué no establecemos que nuestra tasa de aprendizaje sea muy alta? Es probable que nuestra red nunca mejore, ya que tomamos pasos demasiado grandes. Imagine que queremos tomar medidas para minimizar la posición de esta pelota:
Si damos un paso demasiado grande cada vez, acabaremos al otro lado del área y nunca bajaremos al mínimo (lo he explicado más en profundidad aquí: ¿Cuál es el significado de la tasa de aprendizaje en neural? redes? ).
Entonces, ¿cómo puedes jugar con el código AI tú mismo?
- Vaya a GitHub y descargue el código anterior: mnielsen / neural-networks-and-deep-learning
- Comience a leer sobre IA de este libro en línea gratuito: Redes neuronales y aprendizaje profundo
- Abra su terminal, escriba el código de arriba y verá que su red comienza a aprender. Pruebe diferentes configuraciones de las épocas, el tamaño del mini lote y la tasa de aprendizaje.
Esta respuesta se basa en gran medida en estas dos fuentes, y recomiendo comenzar a aprender de ella. Ambos enlaces se pueden leer y descargar de forma gratuita. Él acepta donaciones de una cantidad arbitraria, pero usted es libre de decidir usted mismo (no conozco al autor, pero aprecio mucho su material, y espero que lo haga).
Recuerde que esta es solo un área del vasto campo de la IA. Existen muchos enfoques que intentan reconocer estos dígitos. ¡Acabo de usar uno! Además, como probablemente ya sepa, la IA no se trata solo de reconocer dígitos escritos a mano, sino que también se puede aplicar en muchas otras áreas.
Otros recursos de aprendizaje:
- Machine Learning por Andrew Ng: Machine Learning | Coursera
Definitivamente parece difícil, pero con las habilidades básicas de matemáticas y programación (o la voluntad de aprenderlas) ¡usted y su red neuronal aprenderán rápidamente!
Notas al pie
[1] mnielsen / neural-networks-and-deep-learning
[2] Redes neuronales y aprendizaje profundo
[3] Base de datos de dígitos manuscritos MNIST, Yann LeCun, Corinna Cortes y Chris Burges