什么是深度学习?

深度学习是使用“深度”神经网络的机器学习技术的总称。 如今,深度学习是机器学习最引人注目的领域之一,因为它在计算机视觉、自然语言处理等领域以及(应用于强化学习时的)游戏、决策和模拟等场景中都取得了成功。

深度学习成功的关键因素是数据、计算、软件框架和运行时的可用性,它们有助于创建神经网络模型及其推理的执行。 此类框架的示例包括 TensorFlow、(Py)Torch 和 ONNX。

ML.NET 提供对其中一些框架的访问权限。 因此,ML.NET 用户无需从头开始即可利用深度学习模型。

深度学习与机器学习

深度学习依赖于神经网络算法。 这与传统或经典机器学习技术形成对比,后者使用更广泛的算法,例如通用线性模型、决策树或支持向量机(SVM)。 这种差异最直接、最实际的影响是深度学习方法可能更适合某种数据。 在一些情况下,传统的机器学习技术(例如梯度提升树 (XGBoost、LightGBM 和 CatBoost) )似乎在表格数据方面具有优势。 对于结构化程度较低的数据(例如文本和图像),神经网络往往表现得更好。 最佳方法是始终试验特定数据源和用例,从而确定哪些技术最适合你的问题。

对于经典机器学习任务,ML.NET 通过自动化机器学习(AutoML)简化了此试验过程。 有关 AutoML 的详细信息,请参阅什么是自动机器学习(AutoML) ?一文。

神经网络体系结构

深度学习的主要区别特征之一是使用人工神经网络算法。 概括而言,可以将神经网络视为“处理单元”的配置,其中每个单元的输出构成另一个单元的输入。 其中每个单元都可以接受一个或多个输入,并实质上执行其输入的加权总和,应用偏移(或“偏差”),然后应用非线性转换函数(称为“激活”)。 这些组件的不同排列方式用于描述分类、回归函数和其他机器学习任务核心结构中的决策边界。

关系图展示了神经网络中的单层

在过去的十年里,深度学习的案例、应用和技术都有所增长。 这种增长的部分原因是可纳入神经网络的操作种类不断增加,这些操作可以配置在更丰富的安排中,并且改进了对这些改进的计算支持。 通常,神经网络体系结构可以分为以下类别:

  • 前馈神经网络
  • 卷积神经网络
  • 递归神经网络
  • 生成对抗网络
  • Transformers

有关更多详细信息,请参阅人工神经网络指南

深度学习的用途是什么?

深度学习体系结构在涉及图像、音频和自由格式文本等“非结构化数据”的任务中表现良好。 因此,深度学习已用于解决如下问题:

  • 图像分类
  • 音频分类
  • 翻译
  • 文本生成
  • 文本分类

ML.NET 中的深度学习

从头开始训练深度学习模型需要设置多个参数、大量已标记的训练数据和海量计算资源(数百个 GPU 小时)。 ML.NET 使你能够使用预先训练的模型和知识转移技术(例如迁移学习和微调)来缩短此过程。

ML.NET 还使你能够导入在其他框架中训练的模型,并将其用于 .NET 应用程序。

根据具体场景,可以使用本地 GPU 和 Azure GPU 计算资源来训练和使用深度学习模型。

训练自定义模型

ML.NET 提供了用于训练自定义深度学习模型的 API,并使用这些 API 在 .NET 应用程序内进行预测。

这些 API 由TorchSharpTensorFlow.NET提供支持。

图像分类

在 ML.NET 中,可以使用 API ImageClassification集训练自定义图像分类模型。

ML.NET 中的图像分类训练管道可能如下所示:

//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");

要开始在 ML.NET 中训练自定义图像分类模型,请参阅使用 Model Builder 在 Azure 中训练图像分类模型

对象检测

ML.NET 使你能够使用 Azure 机器学习在 Model Builder 中训练自定义对象检测模型。 只需要带有标签的数据集,其中包含边界框信息和边界框中对象所属的类别。

训练过程的结果是 ONNX 模型,然后该模型可以与ApplyOnnxModel 转换一起使用以进行预测。

目前,ML.NET 中没有对对象检测的本地支持。

要使用 ML.NET 训练自定义对象检测模型,请参阅使用 Model Builder 检测停止登录图像教程

文本分类

对自由格式文本(无论是客户评论还是商务备忘录)进行分类是许多流程的重要组成部分。

在 ML.NET 中,可以使用 API TextClassificationTrainer集训练自定义文本分类模型。 用于在 ML.NET 中训练自定义文本分类模型的技术称为微调。 微调使你能够采用预先训练的模型,并使用自己的数据重新训练特定于域或问题的层。 这便于你拥有更定制的模型以解决问题,无需从头开始训练整个模型的过程。 文本分类 API 使用的预训练模型是NAS-BERT的 TorchSharp 实现。

ML.NET 中的文本分类训练管道可能如下所示:

// 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");

要开始使用 ML.NET 训练文本分类模型,请参阅使用 ML.NET Model Builder 在 Web 应用程序中分析网站评论的情绪教程

句子相似性

语义搜索等任务依赖于确定两个句子或文本段落之间的相似程度。

ML.NET 提供了 API SentenceSimilarityTrainer集,这些 API 使用与TextClassificationTrainer相同的基础模型和微调技术。 但是,它会生成表示两个段落相似程度的数字值,而不是生成类别作为输出。

用于 ML.NET 中句子相似性的训练和推理管道可能如下所示:

// 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");

要开始使用句子相似性,请参阅dotnet/machinelearning-samples 存储库中的示例。

使用预先训练的模型

ML.NET 提供 API 以按其他格式(例如 TensorFlow 和 ONNX)使用模型,并将其用于在 .NET 应用程序内进行预测。

这些 API 由TensorFlow.NETONNX 运行时提供支持。

TensorFlow

TensorFlow 是一个深度学习框架,具有丰富的生态系统和 Tensorflow 中心中提供的各种预先训练的模型。

使用 ML.NET,可以采用这些预先训练的 TensorFlow 模型,并将其用于在 .NET 应用程序内进行推理。

使用预先训练的 TensorFlow 模型的推理管道可能如下所示:

// 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");

要开始通过 ML.NET 使用预先训练的 TensorFlow 模型,请参阅在 ML.NET 中使用预先训练的 TensorFlow 模型进行电影评论情绪分析教程

ONNX

Open Neural Network Exchange (ONNX) 是一种开源格式,旨在实现机器学习框架与深度学习框架之间的互操作性。 这意味着,你可以在许多常见的机器学习框架(如 PyTorch)中训练模型,将其转换为 ONNX 格式,并在其他框架(如 ML.NET)中使用该 ONNX 模型。

ONNX 模型存储库托管了多个预先训练的 ONNX 模型,这些模型可用于各种任务中的推理。

使用 ML.NET,可以采用这些预先训练的 ONNX 模型,并将其用于在 .NET 应用程序内进行推理。

使用预先训练的 ONNX 模型的推理管道可能如下所示:

// 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);

若要开始通过 ML.NET 使用预先训练的 ONNX 模型,请参阅在 ML.NET 中使用 ONNX 进行对象检测教程。