Udostępnij za pośrednictwem


Ponowne trenowanie modelu

Dowiedz się, jak ponownie trenować model uczenia maszynowego w ML.NET.

Świat i jego dane stale się zmieniają. W związku z tym modele muszą również ulec zmianie i zaktualizować. ML.NET zapewnia funkcje ponownego trenowania modeli przy użyciu poznanych parametrów modelu jako punktu początkowego, aby stale opierać się na poprzednim środowisku, a nie rozpoczynać od podstaw za każdym razem.

Następujące algorytmy można ponownie trenować w ML.NET:

Ładowanie wstępnie wytrenowanego modelu

Najpierw załaduj wstępnie wytrenowany model do aplikacji. Aby dowiedzieć się więcej na temat ładowania potoków treningowych i modeli, zobacz Zapisywanie i ładowanie wytrenowanego modelu.

// 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("ogd_model.zip", out modelSchema);

Wyodrębnianie wstępnie wytrenowanych parametrów modelu

Po załadowaniu modelu wyodrębnij poznane parametry modelu, korzystając z właściwości Model wstępnie wytrenowanego modelu. Model wstępnie wytrenowano, korzystając z modelu regresji liniowej OnlineGradientDescentTrainer, który tworzy RegressionPredictionTransformer i generuje LinearRegressionModelParameters. Te parametry modelu zawierają wyuczone błąd i wagi lub współczynniki modelu. Te wartości są używane jako punkt wyjścia dla nowego przetrenowanego modelu.

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

Notatka

Dane wyjściowe parametrów modelu zależą od używanego algorytmu. Na przykład OnlineGradientDescentTrainer używa LinearRegressionModelParameters, podczas gdy LbfgsMaximumEntropyMulticlassTrainer wyprowadza MaximumEntropyModelParameters. Podczas wyodrębniania parametrów modelu, zastosuj rzutowanie do odpowiedniego typu.

Ponowne trenowanie modelu

Proces ponownego trenowania modelu nie różni się od procesu trenowania modelu. Jedyną różnicą jest przekazanie dodatkowego argumentu do metody Fit(IDataView, LinearModelParameters): oryginalnych wyuczonych parametrów modelu. Fit() używa ich jako punktu początkowego w procesie ponownego trenowania.

// New Data
HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

//Load New Data
IDataView newData = mlContext.Data.LoadFromEnumerable<HousingData>(housingData);

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

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

W tym momencie możesz zapisać przetrenowany model i użyć go w swojej aplikacji. Aby uzyskać więcej informacji, zobacz Zapisywanie i ładowanie wytrenowanego modelu i Tworzenie przewidywań przy użyciu wytrenowanego modelu.

Porównanie parametrów modelu

Jak sprawdzić, czy rzeczywiście doszło do ponownego trenowania? Jednym ze sposobów jest porównanie, czy parametry przetrenowanego modelu różnią się od parametrów oryginalnego modelu. Poniższy przykładowy kod porównuje oryginał z ponownie wytrenowanymi wagami modelu i wyprowadza je do konsoli.

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

W poniższej tabeli przedstawiono, jak mogą wyglądać dane wyjściowe.

Oryginał Ponowne trenowanie Różnica
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938,38 48609.23 -19670.85
30484.02 53745.43 -23261.41