¿Qué es el aprendizaje profundo?
El aprendizaje profundo es un término genérico para designar las técnicas de aprendizaje automático que usan redes neuronales "profundas". En la actualidad, el aprendizaje profundo es una de las áreas más visibles del aprendizaje automático dado su éxito en ámbitos como Computer Vision y el procesamiento de lenguaje natural y, cuando se aplica al aprendizaje de refuerzo, en escenarios como los videojuegos, la toma de decisiones y las simulaciones.
Un elemento crucial para el éxito del aprendizaje profundo ha sido la disponibilidad de datos, procesos, marcos de software y entornos de ejecución que facilitan la creación de modelos de redes neuronales y su ejecución para la inferencia. Algunos ejemplos de estos marcos son TensorFlow, (Py)Torch y ONNX.
ML.NET proporciona acceso a algunos de estos marcos. Como resultado, los usuarios de ML.NET pueden sacar partido de los modelos de aprendizaje profundo sin tener que empezar desde cero.
Aprendizaje profundo frente a aprendizaje automático
El aprendizaje profundo se basa en algoritmos de redes neuronales. Esto difiere de las técnicas de aprendizaje automático tradicionales o clásicas, que emplean una variedad más amplia de algoritmos, como modelos lineales generalizados, árboles de decisión o máquinas de vectores de soporte (SVM). La implicación práctica más inmediata de esta diferencia es que los métodos de aprendizaje profundo pueden ser más adecuados con algunos tipos de datos. Algunas técnicas de aprendizaje automático clásicas, como los árboles potenciados por gradientes (XGBoost, LightGBM y CatBoost), parecen ser más ventajosas con los datos tabulares. Cuando los datos están menos estructurados, como texto o las imágenes, las redes neuronales tienden a funcionar mejor. El mejor método consiste siempre experimentar con el origen de datos y el caso de uso concretos para determinar qué técnicas son mejor en función del problema.
ML.NET simplifica el proceso de experimentación de las tareas de aprendizaje automático clásicas a través del aprendizaje automático automatizado (AutoML). Para obtener más información sobre AutoML, consulte el artículo ¿Qué es el aprendizaje automático automatizado (AutoML)?
Arquitecturas de redes neuronales
Una de las principales características diferenciadoras del aprendizaje profundo es el uso de algoritmos de redes neuronales artificiales. En términos generales, las redes neuronales se pueden considerar como una configuración de "unidades de procesamiento", donde la salida de cada unidad es la entrada de otra. Cada una de estas unidades puede tomar una o varias entradas y, básicamente, realiza una suma ponderada de sus entradas, aplica una compensación (o "sesgo") y, seguidamente, una función de transformación no lineal (denominada "activación"). Estos componentes se han dispuesto de distintas maneras para describir los límites de decisión en las funciones de clasificación y de regresión y en otras estructuras centrales de las tareas de aprendizaje automático.
En la última década se ha producido un aumento de los casos, los usos prácticos y las técnicas de aprendizaje profundo. Este aumento se basa, en parte, en que cada vez hay más operaciones de diversa índole que se pueden incorporar a las redes neuronales, en que estas operaciones pueden disponerse en configuraciones cada vez más sofisticadas y en que estas mejoras se pueden calcular de mejor forma. En general, las arquitecturas de redes neuronales se pueden agrupar en las siguientes categorías:
- Red neuronal de reenvío de fuentes
- Red neuronal convolucional
- Red neuronal recurrente
- Red generativa antagónica
- Transformadores
Para obtener más información, vea la guía de redes neuronales artificiales.
¿Para qué sirve el aprendizaje profundo?
Se ha demostrado que las arquitecturas de aprendizaje profundo logran un buen rendimiento en tareas donde se usan "datos no estructurados", como imágenes, audio y texto de forma libre. Como consecuencia de ello, el aprendizaje profundo se ha usado para resolver problemas como los siguientes:
- Clasificación de imágenes
- Clasificación de audio
- Traducción
- Generación de texto
- Clasificación de textos
Aprendizaje profundo en ML.NET
Entrenar un modelo de aprendizaje profundo desde cero requiere establecer varios parámetros, una enorme cantidad de datos de entrenamiento etiquetados y una gran cantidad de recursos informáticos (cientos de horas de GPU). Con ML.NET, este proceso puede atajarse mediante el uso de modelos previamente entrenados y técnicas de transferencia de conocimientos como, por ejemplo, el aprendizaje por transferencia y el ajuste preciso.
ML.NET también permite importar modelos entrenados en otros marcos y consumirlos en sus aplicaciones .NET.
Dependiendo del escenario, se pueden usar recursos de proceso tanto de la GPU local como de la GPU de Azure para entrenar y consumir modelos de aprendizaje profundo.
Entrenar modelos personalizados
ML.NET proporciona API para entrenar modelos de aprendizaje profundo personalizados y usarlos para realizar predicciones en su aplicación .NET.
Estas API se basan en las tecnologías TorchSharp y TensorFlow.NET.
Clasificación de imágenes
En ML.NET se puede usar el conjunto de API ImageClassification para entrenar modelos de clasificación de imágenes personalizados.
Una canalización de entrenamiento de clasificación de imágenes de ML.NET podría tener un aspecto parecido a este:
//Append ImageClassification trainer to your pipeline containing any preprocessing transforms
pipeline
.Append(mlContext.MulticlassClassification.Trainers.ImageClassification(featureColumnName: "Image")
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel");
// Train your model
var model = pipeline.Fit(trainingData);
// Use your model for inferencing
var predictedData = model.Transform(newData).GetColumn<string>("PredictedLabel");
Para empezar a entrenar modelos de clasificación de imágenes personalizados en ML.NET, consulte Entrenamiento de un modelo de clasificación de imágenes en Azure mediante Model Builder.
Detección de objetos
ML.NET permite entrenar modelos de detección de objetos personalizados en Model Builder mediante Azure Machine Learning. Lo único que se necesita es un conjunto de datos etiquetado que contenga información de rectángulos de selección y las categorías a las que pertenecen los objetos de esos rectángulos de selección.
El resultado del proceso de entrenamiento es un modelo ONNX que se puede usar con la transformación ApplyOnnxModel para realizar predicciones.
Actualmente no existe compatibilidad local con la detección de objetos en ML.NET.
Para entrenar modelos de detección de objetos personalizados con ML.NET, consulte el tutorial Detección de señales de stop en imágenes con Model Builder.
Clasificación de textos
La clasificación de texto de forma libre, ya sea en reseñas de clientes o en informes empresariales, es una parte importante de muchos procesos.
En ML.NET se puede usar el conjunto de API TextClassificationTrainer para entrenar modelos de clasificación de texto personalizados. La técnica utilizada para entrenar modelos de clasificación de texto personalizados en ML.NET se conoce como ajuste preciso. El ajuste preciso permite tomar un modelo entrenado previamente y volver a entrenar las capas que sean específicas del dominio o del problema usando sus propios datos. Esto reporta la ventaja de que tener un modelo hecho más a medida para resolver el problema, sin tener que pasar por el proceso de entrenamiento de todo el modelo desde cero. El modelo entrenado previamente usado por la API de clasificación de texto es una implementación de TorchSharp de NAS-BERT.
Una canalización de entrenamiento de clasificación de texto de ML.NET podría tener un aspecto parecido a este:
// Define training pipeline using TextClassification trainer
var pipeline =
mlContext.Transforms.Conversion.MapValueToKey("Label","Sentiment")
.Append(mlContext.MulticlassClassification.Trainers.TextClassification(sentence1ColumnName: "Text"))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// Train your model
var model = pipeline.Fit(trainingData);
// Use your model to make predictions
var predictedData = model.Transform(newData).GetColumn<string>("PredictedLabel");
Para empezar a entrenar modelos de clasificación de texto con ML.NET, consulte el tutorial Análisis de opiniones de comentarios de sitios web en una aplicación web mediante ML.NET Model Builder.
Similitud de oraciones
Tareas como la búsqueda semántica se basan en poder determinar la similitud de dos oraciones o pasajes de texto entre sí.
ML.NET proporciona el conjunto de API SentenceSimilarityTrainer, que usan el mismo modelo subyacente y las mismas técnicas de ajuste preciso que .TextClassificationTrainer, pero, en vez de generar una categoría como salida, genera un valor numérico que representa la similitud de dos pasajes.
Una canalización de entrenamiento e inferencia de similitud de oraciones en ML.NET podría tener un aspecto parecido a este:
// Define your pipeline
var pipeline = mlContext.Regression.Trainers.SentenceSimilarity(sentence1ColumnName: "Sentence", sentence2ColumnName: "Sentence2");
// Train your model
var model = pipeline.Fit(trainingData);
// Use the model to make predictions and extract their similarity values
var score = model.Transform(newData).GetColumn<float>("Score");
Para empezar a trabajar con la similitud de oraciones, vea los ejemplos del repositorio dotnet/machinelearning-samples.
Consumo de modelos previamente entrenados
ML.NET proporciona varias API para consumir modelos en otros formatos, como TensorFlow y ONNX, y usarlos para realizar predicciones en su aplicación .NET.
Estas API se basan en las tecnologías TensorFlow.NET y de entorno de ejecución de ONNX.
TensorFlow
TensorFlow es un marco de aprendizaje profundo con un ecosistema muy completo y varios modelos previamente entrenados, disponibles en TensorFlow Hub.
Con ML.NET, puede recurrir a estos modelos de TensorFlow previamente entrenados y usarlos para la inferencia en sus aplicaciones .NET.
Una canalización de inferencia en la que se usa un modelo de TensorFlow previamente entrenado podría tener un aspecto parecido a este:
// Load TensorFlow model
TensorFlowModel tensorFlowModel = mlContext.Model.LoadTensorFlowModel(_modelPath);
//Append ScoreTensorFlowModel transform to your pipeline containing any preprocessing transforms
pipeline.Append(tensorFlowModel.ScoreTensorFlowModel(outputColumnName: "Prediction/Softmax", inputColumnName:"Features"))
// Create ML.NET model from pipeline
ITransformer model = pipeline.Fit(dataView);
var predictions = model.Transform(dataView).GetColumn<float>("Prediction/Softmax");
Para empezar a consumir modelos de TensorFlow previamente entrenados con ML.NET, consulte el tutorial Análisis de opiniones de críticas de películas mediante un modelo de TensorFlow previamente entrenado en ML.NET.
ONNX
Open Neural Network Exchange (ONNX) es un formato de código abierto diseñado para permitir la interoperabilidad entre marcos de aprendizaje automático y de aprendizaje profundo. Esto significa que puede entrenar un modelo en uno de los muchos marcos de aprendizaje automático populares, como PyTorch, convertirlo en formato ONNX y consumir el modelo ONNX en otro marco, como ML.NET.
El repositorio de modelos de ONNX hospeda varios modelos de ONNX previamente entrenados que puede usar para la inferencia en una amplia variedad de tareas.
Con ML.NET, puede recurrir a estos modelos de ONNX previamente entrenados y usarlos para la inferencia en sus aplicaciones .NET.
Una canalización de inferencia en la que se usa un modelo de ONNX previamente entrenado podría tener un aspecto parecido a este:
// Append ApplyOnnxModel transform to pipeline containing any preprocessing transforms
pipeline.Append((modelFile: modelLocation, outputColumnNames: new[] { TinyYoloModelSettings.ModelOutput }, inputColumnNames: new[] { TinyYoloModelSettings.ModelInput })
// Create ML.NET model from pipeline
var model = pipeline.Fit(data);
// Use the model to make predictions
var predictions = pipeline.Fit(data).GetColumn<float[]>(TinyYoloModelSettings.ModelOutput);
Para empezar a consumir modelos de ONNX previamente entrenados con ML.NET, consulte el tutorial Detección de objetos mediante ONNX en ML.NET.