最高の機械学習と深層学習ライブラリ

新しい機械学習または深層学習プロジェクトを開始する場合、どのフレームワークを選択するかについて混乱する可能性があります。これから説明するように、両方の種類のプロジェクトにはいくつかの良いオプションがあります。

機械学習フレームワークと深層学習フレームワークには違いがあります。基本的に、機械学習フレームワークは、分類、回帰、クラスタリング、異常検出、およびデータ準備のためのさまざまな学習方法をカバーし、ニューラルネットワーク方法を含む場合と含まない場合があります。

ディープラーニングまたはディープニューラルネットワークフレームワークは、多くの隠れ層を持つさまざまなニューラルネットワークトポロジをカバーします。Keras、MXNet、PyTorch、TensorFlowはディープラーニングフレームワークです。Scikit-learnとSparkMLlibは、機械学習フレームワークです。(前のリンクのいずれかをクリックして、製品のスタンドアロンレビューを読んでください。)

一般に、ディープニューラルネットワークの計算は、CPUではなく、GPU(具体的には、Nvidia CUDA汎用GPU)、TPU、またはFPGAではるかに高速に実行されます。一般に、単純な機械学習方法はGPUの恩恵を受けません。

あなたが間にできる1つの以上のCPUに深いニューラルネットワークを訓練、訓練は遅くなる傾向があり、ゆっくりとで私は、数秒から数分の話ではありません。トレーニングが必要なニューロンとレイヤーが多く、トレーニングに使用できるデータが多いほど、時間がかかります。2016年にGoogleBrainチームが新しいバージョンのGoogle翻訳の言語翻訳モデルをトレーニングしたとき、複数のGPUで一度に1週間トレーニングセッションを実行しました。GPUがなければ、各モデルのトレーニング実験には数か月かかりました。

それ以来、Intel Math Kernel Library(MKL)により、CPU上でいくつかのニューラルネットワークを妥当な時間でトレーニングできるようになりました。一方、GPU、TPU、およびFPGAはさらに高速になっています。

同じGPUで実行されているすべての深層学習パッケージのトレーニング速度はほぼ同じです。これは、トレーニング内部ループがほとんどの時間をNvidiaCuDNNパッケージで費やしているためです。

トレーニング速度とは別に、ディープラーニングライブラリにはそれぞれ長所と短所があります。Scikit-learnとSparkMLlibについても同じことが言えます。に飛び込みましょう。

ケラス

Kerasは、ニューラルネットワークモデルを構築するための高レベルのフロントエンド仕様および実装であり、TensorFlow、CNTK、およびTheanoの3つのバックエンドディープラーニングフレームワークをサポートしています。Amazonは現在、Keras用のMXNetバックエンドの開発に取り組んでいます。PlaidML(独立したプロジェクト)をKerasのバックエンドとして使用して、すべてのGPUに対するPlaidMLのOpenCLサポートを利用することもできます。

TensorFlowはKerasのデフォルトのバックエンドであり、CUDAおよびcuDNNを介したNvidiaハードウェアでのGPUアクセラレーション、およびGoogleCloudでのTPUアクセラレーションを含む多くのユースケースに推奨されます。TensorFlowには、tf.keras外部のKerasインストールとは別の内部クラスも含まれています。

Kerasには、シーケンシャルモデルの1行のコードと同じくらい簡単にニューラルネットワークにレイヤーを追加できる高レベルの環境があり、モデルのコンパイルとトレーニングにそれぞれ1つの関数呼び出しのみが必要です。Kerasでは、モデルまたは機能APIを使用して、必要に応じて下位レベルで作業できます。

Kerasを使用すると、サブクラス化することで、Pythonコーディングレベルまでさらにドロップダウンできますkeras.Modelが、可能な場合は機能的なAPIを優先します。Kerasにはscikit-learnAPIもあるため、Scikit-learnグリッド検索を使用してKerasモデルでハイパーパラメーターの最適化を実行できます。 

費用:無料のオープンソース。 

プラットフォーム: Linux、MacOS、Windows、またはRaspbian; TensorFlow、Theano、またはCNTKバックエンド。 

Kerasの私のレビューを読んでください。 

MXNet

MXNetは、2017年の初めにApache Software Foundationの傘下に移行して以来、かなり進化し、改善されてきました。MXNetバックエンドを備えたKerasでの作業がありましたが、別の高レベルのインターフェイスであるGluonがはるかに重要になりました。Gluonを組み込む前は、MXNetで簡単な命令型コードまたは高速なシンボリックコードを記述できましたが、両方を同時に記述することはできませんでした。Gluonを使用すると、KerasとPyTorchの両方と競合する方法で、両方の長所を組み合わせることができます。

Gluonについて主張されている利点は次のとおりです。

  • シンプルで理解しやすいコード:Gluonは、事前定義されたレイヤー、オプティマイザー、イニシャライザーを含む、プラグアンドプレイニューラルネットワークビルディングブロックのフルセットを提供します。
  • 柔軟で必須の構造:Gluonは、ニューラルネットワークモデルを厳密に定義する必要はありませんが、トレーニングアルゴリズムとモデルを近づけて、開発プロセスに柔軟性を提供します。
  • 動的グラフ:Gluonを使用すると、開発者は動的なニューラルネットワークモデルを定義できます。つまり、任意の構造で、Pythonのネイティブ制御フローを使用してオンザフライで構築できます。
  • 高性能:Gluonは、基盤となるエンジンが提供するトレーニング速度に影響を与えることなく、上記のすべての利点を提供します。

これらの4つの利点は、モデル例の大幅に拡張されたコレクションとともに、Gluon / MXNetをKeras / TensorFlowおよびPyTorchとほぼ同等にし、開発を容易にし、トレーニング速度を向上させます。これらの各コード例は、メインのGluonページで確認でき、GluonAPIの概要ページで繰り返し表示されます。

Gluon APIには、ニューラルネットワークレイヤー、リカレントニューラルネットワーク、損失関数、データセットメソッドとビジョンデータセット、モデル動物園、および提供された一連の実験的ニューラルネットワークメソッドの機能が含まれています。あなたは自由に、たとえば、標準MXNetとnumpyのモジュールとグルーオンを組み合わせることができmoduleautogradおよびndarray、だけでなく、Pythonの制御構造と。

Gluonには、基本レイヤー(Dense、Dropoutなど)、畳み込みレイヤー、プーリングレイヤー、アクティベーションレイヤーなど、モデルを構築するための優れたレイヤーがあります。これらはそれぞれ1行の呼び出しです。これらは、他の場所の中でも、などのネットワークコンテナ内で使用できますgluon.nn.Sequential()

費用:無料のオープンソース。 

プラットフォーム: Linux、MacOS、Windows、Docker、Raspbian、およびNvidia Jetson; Python、R、Scala、Julia、Perl、C ++、およびClojure(実験的)。MXNetはAWSディープラーニングAMIに含まれています。

MXNetの私のレビューを読んでください。 

PyTorch

PyTorchは、古いTorchと新しいCaffe2フレームワークに基づいて構築されています。名前から推測できるように、PyTorchはスクリプト言語としてPythonを使用し、進化したTorch C / CUDAバックエンドを使用します。Caffe2の制作機能は、PyTorchプロジェクトに組み込まれています。

PyTorchは、「強力なGPUアクセラレーションを備えたPythonのテンソルと動的ニューラルネットワーク」として請求されています。どういう意味ですか?

テンソルは、物理学と工学で頻繁に使用される数学的構成概念です。ランク2のテンソルは、特殊な種類の行列です。ベクトルとテンソルの内積を取ると、新しい大きさと新しい方向を持つ別のベクトルが生成されます。 TensorFlowの名前は、(シナプスの重みの)テンソルがネットワークモデルを流れる方法に由来しています。 NumPyもテンソルを使用しますが、それらをndarray。と呼びます。

GPUアクセラレーションは、最新のディープニューラルネットワークフレームワークに与えられています。動的ニューラルネットワークはPyTorchモデルはその精度と汎用性を向上させるために、トレーニング中に隠された層を追加および削除することができ、例えば、反復に反復から変更することができるものです。 PyTorchは、各反復ステップでその場でグラフを再作成します。対照的に、TensorFlowはデフォルトで単一のデータフローグラフを作成し、パフォーマンスのためにグラフコードを最適化してから、モデルをトレーニングします。

熱心な実行モードはTensorFlowのかなり新しいオプションですが、PyTorchを実行する唯一の方法です。API呼び出しは、後で実行するためにグラフに追加されるのではなく、呼び出されたときに実行されます。それは計算効率が低いように思えるかもしれませんが、PyTorchはそのように機能するように設計されており、トレーニングや予測速度に関しては決して落ち着きがありません。

PyTorchは、Intel MKL、Nvidia cuDNN、NCCL(Nvidia Collective Communications Library)などのアクセラレーションライブラリを統合して、速度を最大化します。そのコアCPUおよびGPUテンソルとニューラルネットワークバックエンド(TH(トーチ)、THC(トーチCUDA)、THNN(トーチニューラルネットワーク)、およびTHCUNN(トーチCUDAニューラルネットワーク))は、C99APIを備えた独立したライブラリとして記述されています。同時に、PyTorchはモノリシックC ++フレームワークにバインドされたPythonではありません。Pythonと緊密に統合され、他のPythonライブラリを使用できるようにすることを目的としています。

費用:無料のオープンソース。 

プラットフォーム: Linux、MacOS、Windows; CPUとNvidiaGPU。 

PyTorchの私のレビューを読んでください。 

Scikit-learn

Scikit-learn Pythonフレームワークには、堅牢な機械学習アルゴリズムが幅広く選択されていますが、ディープラーニングはありません。あなたがPythonファンなら、Scikit-learnは普通の機械学習ライブラリの中であなたにとって最良の選択肢かもしれません。

Scikit-learnは、確立されたアルゴリズムと統合されたグラフィックスの幅広い品揃えを備えた、Python用の堅牢で実績のある機械学習ライブラリです。インストール、学習、使用は比較的簡単で、優れた例とチュートリアルがあります。

反対に、Scikit-learnは深層学習や強化学習をカバーしておらず、グラフィカルモデルやシーケンス予測が不足しており、Python以外の言語からは実際に使用できません。PyPy、Pythonジャストインタイムコンパイラ、またはGPUはサポートしていません。とはいえ、ニューラルネットワークへのマイナーな進出を除いて、速度の問題は実際にはありません。内部ループなど、高速である必要がある関数にはCython(PythonからCへのコンパイラ)を使用します。

Scikit-learnには、分類、回帰、クラスタリング、次元削減、モデル選択、および前処理のためのアルゴリズムが豊富に用意されています。これらすべての優れたドキュメントと例がありますが、これらのタスクを実行するためのガイド付きワークフローはありません。

Scikit-learnは、主にアルゴリズムがすべて文書化されたとおりに機能し、APIが一貫して適切に設計されており、データ構造間の「インピーダンスの不一致」がほとんどないため、開発の容易さで最高の評価を得ています。機能が完全に肉付けされ、バグが完全に洗い流されたライブラリを使用できることをうれしく思います。

一方、ライブラリはディープラーニングや強化学習をカバーしていないため、正確な画像分類や信頼性の高いリアルタイムの言語解析や翻訳など、現在の難しいが重要な問題は除外されます。明らかに、ディープラーニングに興味がある場合は、他の場所を探す必要があります。

それにもかかわらず、さまざまな観測値をリンクする予測関数の構築から、観測値の分類、ラベルのないデータセットの構造の学習に至るまで、多くの問題があります。これらの問題は、数十層のニューロンを必要とせずに、単純な古い機械学習に役立ちます。 Scikit-learnは確かに非常に優れています。

費用:無料のオープンソース。 

プラットフォーム: Python、NumPy、SciPy、およびMatplotlibが必要です。リリースは、MacOS、Linux、およびWindowsで利用できます。

Scikit-learnの私のレビューを読んでください。 

Spark MLlib

ApacheSparkのオープンソース機械学習ライブラリであるSparkMLlibは、分類、回帰、クラスタリング、協調フィルタリングなどの一般的な機械学習アルゴリズムを提供します(ただし、ディープニューラルネットワークは提供しません)。また、特徴抽出、変換、次元削減、および選択のためのツールも含まれています。機械学習パイプラインを構築、評価、調整するためのツール。アルゴリズム、モデル、パイプラインの保存と読み込み、データ処理、線形代数と統計の実行のためのユーティリティ。

Spark MLlibはScalaで記述されており、線形代数パッケージBreezeを使用します。 Breezeは、最適化された数値処理をnetlib-javaに依存していますが、オープンソースディストリビューションではCPUの最適化された使用を意味します。 Databricksは、GPUを使用するカスタマイズされたSparkクラスターを提供します。これにより、ビッグデータを使用して複雑な機械学習モデルをトレーニングするための速度がさらに10倍向上する可能性があります。

Spark MLlibは、分類と回帰のための一般的なアルゴリズムとモデルのトラックロードを実装し、初心者が混乱する可能性がありますが、専門家は、最終的に分析するデータのモデルの適切な選択を見つける可能性があります。この多数のモデルに、Spark 2.xは、モデル選択とも呼ばれるハイパーパラメーター調整の重要な機能を追加します。ハイパーパラメータ調整により、アナリストはパラメータグリッド、推定量、および評価器を設定し、交差検定法(時間はかかるが正確)またはトレーニング検証分割法(高速だが精度が低い)で最適なモデルを見つけることができます。データ。

Spark MLlibには、ScalaとJava用の完全なAPI、Python用のほぼ完全なAPI、R用の大ざっぱな部分APIがあります。サンプルを数えることでカバレッジをよく理解できます:54のJavaと60のScala機械学習の例、52のPython機械学習例、および5つのR例のみ。私の経験では、Spark MLlibはJupyterノートブックを使用して操作するのが最も簡単ですが、詳細なSparkステータスメッセージを飼いならすと、コンソールで確実に実行できます。

Spark MLlibは、基本的な機械学習、機能の選択、パイプライン、永続性など、必要なものをほぼすべて提供します。分類、回帰、クラスタリング、およびフィルタリングでかなりうまく機能します。Sparkの一部であるため、データベース、ストリーム、その他のデータソースに簡単にアクセスできます。一方、Spark MLlibは、TensorFlow、PyTorch、MXNet、Kerasと同じように、ディープニューラルネットワークをモデル化してトレーニングするようには実際には設定されていません。

費用:無料のオープンソース。

プラットフォーム: Sparkは、WindowsとUnixライクなシステム(Linux、MacOSなど)の両方で動作し、Java 7以降、Python 2.6 / 3.4以降、およびR3.1以降を搭載しています。Scala APIの場合、Spark2.0.1はScala2.11を使用します。SparkにはHadoop / HDFSが必要です。

SparkMLlibの私のレビューを読んでください。