モデルの再トレーニング

ML.NET で機械学習モデルを再トレーニングする方法について説明します。

世界とそのデータは絶えず変化しています。 そのため、モデルも同様に変更および更新する必要があります。 ML.NET には、学習したモデルのパラメーターを出発点として使用してモデルを再トレーニングする機能が用意されており、毎回最初から始めるのではなく、以前のエクスペリエンスを継続的に利用できます。

ML.NET では以下のアルゴリズムを再トレーニングできます。

事前トレーニング済みモデルを読み込む

まず、事前トレーニング済みモデルをアプリケーションに読み込みます。 トレーニング パイプラインとモデルの読み込みの詳細については、「トレーニング済みモデルの保存と読み込み」を参照してください。

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

事前トレーニング済みモデルのパラメーターを抽出する

モデルが読み込まれたら、事前トレーニング済みモデルの Model プロパティにアクセスして、学習済みモデルのパラメーターを抽出します。 事前トレーニング済みモデルは、LinearRegressionModelParameters を出力する RegressionPredictionTransformer を作成する線形回帰モデル OnlineGradientDescentTrainer を使用して学習されています。 これらのモデルのパラメーターには、学習済みのバイアスと、モデルの重みまたは係数が含まれています。 これらの値は、新しい再トレーニング済みモデルの出発点として使用されます。

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

Note

モデル パラメーターの出力は、使用されるアルゴリズムによって異なります。 たとえば、OnlineGradientDescentTrainer では LinearRegressionModelParameters が使用されますが、LbfgsMaximumEntropyMulticlassTrainer では MaximumEntropyModelParameters が出力されます。 モデル パラメーターを抽出するとき、適切な型にキャストします。

モデルの再トレーニング

モデルを再トレーニングするプロセスは、モデルをトレーニングするプロセスと同じです。 唯一の違いは、データに加えて Fit メソッドも元の学習済みモデル パラメーターを入力として受け取り、それらを再トレーニング プロセスの開始点として使用することです。

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

この時点で、再トレーニングされたモデルを保存して、アプリケーションで使用することができます。 詳細については、「トレーニング済みモデルの保存と読み込み」および「トレーニング済みモデルを使用して予測する」を参照してください。

モデルのパラメーターを比較する

再トレーニングが実際に行われたかどうかを判断するにはどうすればよいでしょうか。 1 つの方法は、再トレーニング済みモデルのパラメーターが元のモデルのものと異なるかどうかを比較することです。 次のコード サンプルでは、元のモデルと再トレーニング済みモデルの重みを比較し、それをコンソールに出力します。

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