「あらゆるプロジェクトに適した機械学習ライブラリ」

A machine learning library suitable for all projects.

機械学習プロジェクトで使用できる多くのライブラリが存在します。もちろん、その中には長年にわたってかなりの評判を得たものもあります。このようなライブラリは、機械学習アルゴリズムを利用する新しいプロジェクトを開始する際には直ちに選ばれるものです。ただし、正しいセット(またはスタック)を選ぶことはかなりの課題となる場合もあります。

なぜなら

この記事では、機械学習ライブラリの状況について概要を説明し、それらとの作業についての私の考えを共有したいと思います。もしも機械学習ライブラリの使用を始める際にいくつかの一般的な知識やより良いスタート地点を得たいのであれば、この記事はあなたに役立つでしょう。

ここで説明するライブラリは、プロジェクトで果たす役割によって分類されます。

カテゴリは以下の通りです:

  1. モデル作成 – 機械学習モデルの作成に使用できるライブラリ
  2. データ処理 – 特徴量エンジニアリング、特徴量抽出などデータ処理に関わるすべての操作に使用できるライブラリ
  3. ハイパーパラメータ最適化 – モデルのハイパーパラメータを最適化するために使用できるライブラリおよびツール
  4. 実験の追跡 – 実験の追跡に使用されるライブラリおよびツール
  5. 問題特化のライブラリ – 時系列予測、コンピュータビジョン、空間データの処理などのタスクに使用できるライブラリ
  6. ユーティリティ – 厳密には機械学習ライブラリではありませんが、私のプロジェクトで役立つと思われるもの

モデル作成

PyTorch

Facebookの開発者によって2017年にオープンソース化されたPyTorchは、オープンソースのTorchパッケージをベースにした市場で最も有名な機械学習ライブラリの一つです。PyTorchエコシステムは、あらゆるタイプの機械学習問題に使用することができ、torchvisionやtorchaudioなどの特定の目的に特化したライブラリが豊富に揃っています。

PyTorchの基本的なデータ構造はTensorオブジェクトであり、モデルによって使用される多次元データを保持するために使用されます。これはNumPyのndarrayと概念的には似ています。PyTorchは計算アクセラレータも使用することができ、CUDA対応のNVIDIA GPU、ROCm、Metal API、TPUをサポートしています。

PyTorchのコアライブラリの最も重要な部分は、複雑なモデルを容易に層ごとに構築するための層やツールを含んだnnモジュールです。

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

PyTorchで3つの線形層を持つシンプルなニューラルネットワークの例

さらに、PyTorch 2.0は既にリリースされており、PyTorchをさらに優れたものにしています。また、PyTorchはUber、Tesla、Facebookなど、さまざまな企業によって使用されています。

PyTorch Lightning

PyTorchの「拡張」とも言えるPyTorch Lightningは、モデルを利用するために必要なほとんどの定型コードの量を大幅に減らすことを目指しています。

Lightningはフックのコンセプトに基づいており、モデルのトレーニング/評価ループの特定のフェーズで呼び出される関数です。このようなアプローチにより、トレーニングステップの終了時など、特定のタイミングで実行されるコールバック関数を渡すことができます。

PyTorchでの注意が必要な多くの機能を自動化するTrainers Lightningには、ループ、ハードウェア呼び出し、ゼロ勾配などが含まれます。

以下は、PyTorch(左)とPyTorch Lightning(右)のおおよそ同等のコードフラグメントです。

画像のソース

TensorFlow

Google Brainのチームによって開発されたライブラリで、最初に2015年にApache 2.0ライセンスのもとでリリースされ、2019年にはバージョン2.0がリリースされました。Java、C++、Python、JavaScriptなどのクライアントが提供されています。

PyTorchと同様に、Googleをはじめとする企業によって広く採用され、Googleによってその周りにはかなりのエコシステムが構築されています。最適化ツールキットやTensorBoard(以下の「実験の追跡」セクションで詳しく説明します)、レコメンデーションシステムなどのツールやライブラリが含まれています。TensorFlowのエコシステムには、モデルの可視化を行うためのWebベースのサンドボックスも含まれています。

再びtf.nnモジュールが最も重要な役割を果たし、機械学習モデルを構築するために必要なすべてのビルディングブロックを提供します。TensorFlowは、ディープラーニングモデルで使用されるデータを保持するために独自のテンソル(フロー;p)オブジェクトを使用します。また、CUDAやRoCm(コミュニティ)、Metal API、TPUなど、一般的な計算アクセラレータもサポートしています。

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

TensorFlowとKerasでは、PyTorchで使用されるLinearレイヤーの代わりにDenseレイヤーを使用します。また、モデルの順方向パスを定義するためにforwardメソッドの代わりにcallメソッドを使用します。

Keras

Kerasは、PyTorch Lightningに類似したライブラリであり、TensorFlow向けです。TensorFlowよりも高レベルなインターフェースを提供します。フランソワ・ショレ氏によって開発され、2015年にリリースされました。Pythonクライアントのみを提供しています。Kerasには、KerasCVやKerasNLPなどの特定の問題に特化したPythonライブラリや問題特有のライブラリもあります。

バージョン2.4以前のKerasは、TensorFlow以外のバックエンドもサポートしていましたが、リリース後はTensorFlowのみがサポートされるようになりました。Kerasは単にTensorFlowのインターフェースであるため、基礎となるバックエンドと似た基本的な概念を共有しています。同様に、サポートされる計算アクセラレータにも当てはまります。Kerasは、IBMやPayPal、Netflixなどの企業によって使用されています。

class NeuralNetwork(models.Model):
    def __init__(self):
        super().__init__()
        self.flatten = layers.Flatten()
        self.linear_relu_stack = models.Sequential([
            layers.Dense(512, activation='relu'),
            layers.Dense(512, activation='relu'),
            layers.Dense(10)
        ])
    def call(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

TensorFlowとKerasでは、PyTorchで使用されるLinearレイヤーの代わりにDenseレイヤーを使用します。また、モデルの順方向パスを定義するためにforwardメソッドの代わりにcallメソッドを使用します。

PyTorch vs. TensorFlow

これら2つの間の比較をいくつか紹介しないと、正直なところではありません。

先ほど読んだように、両者は提供される機能やその周りのエコシステムなど、かなり似ています。もちろん、いくつかの細かい違いや特徴がありますが、私の意見では、これらはほとんど重要ではありません。

実際の違いは、機械学習やディープラーニングモデルの計算グラフの定義と実行の方法において現れます。

  • PyTorchは動的な計算グラフを使用します。つまり、グラフは実行中に動的に定義されます。これにより、柔軟性が高まり、直感的なデバッグが可能になります。開発者は実行時にグラフを変更したり、中間出力を簡単に検査したりすることができます。一方、このアプローチは、特に複雑なモデルに対しては、静的なグラフよりも効率が低い場合があります。ただし、PyTorch 2.0では、torch.compileやFXグラフを介してこれらの問題に対処しようとしています。
  • TensorFlowは静的な計算グラフを使用します。グラフは実行前にコンパイルされます。これにより、対象のハードウェアに対してグラフを最適化し並列化することが可能になります。ただし、中間出力に簡単にアクセスできないため、デバッグがより難しくなる場合もあります。

もう1つの注目すべき違いは、PyTorchがKerasよりも低レベルでありながら、純粋なTensorFlowよりも高レベルであるように見える点です。このような設定により、PyTorchはより柔軟でカスタマイズが容易なモデルの作成に使用されます。

余談ですが、TensorFlowはcallメソッドを使用し、PyTorchはforwardメソッドを使用するという点では、両方のライブラリがmodel(x)を呼び出すための省略形としてcallセマンティクスをサポートしていることを追加しておきたいと思います。

データの操作

pandas

Pythonを使用している場合、おそらく最も有名なデータ操作のためのPythonライブラリであるpandasについて聞いたことがあるでしょう。元々2008年にリリースされ、2012年にバージョン1.0がリリースされました。データのフィルタリング、集約、変換、および複数のデータセットのマージなどの機能を提供しています。

このライブラリの中心は、任意の種類のデータの多次元テーブルを表すDataFrameオブジェクトです。このライブラリは、パフォーマンスに重点を置いており、一部は純粋なCで書かれているため、パフォーマンスを高めています。

パフォーマンスに焦点を当てた他にも、pandasには以下のような多くの機能があります:

  • データのクリーニングと前処理
    • 重複の削除
    • null値またはnan値の埋め込み
  • 時系列分析
    • リサンプリング
    • ウィンドウ処理
    • 時間のシフト

さらに、さまざまな入出力操作も行うことができます:

  • .csvや.xlsxファイルへの読み書き
  • データベースクエリの実行
  • GCP BigQueryからのデータの読み込み(pandas-gbqの助けを借りて)

NumPy

これはデータ処理に使用されるもう1つの有名なライブラリです。主に数値データに関連しています。NumPyの最も有名な部分はndarrayで、数値の多次元配列を表す構造です。

ndarrayの他にも、NumPyはこのデータを扱うための多くの高レベルな数学関数や演算を提供しています。また、最も古いライブラリの一つであり、最初のバージョンは2005年にリリースされました。これは1996年にリリースされたnumericというさらに古いライブラリをもとにTravis Oliphantによって実装されました。

NumPyはパフォーマンスに非常に焦点を当てており、現在実装されているアルゴリズムの実行時間をさらに短縮するために、貢献者が取り組んでいます。

もちろん、ここで説明されているすべてのライブラリと同様に、NumPyもオープンソースであり、BSDライセンスを使用しています。

SciPy

これは科学的な計算をサポートするライブラリです。NumPyよりもさらに古く(2001年にリリース)、2005年にリリースされました。SciPyはNumPyをベースに構築されており、SciPy全体で基本的なデータ構造としてndarrayが使用されています。このライブラリでは、最適化、線形代数、信号処理、補間、疎行列のサポートなど、他の機能を追加しています。一般的にはNumPyよりも高レベルであり、より複雑な機能を提供できます。

ハイパーパラメータの最適化

Ray Tune

これはRayツールセットの一部であり、機械学習とPythonに焦点を当てた分散アプリケーションの関連ライブラリの束です。MLライブラリのTuneパートは、さまざまな検索アルゴリズム(例:グリッドサーチ、ハイパーバンド、ベイズ最適化)を提供することで、ハイパーパラメータの最適化機能に焦点を当てています。

Ray Tuneは、市場で利用可能なほとんどのプログラミング言語やライブラリで作成されたモデルと連携することができます。モデル作成に関する段落で説明されているすべてのライブラリは、Ray Tuneによってサポートされています。

Ray Tuneの主要なコンセプトは次のとおりです:

  • Trainables – Tuneの実行に渡されるオブジェクトで、パラメータを最適化したいモデルです
  • Search space – 現在のトライアルでチェックしたいハイパーパラメータの値をすべて含んでいます
  • Tuner – 実行を管理するオブジェクトで、tuner.fit()を呼び出すと最適なハイパーパラメータセットの検索プロセスが開始されます。少なくとも訓練可能なオブジェクトと検索空間を渡す必要があります
  • Trial– 各トライアルは、検索空間からのパラメータセットを持つ訓練可能なオブジェクトの特定の実行を表します。トライアルはRay Tune Tunerによって生成されます。トライアルはチューナーの実行の出力を表しており、トライアルには様々な情報が含まれています:
    • 特定のトライアルに使用される構成
    • トライアルID
    • その他多数
  • Search algorithms – Tuner.fitの特定の実行に使用されるアルゴリズム。指定しない場合、Ray TuneはデフォルトとしてRadomSearchを使用します
  • Schedulers – 実行を管理するオブジェクトです。トライアルの一時停止、停止、実行を管理することができます。これにより、実行の効率が向上し、実行時間が短縮される場合があります。選択しない場合、TuneはデフォルトとしてFIFOを選択します – 実行はクラシックなキューのように1つずつ実行されます。
  • Run analyses – ResultGridオブジェクトの形式でTuner.fitの実行結果をまとめるオブジェクトです。最良の結果やすべてのトライアルのデータなど、実行に関連するすべてのデータが含まれています。

BoTorch

BoTorchはPyTorchの上に構築されたライブラリであり、PyTorchエコシステムの一部です。ベイジアン最適化を使用したハイパーパラメーターの最適化に特化しています。

この領域で唯一特定のモデルライブラリと連携するように設計されたライブラリであるため、PyTorch以外のライブラリとの組み合わせは問題が生じる可能性があります。また、現時点ではベータ版であり、積極的な開発が行われているため、予期しない問題が発生する場合があります。

BoTorchの主な特徴は、PyTorchとの統合です。これにより、2つの間の相互作用が大幅に向上します。

実験トラッキング

Neptune.ai

実験トラッキングとモデルレジストリの両方を提供するウェブベースのツールです。このツールはクラウドベースのクラシックなSaaSモデルであり、自己ホスト型のバリアントを使用することも可能です。

このツールは、モデルのトレーニング結果を表示および比較するためのダッシュボードを提供します。また、特定の実行に使用されたパラメーターを保存するために使用することもできます。さらに、特定の実行に使用されるデータセットのバージョン管理や、便利と思われるすべてのメタデータのバージョン管理も簡単に行えます。

さらに、モデルの簡単なバージョン管理も可能です。このツールはライブラリに依存せず、任意のライブラリを使用して作成されたモデルをホストすることができます。統合を可能にするために、Neptuneは独自のクライアントを持つRESTスタイルのAPIを公開しています。このクライアントはpipや他のPython依存関係ツールを介してダウンロードおよびインストールすることができます。APIは十分に文書化されており、理解するのは比較的簡単です。

このツールは有料であり、シンプルな価格設定プランが3つのカテゴリに分かれています。ただし、個人プロジェクトに必要な場合や、研究や学術ユニットに所属している場合は、無料でツールを使用することができます。

Neptune.aiは比較的新しいツールであり、他の実験トラッキングツールで既知のいくつかの機能が存在しない場合があります。しかし、Neptune.aiのサポートはユーザーフィードバックに積極的に対応し、不足している機能を実装することになります。少なくとも、The Codos ProjectでNeptune.aiを広範に使用している私たちの場合はそうでした。

Weights & Biases

WandBまたはW&Bとしても知られる、実験トラッキングツールおよびモデルレジストリとして使用されるウェブベースのツールです。neptune.aiとほぼ同様の機能を提供しています。

ただし、Weights & Biasesは視覚化がより優れており、一般的にはNeptuneよりも洗練されたツールです。また、WandBは個々のプロジェクトや研究者に重点を置いており、協力にはあまり重点を置いていません。

また、無料の利用枠を備えた3つのカテゴリに分かれたシンプルな価格設定プランもあります。ただし、Weights & BiasesもNeptuneと同様のアプローチを取っており、研究者や学術ユニットは常に無料でWeights & Biasesを使用することができます。

Weights & Biasesは、統合プロセスを簡素化するためのRESTのようなAPIも公開しています。このAPIはNeptune.aiが公開しているものよりも、より良く文書化され、より多くの機能を提供しているようです。なお、興味深いことに、Weights & BiasesはJavaで書かれたクライアントライブラリも公開しています – もし何らかの理由でPythonの代わりにJavaで機械学習モデルを作成した場合には。

TensorBoard

TensorFlowエコシステム向けの専用の可視化ツールです。主にメトリクスの視覚化に焦点を当てた実験トラッキングツールとして設計されています。専用のTensorFlowツールであるにもかかわらず、Keras(驚くことではありませんが)やPyTorchでも使用することができます。

さらに、このセクションで説明された3つのツールの中で唯一無料のツールです。ここでは実験をホストし、トラッキングすることができます。ただし、TensorBoardにはモデルレジストリの機能がないため、この機能をカバーするために第三者のツールを使用する必要がある場合があります。とはいえ、TensorFlowエコシステムにはこの欠落した機能をカバーするツールが確かに存在します。

TensorFlowエコシステムの一部であるため、KerasやTensorFlowとの統合は、前述の2つのツールよりもスムーズです。

問題特化型ライブラリ

tsaug

時系列の拡張のための数少ないライブラリの1つであり、GitHubの名前がnick tailaiwという1人の開発者によって作成およびメンテナンスされており、2019年にリリースされたバージョン0.2.1を現在使用しています。Crop、Add Noise、TimeWrapなど、9つの拡張機能を提供しています。このプロジェクトにしては非常によくドキュメント化されており、ユーザー視点から使用するのは簡単です。

残念ながら、理由はわかりませんが、このライブラリは3年間更新されていないようです。多くの問題がオープンされていますが、それらには注目されていません。私の意見では、時系列データの拡張を提供する他のライブラリはそれほど多くありませんので、このような状況はかなり悲しいと思います。

ただし、データマイニングや拡張のための時系列を探していて、より最新のライブラリを使用したい場合は、Tsfreshが良い選択肢になるかもしれません。

OpenCV

画像処理やコンピュータビジョンのための関数を提供することに特化したライブラリです。Intelによって開発され、Apache 2ライセンスに基づいてオープンソース化されました。

OpenCVは、画像やビデオ処理、画像分類データ解析、および画像やビデオの取り扱いに関する既製の機械学習モデルと一緒に、関連する関数のセットを提供しています。

OpenCVについて詳しく読みたい場合は、私の同僚であるKamil Rzechowskiが、そのトピックをかなり詳細に説明した記事を書いています。

GeoPandas

pandasを基盤とした、空間データとデータ構造を扱うための関数を提供するライブラリです。GeJSONやシェープファイル形式でのデータの簡単な読み書きや、PostGISシステムからのデータの読み込みが可能です。pandas以外にも、PyGEOS、GeoPy、Shapelyなどの空間データライブラリに依存しています。

ライブラリの基本的な構造は次の通りです:

  • GeoSeries – 点、線、ポリゴンなどのジオスペーシャルデータの列
  • GeoDataFrame – 一連のGeoSeriesを保持する表形式の構造

Utils

Matplotlib

その名前からもわかるように、さまざまな種類のプロットを作成するためのライブラリです。線やヒストグラムなどの基本的なプロットだけでなく、3D形状や極座標プロットなどのより複雑なプロットも作成できます。もちろん、カラープロットやラベルなどのカスタマイズも可能です。

リリースは2003年ですが(執筆時点で20年経過しています)、現在も積極的にメンテナンスおよび開発が行われています。GitHubでは約17kのスターを獲得しており、かなりのコミュニティが存在し、データ可視化ツールを必要とする人々にとってはおそらく2番目の選択肢になるでしょう。

初心者にとっても理解しやすく、ドキュメントも充実しています。また、matplotlibはより高レベルの可視化ライブラリの基盤として使用されていることも注目に値します。

Seaborn

それについて話すと、Seabornがそのようなライブラリの一例です。したがって、Seabornが提供する機能のセットはMatplotlibが提供する機能と似ています。

ただし、APIはより高レベルであり、同様の結果を得るためのボイラープレートコードが少なくて済みます。その他の細かい違いとしては、Seabornが提供するカラーパレットはより柔らかく、プロットのデザインもよりモダンで見栄えが良いです。さらに、Seabornはpandasとの統合が最も簡単であるため、大きな利点となる場合があります。

以下に、MatplotlibとSeabornでヒートマップを作成するために使用されるコードと、それによって生成されるプロットを示します。インポートは共通です。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

data = np.random.rand(5, 5)

fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)

ax.set_xticklabels(np.arange(1, data.shape[0]+1), minor=False)
ax.set_yticklabels(np.arange(1, data.shape[1]+1), minor=False)

plt.title("ヒートマップ")
plt.xlabel("X軸")
plt.ylabel("Y軸")

cbar = plt.colorbar(heatmap)

plt.show()

sns.heatmap(data, cmap="Blues", annot=True)
# プロットのタイトルと軸ラベルを設定
plt.title("ヒートマップ")
plt.xlabel("X軸")
plt.ylabel("Y軸")
# プロットを表示
plt.show()

Hydra

すべてのプロジェクトで、遅かれ早かれ、設定可能な値が必要になることがあります。もちろん、Jupyterのようなツールを使用している場合は、問題はかなり簡単です。必要な値を.envファイルに移動するだけで、設定可能になります。

ただし、より標準的なアプリケーションを構築している場合、事はそんなに単純ではありません。ここでHydraが登場します。これはPythonベースのアプリケーションの設定を管理および実行するためのオープンソースツールです。

これはOmegaConfライブラリに基づいており、彼らのメインページから引用すると、「階層的な構成を動的に作成し、構成ファイルとコマンドラインを介してオーバーライドする能力が主な特徴です。」

私にとって非常に有用だったのは、上記の引用に記載されている機能、つまり階層的な構成です。私の場合、これは非常にうまく機能し、設定ファイルの明確な分離を可能にしました。

coolname

汚い(しかし非常に便利な)頭を持つHydraの一部として、あなたのランのためのユニークな識別子を持つことは常に良い考えです。さまざまな理由でUUIDが好きではない場合や、単に人間が理解できるIDにしたい場合、coolnameが答えです。2〜4ワードの長さのユニークなアルファベットベースの識別子を生成します。

組み合わせの数については、おおよそ以下のようになります:

  • 4ワードの長さの識別子は1010の組み合わせがあります
  • 3ワードの長さの識別子は108の組み合わせがあります
  • 2ワードの長さの識別子は105の組み合わせがあります

この数はUUIDの場合よりもかなり少ないため、衝突の確率も高くなります。ただし、このテキストのポイントは比較ではありません。

語彙は作者によって厳選されています。しかし、彼らはそれをポジティブで中立的なものと説明しており(詳細はこちらを参照)、you-ugly-unwise-human-beingのような識別子は表示されません。もちろん、このライブラリは完全にオープンソースです。

tqdm

このライブラリはアプリケーションに進捗バー機能を提供します。表示される情報が必要なものではないかもしれませんが、重要なタスクの実行中にアプリケーションの進捗状況を確認するのは便利です。

tqdmはまた、特定のタスクの残り時間を推定するための複雑なアルゴリズムを使用しており、時間の計画を立てるのに役立つかもしれません。さらに、tqdmはナノ秒のパフォーマンスオーバーヘッドしかないと述べています。

さらに、tqdmは単体で完全に動作し、Pythonのみを必要とします。したがって、インターネットの大部分をディスクにダウンロードすることはありません。

Jupyter Notebook(+JupyterLab)

ノートブックは結果を共有し、プロジェクトで作業するための素晴らしい方法です。セルのコンセプトを介して、コードの異なるフラグメントと責任を簡単に分離することができます。

さらに、単一のノートブックファイルには、コード、画像、複雑なテキスト出力(テーブル)を含めることができるため、その既存の利点にさらに加えられます。

さらに、ノートブックではセル内でpip installを実行したり、設定のために.envファイルを使用したりすることができます。このようなアプローチにより、多くのソフトウェアエンジニアリングの複雑さを排除することができます。

まとめ

これが私が説明したさまざまな機械学習ライブラリです。私はそれぞれのライブラリの一般的な概要と、それらの可能な使用例について説明し、それらを使用する際の私自身の経験についても簡単なメモを付け加えることを目指しました。私の目標が達成され、この記事が機械学習ライブラリの景色についての知識を深めることに役立つことを願っています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more