通過 Continual Learning 提高 ML.NET 模型准確性並增強性能


從事機器學習的學者大多認為持續學習(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


 

  
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM