Capítulo 1. Tu viaje al aprendizaje profundo

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Hola, y gracias por dejarnos acompañarte en tu viaje por el aprendizaje profundo, ¡por muy avanzado que estés! En este capítulo, te contaremos un poco más sobre lo que puedes esperar de este libro, introduciremos los conceptos clave del aprendizaje profundo y entrenaremos nuestros primeros modelos en diferentes tareas. No importa si no tienes una formación técnica o matemática (¡aunque tampoco pasa nada si la tienes!); hemos escrito este libro para que el aprendizaje profundo sea accesible al mayor número de personas posible.

El aprendizaje profundo es para todos

Mucha gente asume que necesitas todo tipo de cosas difíciles de encontrar para obtener grandes resultados con el aprendizaje profundo, pero como verás en este libro, esa gente está equivocada. La Tabla 1-1 enumera algunas cosas que no necesitas en absoluto para un aprendizaje profundo de primera clase.

Tabla 1-1. Lo que no necesitas para el aprendizaje profundo
Mito (no lo necesito) Verdad

Muchas matemáticas

Las matemáticas de bachillerato son suficientes.

Muchos datos

Hemos visto resultados récord con <50 datos.

Muchos ordenadores caros

Puedes conseguir gratis lo que necesitas para el trabajo de vanguardia.

El aprendizaje profundo es una técnica informática para extraer y transformar datos -con casos de uso que van desde el reconocimiento del habla humana a la clasificación de imágenes de animales- utilizando múltiples capas de redes neuronales . Cada una de estas capas toma sus entradas de las capas anteriores y las refina progresivamente. Las capas se entrenan mediante algoritmos que minimizan sus errores y mejoran su precisión. De este modo, la red aprende a realizar una tarea determinada. Hablaremos en detalle de los algoritmos de entrenamiento en la siguiente sección.

El aprendizaje profundo tiene potencia, flexibilidad y simplicidad. Por eso creemos que debe aplicarse en muchas disciplinas. Entre ellas, las ciencias sociales y físicas, las artes, la medicina, las finanzas, la investigación científica y muchas más. Por poner un ejemplo personal, a pesar de no tener formación en medicina, Jeremy creó Enlitic, una empresa que utiliza algoritmos de aprendizaje profundo para diagnosticar enfermedades y dolencias. A los pocos meses de crear la empresa, se anunció que su algoritmo podía identificar tumores malignoscon más precisión que los radiólogos.

He aquí una lista de algunas de las miles de tareas en diferentes áreas para las que el aprendizaje profundo, o los métodos que utilizan intensamente el aprendizaje profundo, son ahora los mejores del mundo:

Procesamiento del lenguaje natural (PLN)

Responder preguntas; reconocimiento de voz; resumir documentos; clasificar documentos; encontrar nombres, fechas, etc. en documentos; buscar artículos que mencionen un concepto

Visión por ordenador

Interpretación de imágenes de satélites y drones (por ejemplo, para la resiliencia ante catástrofes), reconocimiento facial, subtitulado de imágenes, lectura de señales de tráfico, localización de peatones y vehículos en vehículos autónomos

Medicina

Detección de anomalías en imágenes radiológicas, como TAC, RMN y radiografías; recuento de rasgos en preparaciones patológicas; medición de rasgos en ecografías; diagnóstico de la retinopatía diabética.

Biología

Plegado de proteínas; clasificación de proteínas; muchas tareas genómicas, como la secuenciación de tumores-normales y la clasificación de mutaciones genéticas clínicamente procesables; clasificación de células; análisis de interacciones proteína-proteína.

Generación de imágenes

Colorear imágenes, aumentar la resolución de las imágenes, eliminar el ruido de las imágenes, convertir imágenes en arte al estilo de artistas famosos

Sistemas de recomendación

Búsqueda web, recomendaciones de productos, diseño de la página de inicio

Jugar a juegos

Ajedrez, Go, la mayoría de los videojuegos de Atari y muchos juegos de estrategia en tiempo real

Robótica

Manipular objetos difíciles de localizar (por ejemplo, transparentes, brillantes, sin textura) o difíciles de coger

Otras aplicaciones

Previsión financiera y logística, texto a voz, y mucho, mucho más...

Lo notable es que el aprendizaje profundo tiene aplicaciones tan variadas, y sin embargo casi todo el aprendizaje profundo se basa en un único tipo innovador de modelo: la red neuronal.

Pero las redes neuronales no son, de hecho, completamente nuevas. Para tener una perspectiva más amplia del campo, merece la pena empezar con un poco de historia.

Redes neuronales: Breve historia

En 1943, Warren McCulloch, neurofisiólogo, y Walter Pitts, lógico, se asociaron para desarrollar un modelo matemático de neurona artificial. En su artículo "Un cálculo lógico de las ideas inmanentes a la actividad nerviosa", declararon lo siguiente:

Debido al carácter de "todo o nada" de la actividad nerviosa, los sucesos neuronales y las relaciones entre ellos pueden tratarse mediante la lógica proposicional. Se ha descubierto que el comportamiento de toda red puede describirse en estos términos.

McCulloch y Pitts se dieron cuenta de que se podía representar un modelo simplificado de una neurona real mediante una simple suma y umbralización, como se muestra enla Figura 1-1. Pitts era autodidacta, y a los 12 años ya había recibido una oferta para estudiar en la Universidad de Cambridge con el gran Bertrand Russell. No aceptó esta invitación y, de hecho, a lo largo de su vida no aceptó ninguna oferta de títulos superiores o puestos de autoridad. La mayor parte de su famosa obra la realizó mientras no tenía hogar. A pesar de su falta de un cargo oficialmente reconocido y de su creciente aislamiento social, su trabajo con McCulloch tuvo influencia y fue retomado por un psicólogo de llamado Frank Rosenblatt.

Natural and artificial neurons
Figura 1-1. Neuronas naturales y artificiales

Rosenblatt siguió desarrollando la neurona artificial para dotarla de capacidad de aprendizaje. Y lo que es más importante, trabajó en la construcción del primer dispositivo que utilizó estos principios, el Perceptrón Mark I de . En "El diseño de un autómata inteligente",Rosenblatt escribió sobre este trabajo: "Estamos a punto de presenciar el nacimiento de una máquina así: una máquina capaz de percibir, reconocer e identificar su entorno sin ningún tipo de entrenamiento o control humano". El perceptrón se construyó y fue capaz de reconocer con éxito formas sencillas.

Un profesor del MIT llamado Marvin Minsky (¡que estaba un curso por detrás de Rosenblatt en el mismo instituto!), junto con Seymour Papert, escribió un libro tituladoPerceptrons (MIT Press) sobre la invención de Rosenblatt. Demostraron que una sola capa de estos dispositivos era incapaz de aprender algunas funciones matemáticas sencillas pero críticas (como XOR). En el mismo libro, también demostraron que el uso de múltiples capas de los dispositivos permitiría abordar estas limitaciones. Por desgracia, sólo se reconoció ampliamente la primera de estas ideas. Como resultado, la comunidad académica mundial abandonó casi por completo las redes neuronales durante las dos décadas siguientes.

Quizá el trabajo más fundamental en redes neuronales de los últimos 50 años fue el multivolumen Parallel Distributed Processing (PDP) de David Rumelhart, James McClelland y el PDP Research Group, publicado en 1986 por MIT Press. El Capítulo 1 expone una esperanza similar a la mostrada por Rosenblatt:

Las personas son más inteligentes que los ordenadores actuales porque el cerebro emplea una arquitectura computacional básica que es más adecuada para tratar un aspecto central de las tareas de procesamiento natural de la información en las que las personas son tan buenas....Introduciremos un marco computacional para modelar los procesos cognitivos que parece... más cercano que otros marcos al estilo de computación tal y como podría hacerlo el cerebro.

La premisa que utiliza aquí la PDP es que los programas informáticos tradicionales funcionan de forma muy diferente a los cerebros, y que ése podría ser el motivo por el que los programas informáticos habían sido (en ese momento) tan malos haciendo cosas que a los cerebros les resultan fáciles (como reconocer objetos en imágenes). Los autores afirmaban que el enfoque PDP estaba "más cerca que otros marcos" de cómo funciona el cerebro y, por tanto, podría ser más capaz de manejar este tipo de tareas.

De hecho, el planteamiento expuesto en PDP es muy similar al utilizado en las redes neuronales actuales. El libro definía el procesamiento distribuido paralelo como algo que requiere lo siguiente:

  • Un conjunto de unidades de proceso

  • Un estado de activación

  • Una función de salida para cada unidad

  • Un patrón de conectividad entre unidades

  • Una regla de propag ación para propagar patrones de actividades a través de la red de conectividades

  • Unaregla de activación para combinar las entradas que inciden en una unidad con el estado actual de esa unidad para producir una salida para la unidad

  • Unaregla de aprendizaje por la que los patrones de conectividad se modifican por la experiencia

  • Un entorno en el que debe funcionar el sistema

En este libro veremos que las redes neuronales modernas cumplen cada uno de estosrequisitos.

En los años 80, la mayoría de los modelos se construían con una segunda capa de neuronas, evitando así el problema que habían identificado Minsky y Papert (se trataba de su "patrón de conectividad entre unidades", por utilizar el marco anterior). Y, de hecho, las redes neuronales se utilizaron ampliamente durante los años 80 y 90 para proyectos reales y prácticos. Sin embargo, de nuevo un malentendido de las cuestiones teóricas frenó el campo. En teoría, bastaba con añadir una capa más de neuronas para poder aproximar cualquier función matemática con estas redes neuronales, pero en la práctica dichas redes eran a menudo demasiado grandes y lentas para ser útiles.

Aunque los investigadores demostraron hace 30 años que para obtener un rendimiento práctico y bueno es necesario utilizar aún más capas de neuronas, sólo en la última década se ha apreciado y aplicado más ampliamente este principio. Las redes neuronales están ahora por fin a la altura de su potencial, gracias al uso de más capas, unido a la capacidad de hacerlo por las mejoras en el hardware informático, el aumento de la disponibilidad de datos y los ajustes algorítmicos que permiten entrenar las redes neuronales más rápida y fácilmente. Ahora tenemos lo que Rosenblatt prometió "una máquina capaz de percibir, reconocer e identificar su entorno sin ningún tipo de entrenamiento o control humano".

Esto es lo que aprenderás a construir en este libro. Pero antes, ya que vamos a pasar mucho tiempo juntos, vamos a conocernos un poco...

Quiénes somos

Somos Sylvain y Jeremy, tus guías en este viaje. Esperamos que nos encuentres adecuados para este puesto.

Jeremy lleva unos 30 años utilizando y enseñando aprendizaje automático, y empezó a utilizar redes neuronales hace 25 años. Durante este tiempo, ha dirigido muchas empresas y proyectos cuyo núcleo es el aprendizaje automático, incluida la fundación de la primera empresa centrada en el aprendizaje profundo y la medicina, Enlitic, y ha asumido el papel de presidente y científico jefe de la mayor comunidad de aprendizaje automático del mundo, Kaggle. Es cofundador, junto con la Dra. Rachel Thomas, de fast.ai, la organización que creó el curso en el que se basa este libro.

De vez en cuando, oirás directamente de nosotros en barras laterales, como ésta de Jeremy:

Jeremy dice

Hola a todos; ¡soy Jeremy! Quizá os interese saber que no tengo ninguna educación técnica formal. Terminé una licenciatura con especialidad en Filosofía, y no obtuve grandes calificaciones. Me interesaba mucho más hacer proyectos reales que estudios teóricos, así que trabajé a tiempo completo en una empresa de consultoría de gestión llamada McKinsey and Company durante mis años universitarios. Si eres de los que prefieren ensuciarse las manos construyendo cosas que pasarse años aprendiendo conceptos abstractos, ¡entenderás de dónde vengo! Busca barras laterales mías para encontrar información más adecuada para personas con una formación técnica menos matemática o formal, es decir, personas como yo...

Sylvain, en cambio, sabe mucho de educación técnica formal. Ha escrito 10 libros de texto de matemáticas, ¡que cubren todo el plan de estudios francés avanzado de matemáticas!

Sylvain Dice

A diferencia de Jeremy, yo no llevo muchos años codificando y aplicando algoritmos de aprendizaje automático. Más bien, he llegado recientemente al mundo del aprendizaje automático viendo los vídeos del curso fast.ai de Jeremy. Así que, si eres alguien que no ha abierto un terminal y escrito comandos en la línea de comandos, ¡entenderás de dónde vengo! Busca barras laterales mías para encontrar la información más adecuada para personas con una formación técnica más matemática o formal, pero con menos experiencia de codificación en el mundo real, es decir, personas como yo...

El curso de fast.ai ha sido estudiado por cientos de miles de estudiantes, de todas las profesiones y condiciones sociales, de todas las partes del mundo. Sylvain destacó como el alumno más impresionante del curso que Jeremy había visto nunca, lo que le llevó a unirse a fast.ai y a convertirse en coautor, junto con Jeremy, de la biblioteca de software fastai.

Todo esto significa que, entre nosotros, tienes lo mejor de ambos mundos: las personas que saben más que nadie sobre el software, porque lo escribieron; un experto en matemáticas y un experto en codificación y aprendizaje automático; y también personas que entienden tanto lo que se siente al ser un relativo extraño en matemáticas, como un relativo extraño en codificación y aprendizaje automático.

Cualquiera que haya visto deportes sabe que si tienes un equipo de comentaristas de dos personas, también necesitas una tercera persona que haga "comentarios especiales". Nuestrocomentarista especial es Alexis Gallagher. Alexis tiene una formación muy diversa: ha sido investigador en biología matemática, guionista, actor de improvisación, consultor de McKinsey (¡como Jeremy!), programador de Swift y director de tecnología.

Alexis dice

He decidido que ya es hora de que aprenda sobre esto de la IA. Al fin y al cabo, he probado casi todo lo demás..... Pero en realidad no tengo experiencia en la creación de modelos de aprendizaje automático. Aun así... ¿tan difícil puede ser? Voy a ir aprendiendo a lo largo de este libro, igual que tú. Busca en mis barras laterales consejos de aprendizaje que me resultaron útiles en mi viaje, y que espero que tú también encuentres útiles.

Cómo aprender aprendizaje profundo

El profesor de Harvard David Perkins, autor de Making Learning Whole (Jossey-Bass), tiene mucho que decir sobre la enseñanza. La idea básica es enseñar el juego completo. Eso significa que si enseñas béisbol, primero llevas a la gente a un partido de béisbol o haces que lo jueguen. No les enseñas a enrollar hilo para hacer una pelota de béisbol desde cero, ni la física de una parábola, ni el coeficiente de fricción de una pelota sobre un bate.

Paul Lockhart, doctor en matemáticas por Columbia, antiguo profesor de Brown y profesor de matemáticas de primaria y secundaria, imagina en el influyente ensayo de "A Mathematician's Lament" (El lamento de un matemático)un mundo de pesadilla en el que la música y el arte se enseñan como se enseñan las matemáticas. A los niños no se les permite escuchar ni tocar música hasta que hayan pasado más de una década dominando la notación y la teoría musicales, pasando las clases transponiendo partituras a una tonalidad diferente. En clase de arte, los alumnos estudian los colores y los aplicadores, pero no se les permite pintar de verdad hasta la universidad. ¿Te parece absurdo? Así es como se enseñan las matemáticas: exigimos a los alumnos que pasen años memorizando y aprendiendo fundamentosáridos e inconexos que, según afirmamos, darán sus frutos más adelante, mucho después de que la mayoría de ellos hayan abandonado la asignatura.

Por desgracia, aquí es donde empiezan muchos recursos didácticos sobre aprendizaje profundo: pidiendo a los alumnos que sigan la definición del hessiano y los teoremas para la aproximación de Taylor de tus funciones de pérdida, sin dar nunca ejemplos de código de trabajo real. No estamos criticando el cálculo. Nos encanta el cálculo, y Sylvain incluso lo ha enseñado en la universidad, ¡pero no creemos que sea el mejor lugar para empezar a aprender el aprendizaje profundo!

En el aprendizaje profundo, realmente ayuda si tienes la motivación de arreglar tu modelo para conseguir que lo haga mejor. Es entonces cuando empiezas a aprender la teoría pertinente. Pero en primer lugar necesitas tener el modelo. Enseñamos casi todo mediante ejemplos reales. A medida que construyamos esos ejemplos, profundizaremos más y más, y te mostraremos cómo hacer que tus proyectos sean cada vez mejores. Esto significa que irás aprendiendo poco a poco todos los fundamentos teóricos que necesitas, en contexto, de forma que veas por qué importa y cómo funciona.

Éste es nuestro compromiso contigo. A lo largo de este libro, seguimos estos principios:

Enseñar todo el juego

Empezaremos mostrándote cómo utilizar una red de aprendizaje profundo completa, funcional, utilizable y de última generación para resolver problemas del mundo real utilizando herramientas sencillas y expresivas. Y luego profundizaremos gradualmente en la comprensión de cómo se fabrican esas herramientas, y cómo se fabrican las herramientas que fabrican esas herramientas, y así sucesivamente...

Enseñar siempre con ejemplos

Nos aseguraremos de que haya un contexto y una finalidad que puedas comprender intuitivamente, en lugar de empezar con la manipulación de símbolos algebraicos.

Simplificar al máximo

Llevamos años creando herramientas y métodos de enseñanza que hacen sencillos temas que antes eran complejos.

Eliminar barreras

El aprendizaje profundo ha sido, hasta ahora, un juego exclusivo. Estamos abriéndolo y asegurándonos de que todo el mundo pueda jugar.

La parte más difícil del aprendizaje profundo es la artesanal: ¿cómo sabes si tienes suficientes datos, si están en el formato adecuado, si tu modelo se está entrenando correctamente y, si no es así, qué debes hacer al respecto? Por eso creemos en el aprendizaje práctico. Al igual que con las habilidades básicas de la ciencia de datos, con el aprendizaje profundo sólo se mejora a través de la experiencia práctica. Dedicar demasiado tiempo a la teoría puede ser contraproducente. La clave es simplemente codificar e intentar resolver problemas: la teoría puede venir después, cuando tengas contexto y motivación.

Habrá momentos en los que el viaje te parezca duro. Momentos en los que te sientas atascado. No te rindas. Rebobina el libro para encontrar la última parte en la que no te quedaste atascado, y luego lee despacio a partir de ahí para encontrar la primera cosa que no esté clara. A continuación, intenta hacer algunos experimentos con el código y busca en Google más tutoriales sobre el tema en el que estés atascado: a menudo encontrarás un punto de vista diferente sobre el material que puede ayudarte a entenderlo. Además, es normal y esperable no entenderlo todo (especialmente el código) en la primera lectura. Intentar comprender el material en serie antes de continuar a veces puede ser difícil. A veces las cosas encajan en su sitio cuando obtienes más contexto de las partes posteriores, cuando tienes una visión más amplia. Así que si te quedas atascado en una sección, intenta seguir adelante de todos modos y anota que volverás a ella más tarde.

Recuerda que no necesitas una formación académica concreta para tener éxito en el aprendizaje profundo. Muchos avances importantes en la investigación y la industria han sido realizados por personas sin un doctorado, como el artículo"Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks" (Aprendizaje de representación no supervisado con redes convolucionales profundas generativas adversariales) -unode los artículos más influyentes de la última década, con más de 5.000 citas- que fueescrito por Alec Radford cuando era estudiante. Incluso en Tesla, donde están intentando resolver el dificilísimo reto de fabricar un coche autoconducido,el director ejecutivoElon Musk dice:

Definitivamente, no se requiere un doctorado. Lo único que importa es una comprensión profunda de la IA y la capacidad de implementar las NN de forma que sean realmente útiles (esto último es lo verdaderamente difícil). No importa si has terminado el bachillerato.

Sin embargo, lo que tendrás que hacer para tener éxito es aplicar lo que aprendas en este libro a un proyecto personal, y perseverar siempre.

Tus proyectos y tu mentalidad

Tanto si te entusiasma identificar si las plantas están enfermas a partir de fotos de sus hojas, autogenerar patrones de punto, diagnosticar tuberculosis a partir de radiografías, o determinar cuándo un mapache está usando la puerta de tu gato, haremos que utilices el aprendizaje profundo en tus propios problemas (a través de modelos preentrenados de otros) lo más rápidamente posible, y luego profundizaremos progresivamente en más detalles. Aprenderás a utilizar el aprendizaje profundo para resolver tus propios problemas con la máxima precisión en los primeros 30 minutos del siguiente capítulo. (Y no dudes en saltar directamente allí ahora si te mueres de ganas de ponerte a codificar de inmediato). Hay un mito pernicioso por ahí que dice que necesitas tener recursos informáticos y conjuntos de datos del tamaño de los de Google para poder hacer aprendizaje profundo, pero no es cierto.

Entonces, ¿qué tipo de tareas constituyen buenos casos de prueba? Podrías entrenar a tu modelo para que distinga entre los cuadros de Picasso y los de Monet, o para que elija fotos de tu hija en lugar de fotos de tu hijo. Es útil centrarte en tus aficiones y pasiones: proponerte cuatro o cinco pequeños proyectos en lugar de esforzarte por resolver un gran problema tiende a funcionar mejor cuando estás empezando. Como es fácil estancarse, intentar ser demasiado ambicioso demasiado pronto suele ser contraproducente. Luego, una vez que domines lo básico, ¡proponte completar algo de lo que te sientas realmente orgulloso!

Jeremy dice

El aprendizaje profundo puede ponerse a trabajar en casi cualquier problema. Por ejemplo, mi primera startup fue una empresa llamada FastMail, que ofrecía servicios mejorados de correo electrónico cuando se lanzó en 1999 (y sigue haciéndolo hoy en día). En 2002, la configuré para utilizar una forma primitiva de aprendizaje profundo, las redes neuronales de una sola capa, para ayudar a categorizar los correos electrónicos y evitar que los clientes recibieran spam.

Entre los rasgos de carácter más comunes en las personas a las que les va bien en el aprendizaje profundo se encuentran la diversión y la curiosidad. El difunto físico Richard Feynman es un ejemplo de alguien de quien esperaríamos que fuera bueno en el aprendizaje profundo: su desarrollo de la comprensión del movimiento de las partículas subatómicas surgió de su diversión al ver cómo se tambalean las placas cuando giran en el aire.

Centrémonos ahora en lo que aprenderás, empezando por el software.

El software: PyTorch, fastai y Jupyter (y por qué no importa)

Hemos realizado cientos de proyectos de aprendizaje automático utilizando docenas de paquetes y muchos lenguajes de programación. En fast.ai, hemos escrito cursos utilizando la mayoría de los principales paquetes de aprendizaje profundo y aprendizaje automático que se utilizan hoy en día. Tras la aparición de PyTorch en 2017, pasamos más de mil horas probándolo antes de decidir que lo utilizaríamos para futuros cursos, desarrollo de software e investigación. Desde entonces, PyTorch se ha convertido en la biblioteca de aprendizaje profundo de más rápido crecimiento del mundo y ya se utiliza en la mayoría de los trabajos de investigación de las principales conferencias. Esto suele ser un indicador adelantado del uso en la industria, porque son los artículos que acaban utilizándose en productos y servicios comerciales. Hemos descubierto que PyTorch es la biblioteca más flexible y expresiva para el aprendizaje profundo. No sacrifica velocidad por simplicidad, sino que proporciona ambas.

PyTorch funciona mejor como una biblioteca base de bajo nivel, que proporciona las operaciones básicas para una funcionalidad de nivel superior. La biblioteca fastai es la más popular para añadir esta funcionalidad de alto nivel sobre PyTorch. También es particularmente adecuada para los objetivos de este libro, porque es única en proporcionar una arquitectura de software profundamente estratificada (incluso hay unartículo académico revisado por pares sobre esta API estratificada). En este libro, a medida que profundicemos más y más en los fundamentos del aprendizaje profundo, también profundizaremos más y más en las capas de fastai. Este libro cubre versión 2 de la biblioteca fastai, que es una reescritura desde cero que proporciona muchas características únicas.

Sin embargo, en realidad no importa qué software aprendas, porque sólo se tarda unos días en aprender a cambiar de una biblioteca a otra. Lo que realmente importa es aprender adecuadamente los fundamentos y las técnicas del aprendizaje profundo. Nos centraremos en utilizar código que, con la mayor claridad posible, exprese los conceptos que necesitas aprender. Cuando enseñemos conceptos de alto nivel, utilizaremos código fastai de alto nivel. Cuando enseñemos conceptos de bajo nivel, utilizaremos código PyTorch de bajo nivel o incluso código Python puro.

Aunque hoy en día pueda parecer que las nuevas bibliotecas de aprendizaje profundo aparecen a un ritmo vertiginoso, debes estar preparado para un ritmo de cambio mucho más rápido en los próximos meses y años. A medida que más personas entren en este campo, aportarán más habilidades e ideas, y probarán más cosas. Debes asumir que las bibliotecas y el software específicos que aprendas hoy quedarán obsoletos en uno o dos años. Piensa en la cantidad de cambios en bibliotecas y pilas tecnológicas que se producen continuamente en el mundo de la programación web, un área mucho más madura y de crecimiento más lento queel aprendizaje profundo. Creemos firmemente que el aprendizaje debe centrarse en la comprensión de las técnicas subyacentes y en cómo aplicarlas en la práctica, y en cómo adquirir rápidamente experiencia en nuevas herramientas y técnicas a medida que se van lanzando.

Al final del libro, entenderás casi todo el código que hay dentro de fastai (y gran parte de PyTorch también), porque en cada capítulo profundizaremos un poco más para mostrarte exactamente lo que ocurre mientras construimos y entrenamos nuestros modelos. Esto significa que habrás aprendido las buenas prácticas más importantes utilizadas en el aprendizaje profundo moderno, no sólo cómo utilizarlas, sino cómo funcionan y se implementan realmente. Si quieres utilizar esos enfoques en otro marco, tendrás los conocimientos necesarios para hacerlo en caso necesario.

Dado que lo más importante para aprender aprendizaje profundo es escribir código y experimentar, es importante que dispongas de una gran plataforma para experimentar con código. La plataforma de experimentación de programación más popular se llama Jupyter. Es lo que utilizaremos a lo largo de este libro. Te mostraremos cómo puedes utilizar Jupyter para entrenar y experimentar con modelos e introspeccionar cada etapa de la tubería de preprocesamiento de datos y desarrollo de modelos. Jupyter es la herramienta más popular para hacer ciencia de datos en Python, por una buena razón. Es potente, flexible y fácil de usar. Creemos que te encantará.

Veámoslo en la práctica y entrenemos nuestro primer modelo.

Tu primer modelo

Como hemos dicho antes, te enseñaremos cómo hacer las cosas antes de explicarte por qué funcionan. Siguiendo este enfoque descendente, empezaremos entrenando realmente un clasificador de imágenes para reconocer perros y gatos con una precisión de casi el 100%. Para entrenar este modelo y realizar nuestros experimentos, tendrás que hacer algunos ajustes iniciales. No te preocupes; no es tan difícil como parece.

Sylvain Dice

No te saltes la parte de configuración aunque parezca intimidante al principio, especialmente si tienes poca o ninguna experiencia utilizando cosas como un terminal o la línea de comandos. La mayor parte de eso no es necesario, y comprobarás que los servidores más sencillos pueden configurarse simplemente con tu navegador web habitual. Es crucial que realices tus propios experimentos paralelamente a este libro para aprender.

Cómo conseguir un servidor GPU de aprendizaje profundo

Para hacer casi todo lo que se explica en este libro, necesitarás tener acceso a un ordenador con una GPUNVIDIA (por desgracia, las principales bibliotecas de aprendizaje profundo no admiten otras marcas de GPU). Sin embargo, no te recomendamos que compres una; de hecho, aunque ya tengas una, ¡no te sugerimos que la utilices todavía! Configurar un ordenador requiere tiempo y energía, y tú quieres concentrar toda tu energía en el aprendizaje profundo en este momento. Por tanto, te sugerimos que alquiles un ordenador que ya tenga todo lo que necesitas preinstalado y listo para funcionar. Los costes pueden ser de tan sólo 0,25 $ por hora mientras lo utilizas, y algunas opciones son incluso gratuitas.

Jerga: Unidad de procesamiento gráfico (GPU)

También conocida como tarjeta gráfica. Un tipo especial de procesador en tu ordenador que puede manejar miles de tareas individuales al mismo tiempo, especialmente diseñado para mostrar entornos 3D en un ordenador para jugar. Estas mismas tareas básicas son muy similares a lo que hacen las redes neuronales, de modo que las GPU pueden ejecutar redes neuronales cientos de veces más rápido que las CPU normales. Todos los ordenadores modernos contienen una GPU, pero pocos contienen el tipo adecuado de GPU necesario para el aprendizaje profundo.

La mejor elección de servidores GPU para utilizar con este libro cambiará con el tiempo, a medida que las empresas vayan y vengan y los precios cambien. Mantenemos una lista de nuestras opciones recomendadas en el sitio web del libro, así que ve allí ahora y sigue las instrucciones para conectarte a un servidor GPU de aprendizaje profundo. No te preocupes; sólo se tarda unos dos minutos en configurarse en la mayoría de las plataformas, y muchas ni siquiera requieren ningún pago o incluso una tarjeta de crédito para empezar.

Alexis dice

Mis dos centavos: ¡haz caso de este consejo! Si te gustan los ordenadores, tendrás la tentación de montar tu propia caja. ¡Cuidado! Es factible, pero sorprendentemente complicado y molesto. Hay una buena razón por la que este libro no se titula Todo lo que siempre quisiste saber sobre la administración del sistema Ubuntu, la instalación de controladores NVIDIA, apt-get, conda, pip y la configuración de Jupyter Notebook. Eso sería un libro propio. Habiendo diseñado e implementado nuestra infraestructura de aprendizaje automático de producción en el trabajo, puedo atestiguar que tiene sus satisfacciones, pero está tan poco relacionada con el modelado como el mantenimiento de un avión lo está con el vuelo de uno.

Cada opción mostrada en el sitio web incluye un tutorial; tras completar el tutorial, acabarás con una pantalla parecida ala Figura 1-2.

Initial view of Jupyter Notebook
Figura 1-2. Vista inicial de Jupyter Notebook

¡Ya estás listo para ejecutar tu primer cuaderno Jupyter!

Jerga: Jupyter Notebook

Un software que te permite incluir texto formateado, código, imágenes, vídeos y mucho más, todo dentro de un único documento interactivo. Jupyter recibió el máximo galardón para software, el ACM Software System Award, gracias a su amplio uso y enorme impacto en muchos campos académicos y en la industria. Jupyter Notebook es el software más utilizado por los científicos de datos para desarrollar modelos de aprendizaje profundo e interactuar con ellos.

Ejecutar tu primer cuaderno

Los cuadernos están numerados por capítulos en el mismo orden en que se presentan en este libro. Así pues, el primer cuaderno que verás enumerado es el cuaderno que tienes que utilizar ahora. Utilizarás este cuaderno para entrenar un modelo capaz de reconocer fotos de perros y gatos. Para ello,descargarás un conjunto de datos de fotos de perros y gatos, y lo utilizarás para entrenarun modelo.

Un conjunto de datos es simplemente un montón de datos: pueden ser imágenes, correos electrónicos, indicadores financieros, sonidos o cualquier otra cosa. Hay muchos conjuntos de datos disponibles gratuitamente que son adecuados para entrenar modelos. Muchos de estos conjuntos de datos son creados por académicos para ayudar a avanzar en la investigación, muchos están disponibles para concursos (¡hay competiciones en las que los científicos de datos pueden competir para ver quién tiene el modelo más preciso!

Cuadernos llenos y despojados

Hay dos versiones de los cuadernos. La raíz del repo contiene los cuadernos exactos utilizados para crear el libro que estás leyendo ahora, con toda la prosa y las salidas. La carpeta limpia tiene los mismos encabezados y celdas de código, pero se han eliminado todas las salidas y la prosa. Después de leer una sección del libro, te recomendamos que trabajes con los cuadernos limpios, con el libro cerrado, y veas si puedes averiguar qué mostrará cada celda antes de ejecutarla. Intenta también recordar qué está demostrando el código.

Para abrir un bloc de notas, simplemente haz clic en él. Se abrirá el cuaderno, y tendrá un aspecto parecido al de la Figura 1-3 (ten en cuenta que puede haber ligeras diferencias en los detalles según las distintas plataformas; puedes ignorar esas diferencias).

An example of notebook
Figura 1-3. Un cuaderno Jupyter

Un cuaderno está formado por células. Hay dos tipos principales de células :

  • Celdas que contienen texto formateado, imágenes, etc. Éstas utilizan un formato llamado Markdown, sobre el que aprenderás pronto.

  • Las celdas contienen código que puede ejecutarse, y las salidas apareceráninmediatamente debajo (que pueden ser texto sin formato, tablas, imágenes, animaciones, sonidos o incluso aplicaciones interactivas).

Los cuadernos Jupyter pueden estar en uno de estos dos modos: modo edición o modo comando. En el modo de edición, escribiendo en tu teclado introduces las letras en la celda de la forma habitual. Sin embargo, en el modo comando, no verás ningún cursor parpadeante, y cada tecla de tu teclado tendrá una función especial.

Antes de continuar, pulsa la tecla Escape de tu teclado para cambiar al modo comando (si ya estás en modo comando, esto no hace nada, así que púlsala ahora por si acaso). Para ver una lista completa de todas las funciones disponibles, pulsa H; pulsa Escape para eliminar esta pantalla de ayuda. Observa que en el modo comando, a diferencia de lo que ocurre en la mayoría de los programas, los comandos no requieren que mantengas pulsada la tecla Control, Alt o similares; basta con que pulses la tecla de la letra deseada.

Puedes hacer una copia de una celda pulsando C (primero hay que seleccionar la celda, lo que se indica con un contorno a su alrededor; si aún no está seleccionada, haz clic en ella una vez). Luego pulsa V para pegar una copia de la misma.

Haz clic en la celda que comienza con la línea "# CLICK ME" para seleccionarla. El primer carácter de esa líneaindica que lo que sigue es un comentario en Python, por lo que se ignora al ejecutar la celda. El resto de la celda es, lo creas o no, un sistema completo para crear y entrenar un modelo de última generación para reconocer gatos frente a perros. Así que, ¡vamos a entrenarlo ahora! Para ello, pulsa Mayúsculas-Enter en tu teclado, o haz clic en el botón Reproducir de la barra de herramientas. Luego espera unos minutos mientras ocurren las siguientes cosas:

  1. Un conjunto de datos llamadoOxford-IIIT Pet Dataset que contiene 7.349 imágenes de perros y gatos de 37 razas se descargará de la colección de conjuntos de datos de fast.ai al servidor de la GPU que estés utilizando, y luego se extraerá.

  2. Se descargará de Internet un modelo preentrenado que ya ha sido entrenado en 1,3 millones de imágenes utilizando un modelo ganador de un concurso.

  3. El modelo preentrenado se afinará utilizando los últimos avances de en aprendizaje por transferencia para crear un modelo especialmente personalizado para reconocer perros y gatos.

Los dos primeros pasos sólo deben ejecutarse una vez en tu servidor GPU. Si vuelves a ejecutar la celda, utilizará el conjunto de datos y el modelo que ya se han descargado, en lugar de descargarlos de nuevo. Veamos el contenido de la celda y los resultados(Tabla 1-2):

# CLICK ME
from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'

def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)
Tabla 1-2. Resultados del primer entrenamiento
época tren_pérdida pérdida_válida tasa_error tiempo
0 0.169390 0.021388 0.005413 00:14
época tren_pérdida pérdida_válida tasa_error tiempo
0 0.058748 0.009240 0.002706 00:19

Es probable que no veas exactamente los mismos resultados que se muestran aquí, ya que en el entrenamiento de los modelos intervienen muchas fuentes de pequeñas variaciones aleatorias. Sin embargo, en este ejemplo vemos generalmente una tasa de error bastante inferior a 0,02.

Tiempo de formación

Dependiendo de la velocidad de tu red, la descarga del modelo preentrenado y del conjunto de datos puede tardar unos minutos. Ejecutar fine_tune puede llevar un minuto más o menos. A menudo, los modelos de este libro tardan unos minutos en entrenarse, al igual que tus propios modelos, por lo que es una buena idea idear buenas técnicas para aprovechar al máximo este tiempo. Por ejemplo, sigue leyendo la siguiente sección mientras tu modelo se entrena, o abre otro cuaderno y utilízalo para algunos experimentos de codificación.

Entonces, ¿cómo sabemos si este modelo es bueno? En la última columna de la tabla, puedes ver la tasa de error, que es la proporción de imágenes que se identificaron incorrectamente. La tasa de error es nuestra métrica, nuestra medida de la calidad del modelo, elegida para que sea intuitiva y comprensible. Como puedes ver, el modelo es casi perfecto, a pesar de que el tiempo de entrenamiento fue de sólo unos segundos (sin incluir la descarga única del conjunto de datos y del modelo preentrenado). De hecho, ¡la precisión que has conseguido ya es mucho mejor de la que nadie había conseguido hace sólo 10 años!

Por último, comprobemos que este modelo funciona realmente. Ve a buscar una foto de un perro o un gato; si no la tienes a mano, busca en Google Imágenes y descarga una imagen que encuentres allí. Ahora ejecuta la celda con uploader definido. Aparecerá un botón en el que puedes hacer clic para seleccionar la imagen que quieres clasificar:

uploader = widgets.FileUpload()
uploader
An upload button

Ahora puedes pasar el archivo cargado al modelo. Asegúrate de que es una foto clara de un perro o un gato, y no un dibujo lineal, de dibujos animados o similar. El cuaderno te dirá si cree que es un perro o un gato, y lo seguro que está. Con suerte, comprobarás que tu modelo ha hecho un gran trabajo:

img = PILImage.create(uploader.data[0])
is_cat,_,probs = learn.predict(img)
print(f"Is this a cat?: {is_cat}.")
print(f"Probability it's a cat: {probs[1].item():.6f}")
Is this a cat?: True.
Probability it's a cat: 0.999986

¡Enhorabuena por tu primer clasificador!

Pero, ¿qué significa esto? ¿Qué has hecho realmente? Para explicarlo, vamos a alejarnos de nuevo para tener una visión de conjunto.

¿Qué es el aprendizaje automático?

Tu clasificador es un modelo de aprendizaje profundo. Como ya se ha dicho, los modelos de aprendizaje profundo utilizan redes neuronales, que datan originalmente de la década de 1950 y se han hecho muy potentes en los últimos tiempos gracias a los avances recientes.

Otra pieza clave del contexto es que el aprendizaje profundo es sólo un área moderna en la disciplina más general del aprendizaje automático. Para comprender la esencia de lo que hiciste cuando entrenaste tu propio modelo de clasificación, no necesitas entender el aprendizaje profundo. Basta con ver cómo tu modelo y tu proceso de entrenamiento son ejemplos de los conceptos que se aplican al aprendizaje automático en general.

Así que en esta sección describiremos el aprendizaje automático. Exploraremos los conceptos clave y veremos cómo pueden remontarse al ensayo original que los introdujo.

El aprendizaje automático es, como la programación normal, una forma de hacer que los ordenadores realicen una tarea específica. Pero, ¿cómo utilizaríamos la programación normal para hacer lo que acabamos de hacer en la sección anterior: reconocer perros frente a gatos en las fotos? Tendríamos que escribir para el ordenador los pasos exactos necesarios para completar la tarea.

Normalmente, nos resulta bastante fácil escribir los pasos para completar una tarea cuando escribimos un programa. Simplemente pensamos en los pasos que daríamos si tuviéramos que hacer la tarea a mano, y luego los traducimos a código. Por ejemplo, podemos escribir una función que ordene una lista. En general, escribiríamos una función que se pareciera a la Figura 1-4 (donde las entradas podrían ser una lista sin ordenar y los resultados una lista ordenada).

Pipeline inputs, program, results
Figura 1-4. Un programa tradicional

Pero para reconocer objetos en una foto, eso es un poco complicado;¿cuáles son los pasos que damos cuando reconocemos un objeto en una foto? En realidad no lo sabemos, ¡ya que todo ocurre en nuestro cerebro sin que seamos conscientes de ello!

Ya en los albores de la informática, en 1949, un investigador de IBM llamadoArthur Samuel empezó a trabajar en una forma diferente de conseguir que los ordenadorescompletaran tareas, a la que llamó aprendizaje automático. En su clásico ensayo de 1962 "Inteligencia Artificial: Una frontera de la automatización", escribió

Programar un ordenador para tales cálculos es, en el mejor de los casos, una tarea difícil, no principalmente por la complejidad inherente al propio ordenador, sino más bien por la necesidad de explicar cada paso del proceso con el más exasperante detalle. Los ordenadores, como te dirá cualquier programador, son imbéciles gigantes, no cerebros gigantes.

Su idea básica era ésta: en lugar de decirle al ordenador los pasos exactosnecesarios para resolver un problema, mostrarle ejemplos del problema a resolver, y dejar que descubriera cómo resolverlo por sí mismo. Esto resultó ser muy eficaz: en 1961, su programa para jugar a las damas había aprendido tanto que ¡vencía al campeón estatal de Connecticut! He aquí cómo describió su idea (del mismo ensayo que se ha señalado anteriormente):

Supongamos que disponemos algún medio automático para comprobar la eficacia de cualquier asignación de pesos actual en términos de rendimiento real y proporcionamos un mecanismo para alterar la asignación de pesos de modo que se maximice el rendimiento. No necesitamos entrar en los detalles de tal procedimiento para ver que podría hacerse totalmente automático y ver que una máquina así programada "aprendería" de su experiencia.

Esta breve afirmación encierra una serie de poderosos conceptos:

  • La idea de una "asignación de peso"

  • El hecho de que cada asignación de peso tenga algún "rendimiento real"

  • El requisito de que haya un "medio automático" de comprobar que el rendimiento

  • La necesidad de un "mecanismo" (es decir, otro proceso automático) para mejorar el rendimiento cambiando las asignaciones de peso.

Veamos estos conceptos uno por uno, para comprender cómo encajan en la práctica. En primer lugar, tenemos que entender lo que Samuel entiende por asignación de peso.

Los pesos son sólo variables, y una asignación de peso es una elección particular de valores para esas variables. Las entradas del programa son valores que procesa para producir sus resultados; por ejemplo, tomar píxeles de la imagen como entradas y devolver la clasificación "perro" como resultado. Las asignaciones de peso del programa son otros valores que definen cómo funcionará el programa.

Como afectarán al programa, son en cierto sentido otro tipo de entrada. Actualizaremos nuestra imagen básica de la Figura 1-4y la sustituiremos por la Figura 1-5 para tener esto en cuenta.

Figura 1-5. Un programa que utiliza la asignación de pesos

Hemos cambiado el nombre de nuestra caja de programa a modelo. Esto es para seguir la terminología moderna y reflejar que el modelo es un tipo especial de programa: es uno que puede hacer muchas cosas diferentes, dependiendo de los pesos. Se puede implementar de muchas formas distintas. Por ejemplo, en el programa de damas de Samuel, diferentes valores de las ponderaciones darían lugar a diferentes estrategias de juego de damas.

(Por cierto, lo que Samuel llamaba "ponderaciones" suele denominarse actualmente parámetros del modelo, por si te has topado con ese término. El término ponderaciones se reserva para un tipo particular de parámetro del modelo).

A continuación, Samuel dijo que necesitamos un medio automático de comprobar la eficaciade cualquier asignación de pesos actual en términos de rendimiento real. En el caso de su programa de damas, el "rendimiento real" de un modelo sería lo bien que juega. Y podrías probar automáticamente el rendimiento de dos modelos poniéndolos a jugar el uno contra el otro, y viendo cuál suele ganar.

Por último, dice que necesitamos un mecanismo para alterar la asignación de pesos con el fin de maximizar el rendimiento. Por ejemplo, podríamos observar la diferencia de pesos entre el modelo ganador y el perdedor, y ajustar los pesos un poco más en la dirección ganadora.

Ahora podemos ver por qué dijo que tal procedimiento podría hacerse totalmente automático y... una máquina así programada "aprendería" de su experiencia. El aprendizaje sería totalmente automático cuando el ajuste de las ponderaciones fuera también automático: cuando, en lugar de mejorar nosotros un modelo ajustando manualmente sus ponderaciones, confiáramos en un mecanismo automatizado que produjera ajustes basados en el rendimiento.

La Figura 1-6 muestra la imagen completa de la idea de Samuel de entrenar un modelo de aprendizaje automático.

The basic training loop
Figura 1-6. Entrenamiento de un modelo de aprendizaje automático

Fíjate en la distinción entre los resultados del modelo (por ejemplo, las jugadas en una partida de damas) y su rendimiento (por ejemplo, si gana la partida o lo rápido que la gana).

Ten en cuenta también que, una vez que el modelo está entrenado -es decir, una vez que hemos elegido nuestra asignación de pesos final, mejor y favorita-, podemos pensar que los pesos forman parte del modelo, puesto que ya no los estamos variando.

Por lo tanto, utilizar realmente un modelo después de haberlo entrenado se parece a la Figura 1-7.

Figura 1-7. Utilizar un modelo entrenado como programa

Es idéntico a nuestro diagrama original dela Figura 1-4, sólo que la palabra programa se ha sustituido pormodelo. Esta es una idea importante: un modelo entrenado puede tratarse como un programa informático normal.

Jerga: Aprendizaje automático

El entrenamiento de programas desarrollados permitiendo que un ordenador aprenda de su experiencia, en lugar de mediante la codificación manual de los pasos individuales.

¿Qué es una red neuronal?

No es muy difícil imaginar cómo podría ser el modelo para un programa de damas. Podría haber una serie de estrategias de damascodificadas, y algún tipo de mecanismo de búsqueda, y entonces los pesos podrían variar cómo se seleccionan las estrategias, en qué partes del tablero se centran durante una búsqueda, etc. Pero no es en absoluto obvio cómo sería el modelo para un programa de reconocimiento de imágenes, o para la comprensión de textos, o para muchos otros problemas interesantes que podamos imaginar.

Lo que nos gustaría es algún tipo de función que fuera tan flexible que pudiera utilizarse para resolver cualquier problema dado, simplemente variando sus pesos.¡Asombrosamente, esta función existe realmente! Es la red neuronal, de la que ya hemos hablado. Es decir, si consideras una red neuronal como una función matemática, resulta que es una función extremadamente flexible en función de sus pesos. Una demostración matemática llamada teorema de aproximación universal demuestra que esta función puede resolver cualquier problema con cualquier nivel de precisión, en teoría. El hecho de que las redes neuronales sean tan flexibles significa que, en la práctica, suelen ser un tipo de modelo adecuado, y puedes centrar tu esfuerzo en el proceso de entrenarlas, es decir, de encontrar buenas asignaciones de pesos.

Pero, ¿qué pasa con ese proceso? Se podría imaginar que tendrías que encontrar un nuevo "mecanismo" para actualizar automáticamente los pesos de cada problema. Esto sería laborioso. Lo que nos gustaría aquí también es una forma completamente general de actualizar los pesos de una red neuronal, para que mejore en cualquier tarea. Convenientemente, ¡esto también existe!

A esto se le llama descenso de gradiente estocástico (SGD ). Veremos cómo funcionan en detalle las redes neuronales y el SGD enCapítulo 4, además de explicar el teorema de aproximación universal. Por ahora, sin embargo, utilizaremos las propias palabras de Samuel: No necesitamos entrar en los detalles de tal procedimiento para ver que podría hacerse totalmente automático y para ver que una máquina así programada "aprendería" de su experiencia.

Jeremy dice

No te preocupes; ni el SGD ni las redes neuronales son matemáticamente complejos. Ambas se basan casi por completo en la suma y la multiplicación para hacer su trabajo (¡pero hacen mucha suma y multiplicación!). La principal reacción que oímos de los alumnos cuando ven los detalles es: "¿Eso es todo?"

En otras palabras, para recapitular, una red neuronal es un tipo particular de modelo de aprendizaje automático, que encaja perfectamente en la concepción original de Samuel. Las redes neuronales son especiales porque son muy flexibles, lo que significa que pueden resolver una gama inusualmente amplia de problemas con sólo encontrar los pesos adecuados. Esto es muy potente, porque el descenso de gradiente estocástico nos proporciona una forma de encontrar esos valores de peso automáticamente.

Después de alejarnos, volvamos a acercarnos y analicemos nuestro problema de clasificación de imágenes utilizando el marco de Samuel.

Nuestras entradas son las imágenes. Nuestros pesos son los pesos enla red neuronal. Nuestro modelo es una red neuronal. Nuestros resultados son los valores que calcula la red neuronal, como "perro" o "gato".

¿Y qué hay de la siguiente pieza, un medio automático de comprobar la eficacia de cualquier asignación de pesos actual en términos de rendimiento real? Determinar el "rendimiento real" es bastante fácil: simplemente podemos definir el rendimiento de nuestro modelo como su precisión a la hora de predecir las respuestas correctas.

Poniendo todo esto junto, y suponiendo que el SGD es nuestro mecanismo para actualizar las asignaciones de pesos, podemos ver cómo nuestro clasificador de imágenes es un modelo de aprendizaje automático, muy parecido al que Samuel imaginó.

Un poco de jerga del aprendizaje profundo

Samuel trabajaba en los años 60, y desde entonces la terminología ha cambiado. He aquí la terminología moderna del aprendizaje profundo para todas las piezas de las que hemos hablado:

  • La forma funcional del modelo se denomina su arquitectura (peroten cuidado: a veces la gente utiliza modelo como sinónimo de arquitectura, por lo que puede resultar confuso).

  • Los pesos se llaman parámetros.

  • Las predicciones se calculan a partir de la variable independiente, que son los datos sin incluir las etiquetas.

  • Los resultados del modelo se llaman predicciones.

  • La medida del rendimiento se llama pérdida.

  • La pérdida no sólo depende de las predicciones, sino también de lasetiquetas correctas (también conocidas como objetivos o variable dependiente); por ejemplo, "perro" o "gato".

Después de hacer estos cambios, nuestro diagrama de la Figura 1-6tiene el aspecto de la Figura 1-8.

Figura 1-8. Bucle de entrenamiento detallado

Limitaciones inherentes al aprendizaje automático

A partir de esta imagen, podemos ver ahora algunas cosas fundamentales sobre el entrenamiento de un modelo de aprendizaje profundo:

  • No se puede crear un modelo sin datos.

  • Un modelo puede aprender a funcionar sólo con los patrones observados en los datos de entrada utilizados para entrenarlo.

  • Este enfoque de aprendizaje sólo crea predicciones, noacciones recomendadas.

  • No basta con tener ejemplos de datos de entrada; también necesitamos etiquetas para esos datos (por ejemplo, las fotos de perros y gatos no bastan para entrenar un modelo; necesitamos una etiqueta para cada uno, que diga cuáles son perros y cuáles son gatos).

En general, hemos visto que la mayoría de las organizaciones que dicen que no tienen suficientes datos, en realidad quieren decir que no tienen suficientes datos etiquetados. Si alguna organización está interesada en hacer algo en la práctica con un modelo, es de suponer que tiene algunos datos de entrada con los que piensa ejecutar su modelo. Y es de suponer que llevan tiempo haciéndolo de alguna otra forma (por ejemplo, manualmente o con algún programa heurístico), ¡así que tienen datos de esos procesos! Por ejemplo, una consulta de radiología tendrá casi seguro un archivo de exploraciones médicas (ya que necesitan poder comprobar cómo evolucionan sus pacientes con el tiempo), pero esas exploraciones pueden no tener etiquetas estructuradas que contengan una lista de diagnósticos o intervenciones (ya que los radiólogos suelen crear informes de texto libre en lenguaje natural, no datos estructurados). En este libro hablaremos mucho de los enfoques de etiquetado, porque es una cuestión muy importante en la práctica.

Dado que este tipo de modelos de aprendizaje automático sólo pueden hacer predicciones(es decir, intentar replicar etiquetas), esto puede dar lugar a una brecha importante entre los objetivos de la organización y las capacidades del modelo. Por ejemplo, en este libro aprenderás a crear unsistema de recomendación que pueda predecir qué productos podría comprar un usuario. Esto seutiliza a menudo en el comercio electrónico, por ejemplo para personalizar los productos que se muestran en una página de inicio mostrando los artículos mejor clasificados. Pero un modelo de este tipo suele crearse observando a un usuario y su historial de compras(entradas) y lo que llegó a comprar o mirar(etiquetas), lo que significa que es probable que el modelo te hable de productos que el usuario ya tiene, o que ya conoce, en lugar de nuevos productos de los que es más probable que esté interesado en conocer. Esto es muy distinto de lo que podría hacer, por ejemplo, un experto de tu librería local, que te hace preguntas para averiguar tus gustos y luego te habla de autores o series de los que nunca antes habías oído hablar.

Otra idea crítica proviene de considerar cómo interactúa un modelo con su entorno. Esto puede crear bucles de retroalimentación, como se describe aquí:

  1. Se crea un modelo policial predictivo basado en dónde se han realizado detenciones en el pasado. En la práctica, no se trata en realidad de predecir la delincuencia, sino de predecir las detenciones, por lo que en parte simplemente refleja los sesgos delos procesos policiales existentes.

  2. Los funcionarios encargados de hacer cumplir la ley podrían entonces utilizar ese modelo para decidir dónde centrar su actividad policial, lo que se traduciría en un aumento de las detenciones en esas zonas.

  3. Los datos sobre estas detenciones adicionales se volverían a introducir para volver a entrenar futuras versiones del modelo.

Se trata de un bucle de retroalimentación positiva: cuanto más se utiliza el modelo,más sesgados se vuelven los datos, lo que hace que el modelo sea aún más sesgado, y así sucesivamente.

Los bucles de retroalimentación también pueden crear problemas en entornos comerciales. Por ejemplo, un sistema de recomendación de vídeos podría estar sesgado hacia la recomendación de contenidos consumidos por los mayores espectadores de vídeos (por ejemplo, los teóricos de la conspiración y los extremistas tienden a ver más contenidos de vídeo en línea que la media), lo que daría lugar a que esos usuarios aumentaran su consumo de vídeos, con lo que se recomendarían más de ese tipo de vídeos. Trataremos este tema con más detalle en el Capítulo 3.

Ahora que has visto la base de la teoría, volvamos a nuestro ejemplo de código y veamos en detalle cómo se corresponde el código con el proceso que acabamos de describir.

Cómo funciona nuestro Reconocedor de Imágenes

Veamos cómo nuestro código del reconocedor de imágenes se ajusta a estas ideas. Pondremos cada línea en una celda separada, y veremos en lo que hace cada una (no explicaremos aún todos los detalles de cada parámetro, pero daremos una descripción de las partes importantes; los detalles completos vendrán más adelante en el libro). La primera línea importa toda la biblioteca fastai.vision:

from fastai.vision.all import *

Esto nos proporciona todas las funciones y clases que necesitaremos para crear una amplia variedad de modelos de visión por ordenador.

Jeremy dice

Muchos programadores de Python recomiendan evitar importar una biblioteca entera como ésta (utilizando la sintaxis import * ) porque en grandes proyectos de software puede causar problemas. Sin embargo, para el trabajo interactivo, como en un cuaderno Jupyter, funciona de maravilla. La biblioteca fastai está especialmente diseñada para soportar este tipo de uso interactivo, e importará a tu entorno sólo las piezas necesarias.

La segunda línea descarga en tu servidor un conjunto de datos estándar de lacolecciónfast.ai datasets (si no se ha descargado previamente), lo extrae (si no se ha extraído previamente) y devuelve un objeto Path con la ubicación extraída:

path = untar_data(URLs.PETS)/'images'

Sylvain Dice

A lo largo de mi tiempo estudiando en fast.ai, y aún hoy, he aprendido mucho sobre prácticas de codificación productivas. La biblioteca fastai y los cuadernos de fast.ai están llenos de pequeños consejos que me han ayudado a ser mejor programador. Por ejemplo, fíjate en que la biblioteca fastai no devuelve simplemente una cadena que contiene la ruta al conjunto de datos, sino un objeto Path. Se trata de una clase realmente útil de la biblioteca estándar de Python 3 que facilita mucho el acceso a archivos y directorios. Si no te has topado con ella antes, no dejes de consultar su documentación o un tutorial y probarla. Ten en cuenta que el sitio web del libro contiene enlaces a tutoriales recomendados para cada capítulo. Seguiré informándote sobre pequeños trucos de codificación que me resulten útiles a medida que los vaya encontrando.

En la tercera línea, definimos una función, is_cat, que etiqueta los gatos basándose en una regla de nombre de archivo proporcionada por los creadores del conjunto de datos:

def is_cat(x): return x[0].isupper()

Utilizamos esa función en la cuarta línea, que indica a fastai qué tipo de conjunto de datos tenemos y cómo está estructurado:

dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

Hay varias clases para distintos tipos de conjuntos de datos y problemas de aprendizaje profundo: aquí utilizaremosImageDataLoaders. La primera parte del nombre de la clase será generalmente el tipo de datos que tienes, como imagen o texto.

El otro dato importante que tenemos que decirle a fastai es cómo obtener las etiquetas del conjunto de datos. Los conjuntos de datos de visión por ordenador suelen estar estructurados de tal forma que la etiqueta de una imagen forma parte del nombre del archivo o de la ruta, normalmente el nombre de la carpeta principal. fastai viene con una serie de métodos de etiquetado estandarizados y formas de escribir los tuyos propios. Aquí le estamos diciendo a fastai que utilice la función que acabamos de definir. is_cat

Por último, definimos los Transforms que necesitamos. Un Transform contiene códigoque se aplica automáticamente durante el entrenamiento; fastai incluye muchos Transforms predefinidos, y añadir otros nuevos es tan sencillo como crear una función Python. Hay dos tipos: los item_tfms se aplican a cada elemento (en este caso, cada elemento se redimensiona a un cuadrado de 224 píxeles), mientras que losbatch_tfms se aplican a un lote de elementos a la vez utilizando la GPU,por lo que son especialmente rápidos (veremos muchos ejemplos de ellos a lo largo de este libro).

¿Por qué 224 píxeles? Éste es el tamaño estándar por razones históricas (los antiguos modelos preentrenados requieren exactamente este tamaño), pero puedes pasar prácticamente cualquier cosa. Si aumentas el tamaño, a menudo obtendrás un modelo con mejores resultados (ya que podrá centrarse en más detalles), pero al precio de la velocidad y el consumo de memoria; lo contrario ocurre si disminuyes el tamaño.

Jerga: Clasificación y Regresión

La clasificación y la regresión tienen significados muy específicos en el aprendizaje automático. Son los dos tipos principales de modelos que investigaremos en este libro. Un modelo de clasificación es el que intenta predecir una clase, o categoría. Es decir, predice a partir de una serie de posibilidades discretas, como "perro" o "gato". Un modelo de regresión es el que intenta predecir una o más cantidades numéricas, como una temperatura o una ubicación. A veces la gente utiliza la palabra regresión para referirse a un tipo concreto de modelo llamado modelo de regresión lineal; ¡es una mala práctica, y no utilizaremos esa terminología en este libro!

El conjunto de datos de Mascotas contiene 7.390 imágenes de perros y gatos, consistentes en 37 razas. Cada imagen se etiqueta utilizando su nombre de archivo: por ejemplo, el archivo gran_pirineos_173.jpg es el ejemplo 173 de una imagen de un perro de raza Gran Pirineo en el conjunto de datos. Los nombres de archivo empiezan por una letra mayúscula si la imagen es un gato, y por una letra minúscula en caso contrario. Tenemos que decirle a fastai cómo obtener etiquetas a partir de los nombres de archivo, lo que hacemos llamando a from_name_func (lo que significa que las etiquetas se pueden extraer mediante una función aplicada al nombre de archivo) y pasándoleis_cat, que devuelve x[0].isupper(), que se evalúa como True si la primera letra es mayúscula (es decir, es un gato).

El parámetro más importante que hay que mencionar aquí es valid_pct=0.2. Esto indica a fastai que retenga el 20% de los datos y no los utilice en absoluto para entrenar el modelo. Este 20% de los datos se denomina conjunto de validación; el 80% restante se denomina conjunto de entrenamiento. El conjunto devalidación se utiliza para medir la precisión del modelo. Por defecto, el 20% que se retiene se selecciona aleatoriamente. El parámetro seed=42 establece la semilla aleatoria en el mismo valor cada vez que ejecutamos este código, lo que significa que obtenemos el mismo conjunto de validación cada vez que lo ejecutamos; de este modo, si cambiamos nuestro modelo y lo volvemos a entrenar, sabemos que cualquier diferencia se debe a los cambios en el modelo, no a que tengamos un conjunto de validación aleatorio diferente.

fastai siempre te mostrará la precisión de tu modelo utilizandosólo el conjunto de validación, nunca el conjunto de entrenamiento. Esto es absolutamente crítico, porque si entrenas un modelo lo suficientemente grande durante el tiempo suficiente, ¡acabará memorizando la etiqueta de cada elemento de tu conjunto de datos! El resultado no será un modelo útil, porque lo que nos importa es lo bien que funciona nuestro modelo con imágenes no vistas previamente. Ése es siempre nuestro objetivo al crear un modelo: que sea útil en datos que el modelo sólo vea en el futuro, después de haber sido entrenado.

Aunque tu modelo no haya memorizado completamente todos tus datos, al principio del entrenamiento puede haber memorizado ciertas partes de ellos. Como resultado, cuanto más tiempo entrenes, mejor será tu precisión en el conjunto de entrenamiento; la precisión del conjunto de validación también mejorará durante un tiempo, pero finalmente empezará a empeorar a medida que el modelo empiece a memorizar el conjunto de entrenamiento en lugar de encontrar patrones subyacentes generalizables en los datos. Cuando esto ocurre, decimos que el modelo se está sobreadaptando.

La Figura 1-9 muestra lo que ocurre cuando se sobreajusta, utilizando un ejemplo simplificado en el que sólo tenemos un parámetro y unos datos generados aleatoriamente a partir de la función x**2. Como ves, aunque las predicciones del modelo sobreajustado son precisas para los datos cercanos a los puntos de datos observados, están muy alejadas cuando se encuentran fuera de ese rango.

Example of overfitting
Figura 1-9. Ejemplo de sobreajuste

El sobreajuste es el problema más importante y difícil deresolver en el entrenamiento de para todos los profesionales del aprendizaje automático y todos los algoritmos. Como verás, es fácil crear un modelo que haga un gran trabajo haciendo predicciones sobre los datos exactos en los que se ha entrenado, pero es mucho más difícil hacer predicciones precisas sobre datos que el modelo nunca ha visto antes. Y, por supuesto, estos son los datos que importarán en la práctica. Por ejemplo, si creas un clasificador de dígitos escritos a mano (¡como haremos pronto!) y lo utilizas para reconocer números escritos en cheques, nunca verás ninguno de los números con los que se entrenó el modelo: cada cheque tendrá variaciones ligeramente diferentes de escritura con las que tratar.

En este libro aprenderás muchos métodos para evitar el sobreajuste. Sin embargo, debes utilizar esos métodos sólo después de haber confirmado que se está produciendo sobreadaptación (es decir, si has observado que la precisión de validación empeora durante el entrenamiento). A menudo vemos a profesionales que utilizan técnicas para evitar el sobreajuste incluso cuando tienen suficientes datos como para no necesitar hacerlo, y acaban con un modelo que puede ser menos preciso de lo que podrían haber conseguido.

Conjunto de validación

Cuando entrenas un modelo, siempre debes tener un conjunto de entrenamiento y un conjunto de validación, y debes medir la precisión de tu modelo sólo en el conjunto de validación. Si entrenas durante demasiado tiempo, con datos insuficientes, verás que la precisión de tu modelo empieza a empeorar; a esto se le llama sobreajuste. fastai pone por defecto valid_pct en 0.2, así que aunque te olvides, ¡fastai creará un conjunto de validación por ti!

La quinta línea del código de entrenamiento de nuestro reconocedor de imágenes indica a fastai que cree una red neuronal convolucional(CNN) y especifica qué arquitectura utilizar (es decir, qué tipo de modelo crear), con qué datos queremos entrenarla y qué métrica utilizar:

learn = cnn_learner(dls, resnet34, metrics=error_rate)

¿Por qué una CNN? Es el enfoque actual más avanzado para crear modelos de visión por ordenador . En este libro aprenderemos todo sobre el funcionamiento de las CNN. Su estructura está inspirada en el funcionamiento del sistema de visión humano.

Hay muchas arquitecturas en fastai, que presentaremos en este libro (además de discutir cómo crear la tuya propia). La mayoría de las veces, sin embargo, elegir una arquitectura no es una parte muy importante del proceso de aprendizaje profundo. Es algo de lo que a los académicos les encanta hablar, pero en la práctica es poco probable que sea algo a lo que necesites dedicar mucho tiempo. Hay algunas arquitecturas estándar que funcionan la mayoría de las veces, y en este caso estamos utilizando una llamada ResNet de la que hablaremos mucho en el libro; es rápida y precisa para muchos conjuntos de datos y problemas. El 34 enresnet34 se refiere al número de capas en esta variante de la arquitectura (otras opciones son 18, 50, 101 y 152). Los modelos que utilizan arquitecturas con más capas tardan más en entrenarse y son más propensos al sobreajuste (es decir, no puedes entrenarlos durante tantas épocas antes de que la precisión en el conjunto de validación empiece a empeorar). Por otro lado, al utilizar más datos, pueden ser bastante más precisas.

¿Qué es una métrica? Una métrica es una función que mide la calidad de las predicciones del modelo utilizando el conjunto de validación, y se imprimirá al final de cada época. En este caso, estamos utilizando error_rate, que es una función proporcionada por fastai que hace exactamente lo que dice: te dice qué porcentaje de imágenes del conjunto de validación se están clasificando incorrectamente. Otra métrica habitual para la clasificación es accuracy (que no es más que 1.0 - error_rate). fastai proporciona muchas más, que se tratarán a lo largo de este libro.

El concepto de métrica puede recordarte a la pérdida, pero hay una distinción importante en. Todo el propósito de la pérdida es definir una "medida de rendimiento" que el sistema de entrenamiento pueda utilizar para actualizar los pesos automáticamente. En otras palabras, una buena elección para la pérdida es una elección fácil de utilizar para el descenso por gradiente estocástico. Pero una métrica se define para el consumo humano, así que una buena métrica es aquella que te resulta fácil de entender y que se ajusta lo más posible a lo que quieres que haga el modelo. A veces, puedes decidir que la función de pérdida es una métrica adecuada, pero no es necesariamente así.

cnn_learner también tiene un parámetro pretrained, que por defecto es True (por lo que se utiliza en este caso, aunque no lo hayamos especificado), que establece los pesos de tu modelo en valores que ya han sido entrenados por expertos para reconocer mil categorías diferentes en 1,3 millones de fotos (utilizando el famoso conjunto de datos ImageNet ). Un modelo que tiene pesos que ya han sido entrenados en otro conjunto de datos se denomina modelo preentrenado. Casi siempre debes utilizar un modelo preentrenado, porque significa que tu modelo, antes incluso de que le hayas mostrado ninguno de tus datos, ya es muy capaz. Y como verás, en un modelo de aprendizaje profundo, muchas de estas capacidades son cosas que necesitarás, casi independientemente de los detalles de tu proyecto. Por ejemplo, partes de los modelos preentrenados se encargarán de la detección de perímetros, gradientes y colores, que son necesarios para muchas tareas.

Cuando utilices un modelo preentrenado, cnn_learner eliminará la última capa, ya que siempre está específicamente personalizada para la tarea de entrenamiento original (es decir, la clasificación del conjunto de datos ImageNet), y la sustituirá por una o más capas nuevas con pesos aleatorios, de un tamaño adecuado para el conjunto de datos con el que estés trabajando. Esta última parte del modelo se conoce como cabeza.

Utilizar modelos preentrenados es el método más importante que tenemos para permitirnos entrenar modelos más precisos, más rápidamente, con menos datos y menos tiempo y dinero. Podrías pensar que eso significaría que el uso de modelos preentrenados sería el área más estudiada en el aprendizaje profundo académico... ¡pero estarías muy, muy equivocado! La importancia de los modelos preentrenados no suele reconocerse ni discutirse en la mayoría de los cursos, libros o características de las bibliotecas de software, y rara vez se tiene en cuenta en los artículos académicos. Mientras escribimos esto, a principios de 2020, las cosas están empezando a cambiar, pero es probable que tarde un tiempo. Así que ten cuidado: la mayoría de las personas con las que hables probablemente subestimarán en gran medida lo que puedes hacer en aprendizaje profundo con pocos recursos, porque probablemente no entenderán en profundidad cómo utilizar modelos preentrenados.

Utilizar un modelo preentrenado para una tarea distinta de aquella para la que se entrenó originalmente se conoce como aprendizaje por transferencia. Por desgracia, como el aprendizaje por transferencia está tan poco estudiado, pocos ámbitos disponen de modelos preentrenados. Por ejemplo, en medicina se dispone actualmente de pocos modelos preentrenados en , lo que dificulta el uso del aprendizaje por transferencia en ese dominio. Además, aún no se sabe muy bien cómo utilizar el aprendizaje por transferencia en tareas como el análisis de series temporales.

Jerga: Aprendizaje por transferencia

Utilizar un modelo preentrenado para una tarea distinta de aquella para la que fue entrenado originalmente.

La sexta línea de nuestro código indica a fastai cómo ajustar el modelo:

learn.fine_tune(1)

Como ya hemos dicho, la arquitectura sólo describe una plantilla para una función matemática; en realidad, no hace nada hasta que proporcionamos valores para los millones de parámetros que contiene.

Ésta es la clave del aprendizaje profundo: determinar cómo ajustar los parámetros de un modelo para conseguir que resuelva tu problema. Para ajustar un modelo, tenemos que proporcionar al menos un dato: cuántas veces mirar cada imagen (lo que se conoce como número de épocas). El número de épocas que selecciones dependerá en gran medida del tiempo de que dispongas y del tiempo que te lleve en la práctica ajustar tu modelo. Si seleccionas un número demasiado pequeño, siempre puedes entrenar más épocas más adelante.

Pero, ¿por qué el método se llama fine_tune, y no fit? fastaitiene un método llamado fit, que, efectivamente, ajusta un modelo (es decir, mira las imágenes del conjunto de entrenamiento varias veces, actualizando cada vez los parámetros para que las predicciones se acerquen cada vez más a las etiquetas objetivo). Pero en este caso, hemos partido de un modelo preentrenado, y no queremos desechar todas las capacidades que ya tiene. Como aprenderás en este libro, hay algunos trucos importantes para adaptar un modelo preentrenado a un nuevo conjunto de datos, un proceso llamado ajuste fino.

Jerga: Afinando

Una técnica de aprendizaje por transferencia que actualiza los parámetros de un modelo preentrenado entrenando durante épocas adicionales utilizando una tarea diferente de la utilizada para el preentrenamiento.

Cuando utilices el método fine_tune, fastai utilizará estos trucos para. Hay algunos parámetros que puedes establecer (que discutiremos más adelante), pero en la forma predeterminada que se muestra aquí, realiza dos pasos:

  1. Utiliza una época para ajustar sólo las partes del modelo necesarias para que la nueva cabeza aleatoria funcione correctamente con tu conjunto de datos.

  2. Utiliza el número de épocas solicitado al llamar al método para ajustar todo el modelo, actualizando los pesos de las capas posteriores (especialmente la cabeza) más rápidamente que los de las capas anteriores (que, como veremos, generalmente no requieren muchos cambios respecto a los pesos preentrenados).

La cabeza de un modelo es la parte que se añade de nuevo para ser específica deel nuevo conjunto de datos. Una epoch es una pasada completa por el conjunto de datos.Tras llamar a fit, se imprimen los resultados después de cada epoch, mostrando el número de epoch, las pérdidas del conjunto de entrenamiento y validación (la "medida de rendimiento" utilizada para entrenar el modelo), y cualquier métricaque hayas solicitado (tasa de error, en este caso).

Así que, con todo este código, nuestro modelo aprendió a reconocer gatos y perros sólo a partir de ejemplos etiquetados. Pero, ¿cómo lo hizo?

Lo que aprendió nuestro Reconocedor de Imágenes

En esta fase, tenemos un reconocedor de imágenes que funciona bien, pero ¡no tenemos ni idea de lo que está haciendo! Aunque mucha gente se queja de que el aprendizaje profundo da lugar a modelos impenetrables de "caja negra" (es decir, algo que da predicciones pero que nadie puede entender), esto no podría estar más lejos de la realidad. Existe un vasto corpus de investigación que muestra cómo inspeccionar en profundidad los modelos de aprendizaje profundo y obtener de ellos ricos conocimientos. Dicho esto, todos los tipos de modelos de aprendizaje automático (incluido el aprendizaje profundo y los modelos estadísticos tradicionales) pueden ser difíciles de comprender plenamente, especialmente cuando se considera cómo se comportarán cuando se encuentren con datos muy diferentes de los utilizados para entrenarlos. Trataremos este tema a lo largo de este libro.

En 2013, el estudiante de doctorado Matt Zeiler y su supervisor, Rob Fergus, publicaron "Visualizing and Understanding Convolutional Networks", que mostraba cómo visualizar los pesos de la red neuronal aprendidos en cada capa de un modelo. Analizaron detenidamente el modelo que ganó el concurso ImageNet de 2012, y utilizaron este análisis para mejorar enormemente el modelo, ¡de tal forma que pudieron ganar el concurso de 2013! La Figura 1-10 es la imagen que publicaron de los pesos de la primera capa.

Activations of early layers of a CNN
Figura 1-10. Activaciones de la primera capa de una CNN (cortesía de Matthew D. Zeiler y Rob Fergus)

Esta imagen requiere alguna explicación. Para cada capa, la parte de la imagen con el fondo gris claro muestra los pesos reconstruidos, y la sección más grande de la parte inferior muestra las partes de las imágenes de entrenamiento que más coincidían con cada conjunto de pesos. Para la capa 1, lo que podemos ver es que el modelo ha descubierto pesos que representan perímetros diagonales, horizontales y verticales, así como varios gradientes. (Ten en cuenta que, para cada capa, sólo se muestra un subconjunto de las características; en la práctica hay miles en todas las capas).

Estos son los bloques de construcción básicos que el modelo ha aprendido para la visión por ordenador. Han sido ampliamente analizados por neurocientíficos e investigadores de la visión por ordenador, y resulta que estos bloques de construcción aprendidos son muy similares a la maquinaria visual básica del ojo humano, así como a las características artesanales de la visión por ordenador que se desarrollaron antes de los días del aprendizaje profundo. La siguiente capa se representa en laFigura 1-11.

Activations of early layers of a CNN
Figura 1-11. Activaciones de la segunda capa de una CNN (cortesía de Matthew D. Zeiler y Rob Fergus)

Para la capa 2, hay nueve ejemplos de reconstrucciones de pesos para cada una de las características encontradas por el modelo. Podemos ver que el modelo ha aprendido a crear detectores de rasgos que buscan esquinas, líneas repetidas, círculos y otros patrones simples. Éstos se construyen a partir de los bloques básicos desarrollados en la primera capa. Para cada uno de ellos, la parte derecha de la imagen muestra pequeños fragmentos de imágenes reales con los que coinciden más estrechamente estas características. Por ejemplo, el patrón concreto de la fila 2, columna 1, coincide con los degradados y texturas asociados a las puestas de sol.

La Figura 1-12 muestra la imagen del documento en la que aparecen los resultados de la reconstrucción de los rasgos de la capa 3.

Activations of medium layers of a CNN
Figura 1-12. Activaciones de la tercera capa de una CNN (cortesía de Matthew D. Zeiler y Rob Fergus)

Como puedes ver observando la parte derecha de esta imagen, los rasgos son ahora capaces de identificar y emparejar con componentes semánticos de nivel superior, como ruedas de coche, texto y pétalos de flor. Utilizando estos componentes, las capas 4 y 5 pueden identificar conceptos de nivel aún más alto, como se muestra en la Figura 1-13.

Activations of end layers of a CNN
Figura 1-13. Activaciones de las capas cuarta y quinta de una CNN (cortesía de Matthew D. Zeiler y Rob Fergus)

En este artículo se estudiaba un modelo antiguo llamado AlexNet que sólo contenía cinco capas. Las redes desarrolladas desde entonces pueden tener cientos de capas, ¡así que puedes imaginarte lo ricas que pueden ser las funciones desarrolladas por estos modelos!

Cuando afinamos antes nuestro modelo preentrenado, adaptamos en qué se centran esas últimas capas (flores, humanos, animales) para especializarnos en el problema de los gatos frente a los perros. En términos más generales, podríamos especializar dicho modelo preentrenado en muchas tareas diferentes. Veamos algunos ejemplos.

Los reconocedores de imágenes pueden abordar tareas no relacionadas con las imágenes

Un reconocedor de imágenes sólo puede, como su nombre indica, reconocer imágenes. Pero muchas cosas pueden representarse como imágenes, lo que significa que un reconocedor de imágenes puede aprender a realizar muchas tareas.

Por ejemplo, un sonido puede convertirse en un espectrograma, que es un gráfico deque muestra la cantidad de cada frecuencia en cada momento de un archivo de audio. El estudiante de Fast.ai Ethan Sutin utilizó este enfoque parasuperar fácilmente la precisión publicada de un modelo de detección de sonidos ambientales de última generaciónutilizando un conjunto de datos de 8.732 sonidos urbanos. show_batch de fastai muestra claramente cómo cada sonido tiene un espectrograma bastante distintivo, como puedes ver enla Figura 1-14.

show_batch with spectrograms of sounds
Figura 1-14. show_batch con espectrogramas de sonidos

Una serie temporal puede convertirse fácilmente en una imagen simplemente trazando la serie temporalen un gráfico. Sin embargo, a menudo es una buena idea intentar representar tus datos de forma que sea lo más fácil posible extraer los componentes más importantes. En una serie temporal, lo más probable es que interesen aspectos como la estacionalidad y las anomalías.

Existen varias transformaciones para los datos de series temporales. Por ejemplo, el estudiante de fast.ai Ignacio Oguiza creó imágenes a partir de un conjunto de datos de series temporales para la clasificación del aceite de oliva, utilizando una técnica llamada Campo de Diferencia Angular Gramiana (GADF); puedes ver el resultado en la Figura 1-15. A continuación, alimentó con esas imágenes un modelo de clasificación de imágenes como el que ves en este capítulo. Sus resultados, a pesar de contar con sólo 30 imágenes de entrenamiento, superaron con creces el 90% de precisión, acercándose al estado del arte.

Converting a time series into an image
Figura 1-15. Convertir una serie temporal en una imagen

Otro ejemplo interesante de proyecto estudiantil de fast.ai procede de Gleb Esman. Estaba trabajando en la detección de fraudes en Splunk, utilizando un conjunto de datos de los movimientos y clics del ratón de los usuarios. Los convirtió en imágenes dibujando una imagen que mostraba la posición, la velocidad y la aceleración del puntero del ratón mediante líneas de colores, y los clics se mostraban mediantepequeños círculos de colores, como se muestra en la figura 1-16. Introdujo esto en un modelo de reconocimiento de imágenes como el que hemos utilizado en este capítulo, ¡y funcionó tan bien que dio lugar a una patente para este enfoque del análisis del fraude!

Converting computer mouse behavior to an image
Figura 1-16. Convertir el comportamiento del ratón del ordenador en una imagen

Otro ejemplo procede del artículo"Malware Classification with Deep Convolutional Neural Networks" de Mahmoud Kalash et al., que explica que "el archivo binario del malware se divide en secuencias de 8 bits que luego se convierten en valores decimales equivalentes. Este vector decimal se remodela y se genera [una] imagen en escala de grises que representa[ba] la muestra de malware", en la Figura 1-17.

Malware classification process
Figura 1-17. Proceso de clasificación del malware

A continuación, los autores muestran "imágenes" generadas mediante este proceso de malware en diferentes categorías, como se muestra en la Figura 1-18.

Malware examples
Figura 1-18. Ejemplos de malware

Como puedes ver, los distintos tipos de malware tienen un aspecto muy distintivo para el ojo humano. El modelo que los investigadores entrenaron basándose en esta representación de imagen fue más preciso en la clasificación de malware que cualquier enfoque anterior mostrado en la literatura académica. Esto sugiere una buena regla general para convertir un conjunto de datos en una representación de imagen: si el ojo humano puede reconocer categorías a partir de las imágenes, entonces un modelo de aprendizaje profundo también debería poder hacerlo.

En general, verás que un pequeño número de enfoques generales en el aprendizaje profundo pueden llegar muy lejos, ¡si eres un poco creativo en la forma de representar tus datos! No deberías pensar en enfoques como los descritos aquí como "soluciones chapuceras", porque a menudo (como aquí) superan los resultados de vanguardia anteriores. Éstas son realmente las formas correctas de pensar sobre estos dominios de problemas.

Recapitulación de la jerga

Acabamos de cubrir mucha información, así que recapitulemos brevemente.La Tabla 1-3 proporciona una práctica lista de vocabulario.

Tabla 1-3. Vocabulario del aprendizaje profundo
Plazo Significado

Etiqueta

Los datos que intentamos predecir, como "perro" o "gato"

Arquitectura

La plantilla del modelo que intentamos ajustar; es decir, la función matemática real a la que pasamos los datos de entrada y los parámetros

Modelo

La combinación de la arquitectura con un determinado conjunto de parámetros

Parámetros

Los valores del modelo que cambian la tarea que puede realizar y que se actualizan mediante el entrenamiento del modelo

En forma

Actualiza los parámetros del modelo de forma que las predicciones del modelo utilizando los datos de entrada coincidan con las etiquetas objetivo

Tren

Un sinónimo de apto

Modelo preentrenado

Un modelo que ya ha sido entrenado, generalmente utilizando un gran conjunto de datos, y que será afinado

Afina

Actualizar un modelo preentrenado para una tarea diferente

Época

Una pasada completa por los datos de entrada

Pérdida

Una medida de lo bueno que es el modelo, elegida para dirigir el entrenamiento mediante SGD

Métrica

Una medida de lo bueno que es el modelo utilizando el conjunto de validación, elegido para el consumo humano

Conjunto de validación

Un conjunto de datos excluidos del entrenamiento, utilizados sólo para medir lo bueno que es el modelo

Conjunto de entrenamiento

Los datos utilizados para ajustar el modelo; no incluye ningún dato del conjunto de validación

Sobreajuste

Entrenar un modelo de forma que recuerde características específicas de los datos de entrada, en lugar de generalizar bien a datos no vistos durante el entrenamiento

CNN

Red neuronal convolucional; un tipo de red neuronal que funciona especialmente bien para tareas de visión por ordenador

Con este vocabulario en la mano, ahora estamos en condiciones de reunir todos los conceptos clave introducidos hasta ahora. Tómate un momento para repasar esas definiciones y leer el siguiente resumen. Si puedes seguir la explicación, estarás bien equipado para entender las discusiones que se avecinan.

El aprendizaje automático es una disciplina en la que definimos un programa no escribiendo completamente nosotros mismos, sino aprendiendo de los datos. El aprendizaje profundo es una especialidad dentro del aprendizaje automático que utiliza redes neuronales con múltiples capas. La clasificación de imágenes es un ejemplo representativo (también conocida como reconocimiento de imágenes). Empezamos con datos etiquetados: unconjunto de imágenes a las que hemos asignado unaetiqueta a cada imagen, indicando lo que representa. Nuestro objetivo es producir un programa, llamado modelo, que, dada una nueva imagen, haga una predicción precisa sobre lo que representa esa nueva imagen.

Todo modelo comienza con una elección de arquitectura, una plantilla general sobre cómo funciona internamente ese tipo de modelo. El proceso de entrenamiento(o ajuste) del modelo es el proceso de encontrar un conjunto de valores de parámetros (o pesos) que especialicen esa arquitectura general en un modelo que funcione bien para nuestro tipo concreto de datos. Para definir lo bien que funciona un modelo en una sola predicción, tenemos que definir unafunción de pérdida, que determina cómo calificamos una predicción de buena o mala.

Para que el proceso de entrenamiento sea más rápido, podemos empezar con unmodelo preentrenado, es decir, unmodelo que ya ha sido entrenado con los datos de otra persona. Luego podemos adaptarlo a nuestros datos entrenándolo un poco más con ellos, un proceso que se denomina ajuste fino.

Cuando entrenamos un modelo, una preocupación clave es asegurarnos de que nuestro modelogeneraliza: aprende lecciones generales de nuestros datosque también se aplican a los nuevos elementos que encontrará, de modo que pueda hacer buenas predicciones sobre esos elementos. El riesgo es que, si entrenamos mal a nuestro modelo, en lugar de aprender lecciones generales, memorice efectivamente lo que ya ha visto, y entonces haga malas predicciones sobre las imágenes nuevas. Este fallo se denomina sobreadaptación.

Para evitarlo, siempre dividimos nuestros datos en dos partes, el conjunto de entrenamiento y elconjunto de validación. Entrenamos el modelo mostrándole sólo el conjunto de entrenamiento, y luego evaluamos lo bien que funciona el modelo viendo cómo se comporta con los elementos del conjunto de validación. De este modo, comprobamos si las lecciones que el modelo aprende del conjunto de entrenamiento son lecciones que se generalizan al conjunto de validación. Para que una persona pueda evaluar lo bien que le va al modelo en el conjunto de validación en general, definimos unamétrica. Durante el proceso de entrenamiento, cuando el modelo ha visto todos los elementos del conjunto de entrenamiento, lo llamamos una época.

Todos estos conceptos se aplican al aprendizaje automático en general. Se aplican a todo tipo de esquemas para definir un modelo entrenándolo con datos. Lo que distingue al aprendizaje profundo es una clase particular de arquitecturas: las arquitecturas basadas en redes neuronales. En particular, tareas como la clasificación de imágenes dependen en gran medida delas redes neuronales convolucionales, de las que hablaremos en breve.

El aprendizaje profundo no es sólo para la clasificación de imágenes

La eficacia del aprendizaje profundo para clasificar imágenes ha sido ampliamente debatida en los últimos años, mostrando incluso resultados sobrehumanosen tareas complejas como el reconocimiento de tumores malignos en tomografías computarizadas. Pero puede hacer mucho más que esto, como mostraremos aquí.

Por ejemplo, hablemos de algo que es de vital importancia para los vehículos autónomos: localizar objetos en una imagen. Si un coche autónomo no sabe dónde hay un peatón, ¡entonces no sabe cómo evitarlo! Crear un modelo que pueda reconocer el contenido de cada píxel individual de una imagen se llamasegmentación. He aquí cómo podemos entrenar un modelo de segmentación con fastai, utilizando un subconjunto del conjunto de datosCamVid del artículo"Semantic Object Classes in Video: A High-Definition Ground Truth Database" de Gabriel J. Brostow y otros:

path = untar_data(URLs.CAMVID_TINY)
dls = SegmentationDataLoaders.from_label_func(
    path, bs=8, fnames = get_image_files(path/"images"),
    label_func = lambda o: path/'labels'/f'{o.stem}_P{o.suffix}',
    codes = np.loadtxt(path/'codes.txt', dtype=str)
)

learn = unet_learner(dls, resnet34)
learn.fine_tune(8)
época tren_pérdida pérdida_válida tiempo
0 2.906601 2.347491 00:02
época tren_pérdida pérdida_válida tiempo
0 1.988776 1.765969 00:02
1 1.703356 1.265247 00:02
2 1.591550 1.309860 00:02
3 1.459745 1.102660 00:02
4 1.324229 0.948472 00:02
5 1.205859 0.894631 00:02
6 1.102528 0.809563 00:02
7 1.020853 0.805135 00:02

Ni siquiera vamos a recorrer este código línea por línea, ¡porque es casi idéntico a nuestro ejemplo anterior! (Haremos una inmersión profunda en los modelos de segmentación enel Capítulo 15, junto con todos los demás modelos que presentamos brevemente en este capítulo y muchos, muchos más).

Podemos visualizar lo bien que logró su cometido pidiendo al modelo que codifique por colores cada píxel de una imagen. Como puedes ver, clasifica casi perfectamente cada píxel de cada objeto. Por ejemplo, observa que todos los coches están superpuestos con el mismo color, y todos los árboles están superpuestos con el mismo color (en cada par de imágenes, la imagen de la izquierda es la etiqueta de la verdad sobre el terreno, y la de la derecha es la predicción del modelo):

learn.show_results(max_n=6, figsize=(7,8))

Otra área en la que el aprendizaje profundo ha mejorado espectacularmente en los últimos dos años es el procesamiento del lenguaje natural (PLN). Ahora los ordenadores pueden generar texto, traducir automáticamente de un idioma a otro, analizar comentarios, etiquetar palabras en frases y mucho más. Aquí tienes todo el código necesario para entrenar un modelo que puede clasificar el sentimiento de una crítica de cine mejor que cualquier cosa que existiera en el mundo hace sólo cinco años:

from fastai.text.all import *

dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn.fine_tune(4, 1e-2)
época tren_pérdida pérdida_válida precisión tiempo
0 0.594912 0.407416 0.823640 01:35
época tren_pérdida pérdida_válida precisión tiempo
0 0.268259 0.316242 0.876000 03:03
1 0.184861 0.246242 0.898080 03:10
2 0.136392 0.220086 0.918200 03:16
3 0.106423 0.191092 0.931360 03:15

Este modelo utiliza el conjunto de datos IMDb Large Movie Review de "Learning Word Vectors for Sentiment Analysis" de Andrew Maas et al. Funciona bien con críticas de películas de muchos miles de palabras, pero vamos a probarlo con una corta para ver cómo funciona:

learn.predict("I really liked that movie!")
('pos', tensor(1), tensor([0.0041, 0.9959]))

Aquí podemos ver que el modelo ha considerado que la reseña es positiva. La segunda parte del resultado es el índice de "pos" en nuestro vocabulario de datos, y la última parte son las probabilidades atribuidas a cada clase (99,6% para "pos" y 0,4% para "neg").

¡Ahora te toca a ti! Escribe tu propia minicrítica de cine, o copia una de Internet, y podrás ver lo que piensa este modelo sobre ella.

Si alguna vez tienes dudas sobre un método fastai, debes utilizar la función doc , pasándole el nombre del método:

doc(learn.predict)

Aparece una ventana con una breve explicación de una línea. El enlace "Mostrar en docs" te lleva a la documentación completa, donde encontrarás todos los detalles y montones de ejemplos. Además,la mayoría de los métodos de fastai son sólo un puñado de líneas, así que puedes hacer clic en el enlace "fuente" para ver exactamente lo que ocurre entre bastidores.

Pasemos a algo mucho menos sexy, pero quizá mucho más útil comercialmente: construir modelos a partir de simples datos tabulares.

Jerga: Tabular

Datos en forma de tabla, como los de una hoja de cálculo, una base de datos o un archivo de valores separados por comas (CSV). Un modelo tabular es un modelo que intenta predecir una columna de una tabla basándose en la información de otras columnas de la tabla.

Resulta que eso también se parece mucho. Aquí tienes el código necesario para entrenar un modelo que prediga si una persona tiene ingresos elevados, basándose en sus antecedentes socioeconómicos:

from fastai.tabular.all import *
path = untar_data(URLs.ADULT_SAMPLE)

dls = TabularDataLoaders.from_csv(path/'adult.csv', path=path, y_names="salary",
    cat_names = ['workclass', 'education', 'marital-status', 'occupation',
                 'relationship', 'race'],
    cont_names = ['age', 'fnlwgt', 'education-num'],
    procs = [Categorify, FillMissing, Normalize])

learn = tabular_learner(dls, metrics=accuracy)

Como ves, tuvimos que decirle a fastai qué columnas son categóricas (contienen valores que son uno de un conjunto discreto de opciones, como occupation) frente a continuas (contienen un número que representa una cantidad, como age).

No hay ningún modelo preentrenado disponible para esta tarea (en general, los modelos preentrenados no están ampliamente disponibles para ninguna tarea de modelado tabular, aunque algunas organizaciones los han creado para uso interno),por lo que no utilizamos fine_tune en este caso. En su lugar, utilizamosfit_one_cycle, el método más utilizado para entrenar modelos fastai desde cero (es decir, sin aprendizaje por transferencia):

learn.fit_one_cycle(3)
época tren_pérdida pérdida_válida precisión tiempo
0 0.359960 0.357917 0.831388 00:11
1 0.353458 0.349657 0.837991 00:10
2 0.338368 0.346997 0.843213 00:10

Este modelo utiliza el conjunto de datos Adultos del artículo"Scaling Up the Accuracy of Naive-Bayes Classifiers: a Decision-Tree Hybrid" de Ron Kohavi, que contiene algunos datos demográficos sobre individuos (como su educación, estado civil, raza, sexo y si tienen unos ingresos anuales superiores a 50.000 $). El modelo tiene una precisión superior al 80% y tardó unos 30 segundos en entrenarse.

Veamos uno más. Los sistemas de recomendación son importantes, sobre todo en el comercio electrónico. Empresas como Amazon y Netflix se esfuerzan por recomendar productos o películas que puedan gustar a los usuarios. He aquí cómo entrenar un modelo que prediga películas que puedan gustar a la gente basándose en sus hábitos de visionado anteriores, utilizando el conjunto de datos MovieLens:

from fastai.collab import *
path = untar_data(URLs.ML_SAMPLE)
dls = CollabDataLoaders.from_csv(path/'ratings.csv')
learn = collab_learner(dls, y_range=(0.5,5.5))
learn.fine_tune(10)
época tren_pérdida pérdida_válida tiempo
0 1.554056 1.428071 00:01
época tren_pérdida pérdida_válida tiempo
0 1.393103 1.361342 00:01
1 1.297930 1.159169 00:00
2 1.052705 0.827934 00:01
3 0.810124 0.668735 00:01
4 0.711552 0.627836 00:01
5 0.657402 0.611715 00:01
6 0.633079 0.605733 00:01
7 0.622399 0.602674 00:01
8 0.629075 0.601671 00:00
9 0.619955 0.601550 00:01

Este modelo está prediciendo valoraciones de películas en una escala de 0,5 a 5,0 con un error medio de 0,6 aproximadamente. Como estamos prediciendo un número continuo, en lugar de una categoría, tenemos que decirle a fastai qué rango tiene nuestro objetivo, utilizando el parámetro y_range.

Aunque en realidad no estamos utilizando un modelo preentrenado (por la misma razón que no lo hicimos para el modelo tabular), este ejemplo muestra que fastai nos permite utilizar fine_tune de todos modos en este caso (aprenderás cómo y por qué funciona esto enel Capítulo 5). A veces es mejor experimentar con fine_tune frente a fit_one_cycle para ver cuál funciona mejor para tu conjunto de datos.

Podemos utilizar la misma llamada a show_results que vimos antes para ver algunos ejemplos de ID de usuario y de película, valoraciones reales y predicciones:

learn.show_results()
userId movieId valoración rating_pred
0 157 1200 4.0 3.558502
1 23 344 2.0 2.700709
2 19 1221 5.0 4.390801
3 430 592 3.5 3.944848
4 547 858 4.0 4.076881
5 292 39 4.5 3.753513
6 529 1265 4.0 3.349463
7 19 231 3.0 2.881087
8 475 4963 4.0 4.023387
9 130 260 4.5 3.979703

Cada uno de los modelos que entrenamos presentaba una pérdida de entrenamiento y otra de validación. Un buen conjunto de validación es una de las piezas más importantes del proceso de entrenamiento. Veamos por qué y aprendamos a crear uno.

Conjuntos de validación y conjuntos de prueba

Como ya hemos dicho, el objetivo de un modelo es hacer predicciones sobre los datos. Pero el proceso de entrenamiento de un modelo es fundamentalmente tonto. Si entrenáramos un modelo con todos nuestros datos y luego evaluáramos el modelo con esos mismos datos, no podríamos saber lo bien que puede funcionar nuestro modelo con datos que no ha visto. Sin esta información tan valiosa que nos guíe en el entrenamiento de nuestro modelo, hay muchas posibilidades de que sea bueno haciendo predicciones sobre esos datos, pero que no funcione bien con datos nuevos.

Para evitarlo, nuestro primer paso fue dividir nuestro conjunto de datos en dos conjuntos: el conjunto de entrenamiento (que nuestro modelo ve en el entrenamiento) y el conjunto de validación, también conocido como conjunto de desarrollo(que se utiliza sólo para la evaluación). Esto nos permite comprobar que el modelo aprende lecciones de los datos de entrenamiento que generaliza a los nuevos datos, los datos de validación.

Una forma de entender esta situación es que, en cierto sentido, no queremos que nuestro modelo obtenga buenos resultados "haciendo trampas". Si hace una predicción exacta para un dato, debe ser porque ha aprendido las características de ese tipo de dato, y no porque el modelo haya sido moldeado por haber visto realmente ese dato concreto.

Separar nuestros datos de validación significa que nuestro modelo nunca los ve en el entrenamiento y, por tanto, no se ve afectado en absoluto por ellos, y no está haciendo trampas de ningún tipo. ¿No es así?

De hecho, no necesariamente. La situación es más sutil. Esto se debe a que, en escenarios realistas, rara vez construimos un modelo entrenando sus parámetros una sola vez. En lugar de eso, es probable que exploremos muchas versiones de un modelo mediante diversas elecciones de modelado relativas a la arquitectura de la red, los ritmos de aprendizaje, las estrategias de aumento de datos y otros factores que trataremos en próximos capítulos. Muchas de estas elecciones pueden describirse como elecciones de hiperparámetros. La palabra refleja queson parámetros sobre parámetros, ya que son las elecciones de nivel superior que rigen el significado de los parámetros de peso.

El problema es que, aunque el proceso de entrenamiento ordinario sólo tiene en cuenta las predicciones de los datos de entrenamiento cuando aprende los valores de los parámetros de peso, nosotros no hacemos lo mismo. Nosotros, como modeladores, evaluamos el modelo teniendo en cuenta las predicciones de los datos de validación cuando decidimos explorar nuevos valores de los hiperparámetros. Así que las versiones posteriores del modelo están, indirectamente, moldeadas por nosotros al haber visto los datos de validación. Al igual que el proceso de entrenamiento automático corre el riesgo de sobreajustar los datos de entrenamiento, nosotros corremos el riesgo de sobreajustar los datos de validación mediante el ensayo y error y la exploración humanos.

La solución a este enigma es introducir otro nivel de datos aún más reservados: el conjunto de prueba. Del mismo modo que ocultamos los datos de validación al proceso de entrenamiento, debemos ocultarnos a nosotros mismos los datos del conjunto de prueba . No se pueden utilizar para mejorar el modelo; sólo se pueden utilizar para evaluar el modelo al final de nuestros esfuerzos. En efecto, definimos una jerarquía de recortes de nuestros datos, basada en lo completamente que queremos ocultarlos de los procesos de entrenamiento y modelado: los datos de entrenamiento están totalmente expuestos, los datos de validación están menos expuestos, y los datos de prueba están totalmente ocultos. Esta jerarquía es paralela a los distintos tipos de procesos de modelado y evaluación propiamente dichos: el proceso de entrenamiento automático con retropropagación, el proceso más manual de probar distintos hiperparámetros entre sesiones de entrenamiento y la evaluación de nuestro resultado final.

Los conjuntos de prueba y validación deben tener suficientes datos para garantizar queobtienes una buena estimación de tu precisión. Si estás creando un detector de gatos, por ejemplo, generalmente querrás al menos 30 gatos en tu conjunto de validación. Eso significa que si tienes un conjunto de datos con miles de elementos, utilizar el tamaño predeterminado del conjunto de validación del 20% puede ser más de lo que necesitas. Por otra parte, si tienes muchos datos, utilizar parte de ellos para la validación probablemente no tenga ningún inconveniente.

Tener dos niveles de "datos reservados" -un conjunto de validación y un conjunto de prueba, con un nivel que representa datos que prácticamente te ocultas a ti mismo- puede parecer un poco extremo. Pero a menudo es necesario porque los modelos tienden a gravitar hacia la forma más sencilla de hacer buenas predicciones (memorización), y nosotros, como humanos falibles, tendemos a gravitar hacia engañarnos a nosotros mismos sobre lo bien que funcionan nuestros modelos. La disciplina del conjunto de pruebas nos ayuda a mantenernos intelectualmente honestos. Eso no significa que siempre necesitemos un conjunto de pruebas independiente -si tienes muy pocos datos, puede que sólo necesites un conjunto de validación-, pero en general es mejor utilizar uno si es posible.

Esta misma disciplina puede ser crítica si pretendes contratar a un tercero para que realice el trabajo de modelado en tu nombre. Es posible que un tercero no comprenda tus requisitos con exactitud, o incluso que sus incentivos le animen a malinterpretarlos. Un buen conjunto de pruebas puede mitigar en gran medida estos riesgos y permitirte evaluar si su trabajo resuelve tu problema real.

Para decirlo sin rodeos, si eres un alto responsable de la toma de decisiones en tu organización (o asesoras a altos responsables de la toma de decisiones), lo más importante es lo siguiente: si te aseguras de que entiendes realmente qué son los conjuntos de prueba y validación y por qué son importantes, evitarás la mayor fuente de fracasos que hemos visto cuando las organizaciones deciden utilizar la IA. Por ejemplo, si estás pensando en contratar a un proveedor o servicio externo, asegúrate de que retienes algunos datos de prueba que el proveedor nunca llegue a ver. Luego comprueba su modelo con tus datos de prueba, utilizando una métrica que elijas basándote en lo que realmente te importa en la práctica , y decide qué nivel de rendimiento es adecuado. (También es una buena idea que pruebes tú mismo una línea de base sencilla, para que sepas lo que puede conseguir un modelo realmente sencillo. A menudo resultará que tu modelo simple funciona igual de bien que uno elaborado por un "experto" externo).

Utiliza tu criterio para definir los conjuntos de pruebas

Para hacer un buen trabajo definiendo un conjunto de validación (y posiblemente un conjunto de prueba), a veces querrás hacer algo más que tomar al azar una fracción de tu conjunto de datos original. Recuerda: una propiedad clave de los conjuntos de validación y prueba es que deben ser representativos de los nuevos datos que verás en el futuro. ¡Esto puede parecer una orden imposible! Por definición, aún no has visto esos datos. Pero lo normal es que aún sepas algunas cosas.

Es instructivo ver algunos casos de ejemplo. Muchos de estos ejemplos proceden de concursos de modelización predictiva en laplataformaKaggle, que es una buena representación de los problemas y métodos que podrías ver en la práctica.

Un caso podría ser si estás analizando datos de series temporales. Para una serie temporal, elegir un subconjunto aleatorio de los datos será a la vez demasiado fácil (puedesmirar los datos tanto antes como después de las fechas que intentas predecir) y no representativo de la mayoría de los casos de uso empresarial (en los que utilizas datos históricos para construir un modelo que utilizarás en el futuro). Si tus datos incluyen la fecha y estás construyendo un modelo para utilizarlo en el futuro, querrás elegir una sección continua con las fechas más recientes como conjunto de validación (por ejemplo, las dos últimas semanas o el último mes de datos disponibles).

Supón que quieres dividir los datos de las series temporales de la Figura 1-19en conjuntos de entrenamiento y de validación.

A serie of values
Figura 1-19. Una serie temporal

Un subconjunto aleatorio es una mala elección (es demasiado fácil rellenar los huecos y no es indicativo de lo que necesitarás en producción), como podemos ver en la Figura 1-20.

Random training subset
Figura 1-20. Un subconjunto de entrenamiento deficiente

En su lugar, utiliza los datos anteriores como conjunto de entrenamiento (y los datos posteriores para el conjunto de validación), como se muestra en la Figura 1-21.

Training subset using the data up to a certain timestamp
Figura 1-21. Un buen subconjunto de entrenamiento

Por ejemplo, Kaggle organizó un concurso parapredecir las ventas en una cadena de tiendas de comestibles ecuatoriana. Los datos de entrenamiento de Kaggleiban desde el 1 de enero de 2013 hasta el 15 de agosto de 2017, y los datos de prueba abarcaban desde el 16 de agosto de 2017 hasta el 31 de agosto de 2017. De este modo, el organizador del concurso se aseguró de que los participantes hicieran predicciones para un periodo de tiempo que estabaen el futuro, desde la perspectiva de su modelo. Esto es similar a la forma en que los operadores de fondos de cobertura cuantitativos hacen backtesting para comprobar si sus modelos predicen periodos futuros, basándose en datos pasados.

Un segundo caso común ocurre cuando puedes prever fácilmente la forma en que los datos para los que harás predicciones en producción pueden ser cualitativamente diferentes de los datos con los que tienes que entrenar tu modelo.

En elconcurso de conductores distraídos de Kaggle, las variables independientes son fotos de conductores al volante de un coche, y las variables dependientes son categorías como enviar mensajes de texto, comer o mirar hacia delante con seguridad. Muchas fotos son de los mismos conductores en distintas posiciones, como podemos ver enla Figura 1-22. Si fueras una compañía de seguros que construye un modelo a partir de estos datos, ten en cuenta que lo que más te interesaría es saber cómo se comporta el modelo con conductores que no ha visto antes (ya que probablemente sólo dispondrías de datos de entrenamiento de un pequeño grupo de personas). En reconocimiento de esto, los datos de prueba del concurso consisten en imágenes de personas que no aparecen en el conjunto de entrenamiento.

Two pictures from the training data, showing the same driver
Figura 1-22. Dos imágenes de los datos de entrenamiento

Si pones una de las imágenes de la Figura 1-22 en tu conjunto de entrenamiento y otra en el conjunto de validación, a tu modelo le resultará fácil hacer una predicción para la del conjunto de validación, por lo que parecerá que funciona mejor de lo que lo haría con personas nuevas. Otra perspectiva es que si utilizas a todas las personas en el entrenamiento de tu modelo, éste podría estar sobreajustándose a las particularidades de esas personas concretas y no sólo aprendiendo los estados (enviando mensajes de texto, comiendo, etc.).

Una dinámica similar se puso en marcha en elconcurso de pesca de Kaggle para identificar las especies de peces capturadas por los barcos pesqueros con el fin de reducir la pesca ilegal de poblaciones en peligro de extinción. El conjunto de pruebas deestaba formado por imágenes de barcos que no aparecían en los datos de entrenamiento, así que en este caso querrías que tu conjunto de validación también incluyera barcos que no están en el conjunto de entrenamiento.

A veces puede que no esté claro en qué diferirán tus datos de validación. Por ejemplo, para un problema que utilice imágenes de satélite, necesitarías reunir más información sobre si el conjunto de entrenamiento contenía sólo determinadas ubicaciones geográficas o procedía de datos geográficamente dispersos.

Ahora que ya sabes cómo construir un modelo, puedes decidir en qué quieres profundizar a continuación.

Un momento "Elige tu propia aventura

Si quieres saber más sobre cómo utilizar modelos de aprendizaje profundo en la práctica, incluido cómo identificar y corregir errores, crear una aplicación web que funcione de verdad y evitar que tu modelo cause daños inesperados a tu organización o a la sociedad en general, sigue leyendo los dos capítulos siguientes. Si quieres empezar a aprender los fundamentos de cómo funciona el aprendizaje profundo bajo el capó, pasa al Capítulo 4. (¿Leíste alguna vez de niño libros de "Elige tu propia aventura"? Pues esto es algo parecido... excepto que con más aprendizaje profundo del que contenía esa serie de libros).

Tendrás que leer todos estos capítulos para avanzar en el libro, pero el orden en que los leas depende totalmente de ti. No dependen unos de otros. Si te saltas el capítulo 4, te recordaremos al final que vuelvas y leas los capítulos que te has saltado antes de seguir avanzando.

Cuestionario

Después de leer páginas y páginas de prosa, puede ser difícil saber en qué cosas clave debes centrarte y recordar. Por eso, hemos preparado una lista de preguntas y pasos sugeridos para completar al final de cada capítulo. Todas las respuestas están en el texto del capítulo, así que si no estás seguro de algo, relee esa parte del texto y asegúrate de que la entiendes. Las respuestas a todas estas preguntas también están disponibles en el sitio web del libro. También puedes visitar los foros si te quedas atascado para obtener ayuda de otras personas que estén estudiando este material.

Para más preguntas, incluidas respuestas detalladas y enlaces a la línea de tiempo del vídeo, echa un vistazo a los aiquizzes de Radek Osmulski.

  1. ¿Los necesitas para el aprendizaje profundo?

    • Muchas matemáticas T/F

    • Muchos datos T/F

    • Muchos ordenadores caros T/F

    • A Doctorado T/F

  2. Nombra cinco áreas en las que el aprendizaje profundo es ahora la mejor herramienta del mundo.

  3. ¿Cómo se llamaba el primer aparato basado en el principio de la neurona artificial?

  4. Basándote en el libro del mismo nombre, ¿cuáles son los requisitos del procesamiento distribuido paralelo (PDP)?

  5. ¿Cuáles fueron los dos malentendidos teóricos que frenaron el campo de las redes neuronales?

  6. ¿Qué es una GPU?

  7. Abre un cuaderno y ejecuta una celda que contenga: 1+1. ¿Qué ocurre?

  8. Sigue cada celda de la versión despojada del cuaderno de este capítulo. Antes de ejecutar cada celda, adivina qué ocurrirá.

  9. Completa el apéndice online de Jupyter Notebook.

  10. ¿Por qué es difícil utilizar un programa informático tradicional para reconocer imágenes en una foto?

  11. ¿Qué quería decir Samuel con "asignación de peso"?

  12. ¿Qué término utilizamos normalmente en el aprendizaje profundo para lo que Samuel llamaba "pesos"?

  13. Haz un dibujo que resuma la visión de Samuel de un modelo de aprendizaje automático.

  14. ¿Por qué es difícil entender por qué un modelo de aprendizaje profundo hace unapredicción concreta?

  15. ¿Cómo se llama el teorema que demuestra que una red neuronal puede resolver cualquier problema matemático con cualquier nivel de precisión?

  16. ¿Qué necesitas para entrenar un modelo?

  17. ¿Cómo podría influir un bucle de retroalimentación en el despliegue de un modelo policial predictivo?

  18. ¿Tenemos que utilizar siempre imágenes de 224×224 píxeles con el modelo de reconocimiento de gatos?

  19. ¿Cuál es la diferencia entre clasificación y regresión?

  20. ¿Qué es un conjunto de validación? ¿Qué es un conjunto de prueba? ¿Por qué los necesitamos?

  21. ¿Qué hará fastai si no proporcionas un conjunto de validación?

  22. ¿Podemos utilizar siempre una muestra aleatoria para un conjunto de validación? ¿Por qué sí o por qué no?

  23. ¿Qué es el sobreajuste? Pon un ejemplo.

  24. ¿Qué es una métrica? ¿En qué se diferencia de la pérdida?

  25. ¿Cómo pueden ayudar los modelos preentrenados?

  26. ¿Qué es la "cabeza" de un modelo?

  27. ¿Qué tipo de características encuentran las primeras capas de una CNN? ¿Y las capas posteriores?

  28. ¿Son útiles los modelos de imagen sólo para las fotos?

  29. ¿Qué es una arquitectura?

  30. ¿Qué es la segmentación?

  31. ¿Para qué sirve y_range? ¿Cuándo lo necesitamos?

  32. ¿Qué son los hiperparámetros?

  33. ¿Cuál es la mejor manera de evitar fracasos al utilizar la IA en una organización?

Investigación adicional

Cada capítulo tiene también una sección de "Investigación adicional" que plantea algunas preguntas que no se responden completamente en el texto, o da tareas más avanzadas. Las respuestas a estas preguntas no están en el sitio web del libro; ¡tendrás que investigar por tu cuenta!

  1. ¿Por qué es útil una GPU para el aprendizaje profundo? ¿En qué se diferencia una CPU y por qué es menos eficaz para el aprendizaje profundo?

  2. Intenta pensar en tres áreas en las que los bucles de retroalimentación podrían influir en el uso del aprendizaje automático. Mira a ver si puedes encontrar ejemplos documentados de que eso ocurra en la práctica.

Get Aprendizaje profundo para programadores con fastai y PyTorch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.