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、テスト フレームワーク、継続的インテグレーションなど同じツールを使用する次世代のエンタープライズ グレードのシステムを強化し、実現します。

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

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

ブログ    
ブログ    

推薦する

2019 年のトップ 5 ディープラーニング コース

現在、ディープラーニングはデータサイエンスの分野で最も人気のあるスキルとなっています。ディープラーニ...

AIがピークを迎える中、CIOはクラウドコンピューティングのコスト戦略を強化

AIがピークを迎える中、CIOはクラウドコンピューティングのコスト戦略を強化クラウド コンピューティ...

9つのディープラーニングアルゴリズムの紹介

1. 2段階アルゴリズム2 段階アルゴリズムには、候補ボックスの選択とターゲットの分類/位置の修正...

調査によると、米国の公共部門のIT意思決定者の70%にとってAIは「ミッションクリティカル」

テキサス州に拠点を置くラックスペース テクノロジーズが実施した調査によると、公共部門の IT 意思決...

LLM にとってベクター データベースが重要なのはなぜですか?

翻訳者 |ブガッティレビュー | Chonglou Twitter 、 LinkedIn 、またはニ...

優秀なプログラマーが開発効率を上げるために知っておくべき32のアルゴリズム

検索アルゴリズム - 指定された開始点から指定された終了点までのパスを計算するグラフ検索アルゴリズム...

...

現在世界で最も重要な古典的アルゴリズムトップ10

今日の世界では、数え切れないほどの古典的なアルゴリズムが発見または作成されてきました。最も価値あるア...

中国のAIハイテクが2018CESを制覇、Zhuner翻訳機が世界の家電「オスカー」を驚かせる

2018 CES(国際コンシューマー・エレクトロニクス・ショー)が1月9日から12日まで米国ラスベガ...

Nervana Technology の深掘り: Neon を使用したエンドツーエンドの音声認識の実装方法

音声は本質的に即時の信号です。音声で伝えられる情報要素は、複数の時間スケールで進化します。空気圧の影...

米メディア:なぜソフトロボットは科学者を魅了するのか?

[[374766]]米フォーチュン誌のウェブサイトは1月1日、「なぜ『ソフトロボット』はNASAや...

...

AIコピーライティングの11のメリット

この記事では、AI がコピーライターにもたらす 11 のメリットの一部と、次のプロジェクトで AI ...

Twitter が名前を X に変更し、マスク氏が X の世界を爆発させた! AIから宇宙探査まで、ユニバーサルアプリが形になりつつある

今、ボス・マーの「Xユニバース」がまた成長しました。それ以来、Twitter は単なるソーシャル ネ...