惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
V
V2EX
博客园 - 【当耐特】
Vercel News
Vercel News
雷峰网
雷峰网
爱范儿
爱范儿
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
NISL@THU
NISL@THU
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
P
Proofpoint News Feed
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
I
InfoQ
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
AI
AI
Schneier on Security
Schneier on Security
B
Blog RSS Feed
T
Tor Project blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - Bean.Hsiang

评估和改进 ML.NET 分类器 ML.NET 和 Model Builder 2021年三月更新 ML.NET 推荐引擎中一类矩阵因子分解的缺陷 使用 ML.NET 实现峰值检测来排查异常 4倍速!ML.NET Model Builder GPU 与 CPU 对比测试 使用 ML.NET 识别乐高颜色块 ML.NET 十一月更新 借助AI激发组织创新活力 Virtual ML.NET Hackathon 2020 来啦 ML.NET 九月更新 ML.NET API 和工具八月更新 通过 ML.NET 使用预训练残差网络 ResNet 模型实现手势识别 在WSL2启用cuda进行深度学习尝鲜 基于 ONNX 在 ML.NET 中使用 Pytorch 训练的垃圾分类模型 在 Blazor WebAssembly 静态网站中部署ML.NET机器学习模型 使用 Scikit-learn 和 ML.NET 实现朴素贝叶斯(Naive Bayes)分类器 恢复已取消ML.NET训练中的模型 说说 ML.NET and AutoML 使用ML.NET进行自定义机器学习
通过 Continual Learning 提高 ML.NET 模型准确性并增强性能
Bean.Hsiang · 2020-07-06 · via 博客园 - Bean.Hsiang

从事机器学习的学者大多认为持续学习(Continual Learning)是迈向人工智能的根本一步。持续学习是模型模仿人类在整个生命周期中不断从数据流中学习、微调、转移知识和技能的能力。实际上,这意味着模型在进入新数据时能自主学习和适应生产。过去提出自动自适应学习(Auto-adaptive Learning),或持续自动机器学习(Continual AutoML)就是出于对这项能力的支持。在机器学习中,目标是通过生产环境部署模型,通过持续学习,我们希望使用进入生产环境的数据,并激活训练过程重新训练模型。

持续学习带来的好处是显而易见的,典型的就是商品销售推荐。随着不同时期客户流量的特点热销商品会发生变化,比如以往在运动季节买饮料的客户,过了几个月会慢慢改成买纯净水了,这个过程不是突然转变的,如果没有持续学习的机制让推荐模型适应,那就要等到人为感知到模型的不准确,然后再重新收集数据训练新模型,这样一来不仅要耗费专门的时间处理,还错过了好的销售时机。

持续学习最重要的构件之一就是 AutoML,当我们有了预处理后的数据集或数据流,也设计好了在管道中训练的流程闭环,AutoML 才会发挥价值,在算法种类、超参数、迭代方式、内存消耗、指标、准确性等方面择优平衡。ML.NET 在 1.x 版本后就已经具备了 AutoML 的特性,这在我以前的文章介绍过了。这次仅介绍 ML.NET 是怎么开展重新训练步骤的。

到目前已知 ML.NET 中重新训练支持以下这些算法:

  • AveragedPerceptronTrainer
  • FieldAwareFactorizationMachineTrainer
  • LbfgsLogisticRegressionBinaryTrainer
  • LbfgsMaximumEntropyMulticlassTrainer
  • LbfgsPoissonRegressionTrainer
  • LinearSvmTrainer
  • OnlineGradientDescentTrainer
  • SgdCalibratedTrainer
  • SgdNonCalibratedTrainer
  • SymbolicSgdLogisticRegressionBinaryTrainer

以回归算法训练的模型为例,假设我们已经有了如下的训练过程:

// Define data preparation estimator
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "Prices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data preparation transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);

// Define OnlineGradientDescent regression algorithm estimator
var ogdEstimator = mlContext.Regression.Trainers.OnlineGradientDescent();

// Pre-process data using data prep operations
IDataView transformedData = dataPrepTransformer.Transform(data);

// Train regression model
RegressionPredictionTransformer<LinearRegressionModelParameters> trainedModel = ogdEstimator.Fit(transformedData);

保存数据准备管道和已训练的模型,我们一般使用以下方式:

// Save Data Prep transformer
mlContext.Model.Save(dataPrepTransformer, data.Schema, "data_preparation_pipeline.zip");

// Save Trained Model
mlContext.Model.Save(trainedModel, transformedData.Schema, "model.zip");

当我们开始要重新训练前,反过来要先加载预训练的模型,使用以下代码:

// Create MLContext
MLContext mlContext = new MLContext();

// Define DataViewSchema of data prep pipeline and trained model
DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline
ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip", out dataPrepPipelineSchema);

// Load trained model
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);

然后就可以提取预训练的模型参数,加载模型后,通过访问预训练模型的 Model 属性来提取已学习的模型参数。

// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
    ((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;

重新训练模型的过程与训练模型的过程没有什么不同。 唯一的区别是,除了数据之外,Fit 方法还将原始学习模型参数作为输入,并将它们用作重新训练过程的起点。

//Load New Data
IDataView newData = mlContext.Data.LoadFromEnumerable<SomeData>(someData);

// Preprocess Data
IDataView transformedNewData = dataPrepPipeline.Transform(newData);

// Retrain model
RegressionPredictionTransformer<LinearRegressionModelParameters> retrainedModel =
    mlContext.Regression.Trainers.OnlineGradientDescent()
        .Fit(transformedNewData, originalModelParameters);

当然我们总是想比较一下模型参数,看看是否真的进行了重新训练。一种方法是比较重新训练模型的参数是否与原始模型的参数不同。 下面的代码示例将原始模型与重新训练模型的权重进行比较,并将它们输出到控制台。

// Extract Model Parameters of re-trained model
LinearRegressionModelParameters retrainedModelParameters = retrainedModel.Model as LinearRegressionModelParameters;

// Inspect Change in Weights
var weightDiffs =
    originalModelParameters.Weights.Zip(
        retrainedModelParameters.Weights, (original, retrained) => original - retrained).ToArray();

Console.WriteLine("Original | Retrained | Difference");
for(int i=0;i < weightDiffs.Count();i++)
{
    Console.WriteLine($"{originalModelParameters.Weights[i]} | {retrainedModelParameters.Weights[i]} | {weightDiffs[i]}");
}

下表演示了比较模型参数的输出效果, 从表格中反映了四项参数权重发生了调整:

原始 重新训练后  差值
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938.38  48609.23 -19670.85
30484.02 53745.43 -23261.41