各種メニューMenu

ブログ

近似アルゴリズムとプラットフォームのベンチマークを行うRosenbrock Dataset Suite

Carlos BarranqueroとRoberto Lopez、Artelnics著。 機械学習用のデータセットを多数保有するリポジトリは数多く存在する。最も重要なものの中には、UCI Machine Learning RepositoryやKaggleがあります。

しかし、これらのデータセットを性能のベンチマークに利用することは難しいかもしれません。実際、これらのデータセットには、データ容量、学習速度、モデル精度、推論速度などの主要な性能指標に必要な一貫性が欠けています。

この記事では、Rosenbrock Dataset Suiteと呼ばれるデータセット群を紹介します。その目的は、機械学習プラットフォームのベンチマークを容易にすることです。

はじめに



機械学習プラットフォームのデータ容量は、そのプラットフォームが処理できる最大のデータセットと定義することができる。この場合、ツールはそのデータセットですべての重要なタスクを実行する必要がある。

データ容量は、与えられた変数の数に対して機械学習プラットフォームが処理できるサンプル数として測定することができる。

最も大きな欠点は、通常、変数とサンプルの数が固定されていることである。そのため、異なるデータセットサイズで機械学習プラットフォームがどのように動作するかをテストすることが困難である。


学習速度とは、機械学習プラットフォームが学習中に処理する1秒あたりのサンプル数として定義される。

学習速度は、データセットサイズに大きく依存する。例えば、CPUが小さいデータセットではGPUよりも高速な学習を提供し、大きいデータセットではより遅い学習を提供するかもしれない。

そのため、任意の数の変数とサンプルを持つデータセットを生成し、これらのサイズが学習性能にどのような影響を与えるかを確認する必要がある。


精度は、テストデータセットに対するモデルの平均誤差として定義することができます。

実際のデータセットのほとんどは、ノイズが多い。これは、モデルのデータへの完全な適合が検証できないことを意味する。

したがって、誤差ゼロのモデルを構築できる可能性のあるデータセットがあることが望ましい。


推論速度は、入力の関数として出力を計算する時間である。推論速度は1秒あたりのサンプル数として測定される。

前回同様、任意の数の変数とサンプルを持つデータセットを生成し、これらのサイズが学習性能にどのような影響を与えるかを確認する必要があります。

Rosenbrock関数

Rosenbrock関数は、1960年にハワード・H・ローゼンブロックによって発表された非凸関数である。ローゼンブロックの谷、ローゼンブロックのバナナ関数とも呼ばれる。

最適化アルゴリズムの性能試験問題としても利用されている。

数学的最適化では、nはサンプルの数、mは入力変数の数です。

\[ x_{i,j}=rand(-1, +1) \] \[ \sum_{i=1}^{n-1}[100(x_{i+1}-x_{i}^{2})^{2}+(1-x_{i})^{2}] \]
Rosenbrock関数の出力は実数値であるため、このデータセット群は近似問題に適している。したがって、それを使って分類や予測アプリケーションの性能をテストすることはできない。

Rosenbrockデータセット一式は、任意の数の変数とサンプルを持つデータセットを作成することができる。したがって、このデータセットは、データ容量、学習速度、推論速度のテストを行うのに最適なものです。

Rosenbrockのデータはかなり複雑な形状を持つ決定論的関数から抽出されています。その関数の機械学習モデルを任意の精度で構築することが可能であるはずです。 したがって、Rosenbrockのデータセットはモデル精度テストに最適である。

C++コード

次のコードは、C++を使用してRosenbrockのデータセットを生成する方法を示しています。


							// System includes
							
							#include 
							#include 
							#include 
							#include 
							
							using namespace std;
							
							int main(void)
							{
							    cout << "Rosenbrock Dataset Generator." << endl;
							
							            const int inputs_number  = 2;
							            const int samples_number = 10000;
							
							            const string filename = "G:/R__" + to_string(samples_number)+ "_samples_"+ to_string(inputs_number) + "_inputs.csv";
							
							            float inputs[inputs_number];
							
							    default_random_engine generator;
							    uniform_real_distribution distribution(-1.0, 1.0);
							
							    ofstream file(filename);
							
							            for(int j=0; j < samples_number; j++)
							    {
							            float rosenbrock = 0.0;
							
							            for(int i=0; i < inputs_number; i++)
							        {
							            inputs[i] = distribution(generator);
							
							            file << inputs[i] << ",";
							        }
							
							            for(int i = 0; i< inputs_number - 1; i++)
							        {
							            rosenbrock +=
							                (1 - inputs[i])*(1 - inputs[i])
							            + 100*(inputs[i+1]-inputs[i] * inputs[i])*
							                (inputs[i+1]-inputs[i]*inputs[i]);
							        }
							
							        file << rosenbrock << endl;
							      }
							
							    file.close();
							
							            return 0;
							}
							

Pythonコード

また、以下のPythonコードでRosenbrockのデータセットを生成することができます。


							import numpy as np
							import pandas as pd 
							import random
							
							
							samples_number = 10000
							
							inputs_number = 2
							
							distribution = random.uniform(-1, 1)
							
							inputs = np.random.uniform(-1.0, 1.0, size = (samples_number, inputs_number))
							
							rosenbrock = []
							
							for j in range (samples_number):
							    
							    r = 0
							    
							            for i in range(inputs_number-1):
							        
							        r += (1.0 - inputs[j][i])*(1.0 - inputs[j][i])+100.0*((inputs[j][i+1]-inputs[j][i]*inputs[j][i])*(inputs[j][i+1]-inputs[j][i]*inputs[j][i]))
							        
							    rosenbrock.append(r)
							    
							data = pd.concat([pd.DataFrame(inputs),pd.DataFrame(rosenbrock)], axis=1)
							
							filename = "G:/R_" + str(samples_number)+ "_samples_"+ str(inputs_number) + "_variables_python.csv";
							
							data.to_csv(filename,index = False,sep = ",")
							
データは[-1,1]の間でノルム化されていることに注意してください。

データセットのダウンロード
結論

このブログでは、機械学習プラットフォームのデータ容量、学習速度、モデル精度、推論速度を測定する機能を紹介しています。 Rosenbrockのデータセットは強い一貫性を持ち、ノイズがありません。このため、一般的なリポジトリのデータセットに代わる強力なベンチマーク用データセットとなります。