什么是深度学习?

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

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

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

深度学习与机器学习

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

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

神经网络体系结构

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

表示神经网络关系图

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

  • 前馈神经网络
  • 卷积神经网络
  • 递归神经网络
  • 生成对抗网络
  • 变形金刚

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

可以针对哪些内容使用深度学习?

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

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

ML.NET 中的深度学习

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

ML.NET 还允许导入在其他框架中训练的模型,并在 .NET 应用程序中使用这些模型。

根据方案,可以使用本地 GPU 以及 Azure GPU 计算资源来训练和使用深度学习模型。

训练自定义模型

ML.NET 提供 API 来训练自定义深度学习模型,并使用它们在 .NET 应用程序中进行预测。

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

图像分类

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

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

//Append ImageClassification trainer to the pipeline containing any preprocessing transforms.
pipeline
    .Append(mlContext.MulticlassClassification.Trainers.ImageClassification(featureColumnName: "Image")
    .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel");

// Train the model.
var model = pipeline.Fit(trainingData);

// Use the model for inferencing.
var predictedData = model.Transform(newData).GetColumn<string>("PredictedLabel");

若要开始在 ML.NET 中训练自定义图像分类模型,请参阅 使用模型生成器在 Azure 中训练图像分类模型。

对象检测

ML.NET 使你能够使用 Azure 机器学习在模型生成器中训练自定义对象检测模型。 只需要一个标记的数据集,其中包含边界框信息以及边界框中对象所属的类别。

训练过程的结果是一个 ONNX 模型,可以结合 ApplyOnnxModel 转换来进行预测。

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

若要使用 ML.NET 训练自定义对象检测模型,请参考 使用 Model Builder 教程检测图像中的停车标志。

文本分类

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

在 ML.NET 中,可以使用 TextClassificationTrainer 组 API 来训练自定义文本分类模型。 用于在 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 the 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 提供了 SentenceSimilarityTrainer 组 API,这些 API 使用与 TextClassificationTrainer相同的基础模型和微调技术。 但是,它不生成类别作为输出,而是生成一个数值,表示两段的相似程度。

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

// Define the pipeline.
var pipeline = mlContext.Regression.Trainers.SentenceSimilarity(sentence1ColumnName: "Sentence", sentence2ColumnName: "Sentence2");

// Train the 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)使用模型,并使用这些 API 在 .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

开放神经网络交换(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 进行对象检测教程。