Java はなぜ機械学習やディープラーニングを実際にサポートできないのでしょうか?何が欠けている?

Java はなぜ機械学習やディープラーニングを実際にサポートできないのでしょうか?何が欠けている?

チームに ML を導入させるにはどうすればよいのでしょうか。また、実行している既存のシステムと ML を最適に統合するにはどうすればよいでしょうか。

Java で構築された ML フレームワークは実際には存在しません (DL4J はありますが、それを使用している人を知りません。MXNet は Java ではなく Scala API を持ち、Java で書かれていません。Tensorflow は不完全な Java API を持っています)。しかし、Java は企業で大きな影響力を持っており、過去 20 年間で世界中の金融サービス、トレーディング、電子商取引、通信会社に数兆ドルが投資されてきました。そのリストは無限です。機械学習の場合、「第一候補」のプログラミング言語は Java ではなく Python です。

個人的には、Python と Java でコーディングするのが好きですが、Frank Greco が興味深い質問をして、考えさせられました。

ML で Python と競争するには、Java に他に何が必要ですか? Java が機械学習を本当にサポートすることに真剣に取り組んだらどうなるでしょうか?

それは重要ですか?

1998 年以来、Java は、Web、モバイル、ブラウザとネイティブ、メッセージング、i18n と l10n のグローバリゼーション サポート、リレーショナル データベースから Elasticsearch に至るまでのさまざまなエンタープライズ情報ストアの拡張とサポートなど、複数のエンタープライズ変革の最前線に立ってきました。

機械学習業界ではそうではありません。 Java チームが ML に参入する場合、選択肢は 2 つしかありません。

  1. Python で再トレーニング/共同トレーニングします。
  2. ベンダー API を使用して、エンタープライズ システムに機械学習機能を追加します。

どちらの選択肢もあまり良いものではありません。前者には、多大な先行時間と投資に加えて、継続的なメンテナンス コストが必要です。一方、後者には、ベンダー ロックイン、ベンダーのサポート終了、サードパーティ コンポーネントの導入 (ネットワーク料金の支払いが必要)、パフォーマンスが重要なシステム、組織の境界外でのデータ共有の必要性 (一部の人にとっては避けるべき) などのリスクがあります。

[[391838]]

私の意見では、最も損害が大きいのは、文化的な衰退の可能性です。チームは理解できないコードや保守できないコードを変更できず、Java チームはエンタープライズ コンピューティングの次の波である機械学習で遅れをとるリスクがあります。

したがって、Java プログラミング言語とプラットフォームが一流の機械学習サポートを備えていることは極めて重要です。そうでない場合、Java は今後 5 ~ 10 年で徐々に ML をサポートする言語に置き換えられるリスクがあります。

なぜ Python が ML で優位に立っているのでしょうか?

まず、なぜ Python が機械学習とディープラーニングの主要な言語であるのかを考えてみましょう。

[[391839]]

すべてはリストのスライスのサポートという 1 つの機能から始まったのではないかと思います。このサポートは拡張可能で、__getitem__ メソッドと __setitem__ メソッドを実装する任意の Python クラスをこの構文を使用してスライスできます。次のコード スニペットは、この Python 機能の強力さと自然さを示しています。

a = [1, 2, 3, 4, 5, 6, 7, 8]
印刷(a[1:4])
#[2, 3, 4]を返します - - 中央の要素を取り出すスライス
印刷(a[1:-1])
#[2, 3, 4, 5, 6, 7]を返します - 0番目と最後の要素をスキップします
印刷(a[4:])
#[5, 6, 7, 8]を返します - デフォルトのエンドポイント
印刷(a[:4])
#[1, 2, 3, 4]を返します - 開始点はデフォルトです

もちろん、それだけではありません。 Python コードは、古い Java コードに比べて、よりクリーンで簡潔です。未チェック例外のサポートにより、開発者は「すべてがクラスである」という Java の考え方にとらわれずに、ポリフィルを試すための 1 回限りの Python スクリプトを簡単に作成できます。 Python の使い方は簡単です。

しかし、現時点では、主な要因は、Python コミュニティが 2.7 と 3 の連携を維持するのに大苦労した一方で、適切に設計された高速な数値計算ライブラリ (NumPy) の構築に関してははるかに優れた仕事をしたということだと考えています。 Numpy は、N 次元配列オブジェクトである ndarray を中心に構築されています。ドキュメントから直接引用すると、「NumPy の主なオブジェクトは、同種の多次元配列です。これは、すべて同じ型の要素 (通常は数値) のテーブルであり、正の整数のタプルによってインデックス付けされます。」

NumPy ではすべて、データを ndarray に格納し、それに対して操作を実行することです。 NumPy は、さまざまな種類のインデックス作成、ブロードキャスト、速度向上のためのベクトル化をサポートしており、開発者が大規模な数値配列を簡単に作成および操作できるようにします。

次のスニペットは、ML/DL のコア操作である ndarray のインデックス作成とブロードキャストの動作を示しています。

numpyをnpとしてインポートする
#シンプルなブロードキャストの例
a = np.array([1.0, 2.0, 3.0])
2.0 です
c = a * b
印刷(c)
#returns [ 2. 4. 6.] - スカラーbは自動的に昇格/ブロードキャストされ、ベクトルaに適用されてcが作成されます。
#returnは[2. 4. 6.]を返します - スカラーbは自動的に昇格/ブロードキャストされ、ベクトルaに適用されてcが作成されます
#2-d (ランク 2 の行列) NumPy でのインデックス - これはテンソルに拡張されます - つまり、ランク > 2
y = np.arange(35).reshape(5,7)
印刷(y)
# 配列([[ 0, 1, 2, 3, 4, 5, 6],
# [ 7, 8, 9, 10, 11, 12, 13],
# [14, 15, 16, 17, 18, 19, 20],
# [21, 22, 23, 24, 25, 26, 27],
# [28、29、30、31、32、33、34]])
印刷(y[0,0])
# 単一セルアクセス - 表記は行優先で、0 を返します
印刷(y[4,])
# 4行目全体を返します: array([28, 29, 30, 31, 32, 33, 34])
印刷(y[:,2])
# 列2のすべてを返します: array([ 2, 9, 16, 23, 30])

大規模な多次元の数値配列の処理は、機械学習コーディング、特にディープラーニングの中心です。ディープ ニューラル ネットワークは、ノードとエッジのグリッドのデジタル モデルです。ネットワークをトレーニングするときやネットワーク上で推論を実行するときのランタイム操作には、高速な行列乗算が必要です。

NumPy により、scipy、pandas、および NumPy に依存する他の多くのライブラリが有効になりました。主要なディープラーニング ライブラリ (Google の Tensorflow、Facebook の PyTorch) は Python に重点的に投資されています。 Tensorflow には Go、Java、JavaScript 用の他の API もありますが、それらは不完全であり、不安定であると考えられています。 PyTorch はもともと Lua で書かれていましたが、2017 年にかなりニッチな言語から主要な Python ML エコシステムに移行したときに人気が急上昇しました。

Pythonの欠点

Python は完璧な言語ではありません。特に、最も人気のある Python ランタイムである CPython にはグローバル インタープリター ロック (GIL) があるため、パフォーマンスのスケーリングは簡単ではありません。さらに、PyTorch や Tensorflow などの Python DL フレームワークでは、コア メソッドが依然として不透明な実装のままになっています。

例えば、NVidiaのcuDNNライブラリはPyTorchをサポートしています
RNN/LSTM 実装の範囲は大きな影響を与えました。 RNN と LSTM は、Web クリックストリーム、テキスト スニペット、ユーザー イベントなどの連続した可変長シーケンスの分類と予測に特化しているため、特に商用アプリケーションにとって非常に重要な DL テクニックです。

公平に言えば、この不透明性/制限は、C または C++ で書かれていないほぼすべての ML/DL フレームワークに適用されます。なぜ?なぜなら、行列乗算などの高頻度演算においてコアから最大限のパフォーマンスを引き出すために、開発者は「基礎となる冶金学に可能な限り近づく」からです。

Java が競争するには何をする必要がありますか?

Java プラットフォームには、次の 3 つの主要な追加機能があり、これらが存在すれば、Java で健全かつ活発な機械学習エコシステムの出現が可能になると思います。

1. Pythonの使いやすさと表現力に匹敵するネイティブなインデックス/スライスのサポートをコア言語に追加する。おそらく、リストのような既存の順序付きコレクションの形で。

インターフェース中心。このサポートでは、ポイント 2 をサポートするために、オーバーロードを認識する必要もあります。

2. Tensor 実装を構築します。おそらく java.math パッケージ内ですが、Collections API にもブリッジされます。このクラスとインターフェースのセットは、ndarray と同等のものとして機能しますが、追加のインデックス サポート (具体的には、フィールド アクセス、基本スライス、ML のコーディングに必要な高度なインデックスの 3 種類の NumPy インデックス) がサポートされます。

3. ブロードキャストをサポートします - 任意の(ただし互換性のある)次元のスカラーとテンソル。

これら 3 つがコア Java 言語とランタイムに存在すれば、NumPy と同等の「NumJava」を構築する道が開かれます。 Project Panama は、CPU、GPU、TPU などで実行される高速テンソル演算へのベクトル化された低レベル アクセスを提供し、Java ML を可能な限り高速化するためにも使用できます。

これらの追加が些細なことだと言っているのではありません。決してそうではありません。しかし、Java プラットフォームにもたらされる潜在的なメリットは莫大です。

次のコード スニペットは、コア言語がスライス構文をサポートし、演算子のオーバーロードに関する現在の制限を尊重しながら、NumPy ブロードキャストおよびインデックス作成の例を NumJava の Tensor クラスで使用する方法を示しています。

//Java ブロードキャスト テンソル
// 簡潔にするためにJava 10のvar構文を使用する
// Java は演算子のオーバーロードをサポートしていないため、「a * b」は実行できません。
// これを要件リストに追加する必要がありますか?
var a = 新しい Tensor([1.0, 2.0, 3.0]);
var b = 2.0;
var c = a.mult(b);
/**
* Java Tensor クラスがどのようになるかを示したスニペット。
* Java Tensor クラスがどのように見えるかを示すスニペット。
*/
static java.math.Numeric.arange をインポートします。
//arangeはテンソルインスタンスを返し、reshapeはテンソル上で定義されます
var y = arange(35).reshape(5,7);
System.out.println(y);
// テンソル([[ 0, 1, 2, 3, 4, 5, 6],
// [ 7, 8, 9, 10, 11, 12, 13],
// [14, 15, 16, 17, 18, 19, 20],
// [21, 22, 23, 24, 25, 26, 27],
// [28、29、30、31、32、33、34]])
System.out.println(y[0,0]);
// 単一セルアクセス - 表記は行優先で、0 を返します
System.out.println(y[4,]);
// 4行目(0から始まる5行目)のすべてを返します idx: tensor([28, 29, 30, 31, 32, 33, 34])
System.out.println(y[:,2]);
// 列 2 のすべてを返します (0 から始まる 3 番目の列 idx): tensor([ 2, 9, 16, 23, 30])

要約する

この記事で概説した実用的な出発点から始めると、Web パーサー、永続性パーサー、XML パーサーと同じ数だけ、Java で記述され JRE 上で実行される機械学習/ディープラーニング フレームワークを作成できます。想像してみてください。最先端のコンピューター ビジョン用の畳み込みニューラル ネットワーク (CNN)、シーケンシャル データセット (ビジネスに重要) 用の LSTM などのリカレント ニューラル ネットワーク実装、自動微分化などの最先端の ML 機能をサポートする Java フレームワークを想像できます。これらのフレームワークは、IDE、テスト フレームワーク、継続的インテグレーションなど同じツールを使用する次世代のエンタープライズ グレードのシステムを強化し、実現します。

<<:  業界の洞察 | 世界の人工知能とその産業チェーン

>>:  自動運転トラックの普及が加速しているが、実用化にはどれくらいの時間がかかるのだろうか。

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

マイクロソフトとOpenAIが訴えられた後、アップルはニュース出版社とAIモデルのトレーニング費用の支払いについて交渉している

Appleは、AIモデルのトレーニングと開発のためにニュース資料にアクセスするために、いくつかの国際...

...

ADMap: 干渉防止オンライン高精度マップへの新しいアプローチ

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

MATRIX: 社会シミュレーションは、GPT4よりも配慮した大規模なモデル値の自己整合を促進します

ChatGPT などのモデルは、人間のフィードバックからの強化学習 (RLHF) に依存しており、注...

アリババDAMOアカデミーがAI分野の権威あるランキングトップ6を獲得:人間の学習方法で人間を超える

[[339371]] AIが人間の学習方法を模倣したら何が起こるでしょうか? 8月26日、アリババD...

...

AI モデルにバックドアがある可能性があります。チューリング賞受賞者が53ページの論文を発表「悪意ある予測には注意」

「敵対的事例」は古くからある問題です。画像内の数ピクセルを変更するなど、通常のデータにわずかな外乱...

XNOR-NETテクノロジー詳細解説:AIテクノロジーがモバイル端末に搭載され、新時代が到来

[[187849]]この時代、人間の生活はスマートデバイスから切り離すことはできません。持ち歩く携帯...

TensorFlow が機械学習開発に使用できるのはなぜですか?

機械学習は複雑な分野ですが、データの取得、モデルのトレーニング、予測の提供、将来の結果の改善のプロセ...

...

人工知能が初めて小児脳腫瘍治療薬の開発に貢献

専門家は、この画期的な進歩により、人工知能を使って新たながん治療法を開発するという新しい時代が到来す...

知能ロボットは人間との交流を終わらせるのでしょうか?

[[187072]]人間同士の交流はどうなったのでしょうか? 最新のテクノロジーの流行を真剣に受け...

人工知能の開発においてセキュリティは無視できない

世界的な科学技術革命と産業変革の新たな局面が本格化している。人工知能は、新たな科学技術革命と産業変革...