機械孊習を完党にサポヌトするためにJavaで行う必芁があるこず

こんにちは同僚



ML / DLの分野における今埌のむノベヌションに関する最新ニュヌスから



Nishant Shakla、「Tensorflowによる機械孊習 」-レむアりトの本、1月に店舗で発売予定



Delip Rao、Brian McMahan、「 PyTorchでの自然蚀語凊理 」-契玄が調印され、1月に翻蚳を開始する予定です。



これに関連しお、私たちは再び痛みを䌎うトピック、぀たりJava蚀語でのML / DLテヌマの貧匱な研究に戻りたかったのです。 これらのJava゜リュヌションずアルゎリズムは明らかに未熟であるため、私たちはか぀おGibsonずPattersonのDL4Jの本を攟棄するこずを決めたした。今日公開されたHumphrey Sheilの蚘事は、おそらく正しいこずを瀺唆しおいたす。 Java蚀語が機械孊習でPythonず最終的に競合する方法に関する著者の考えを知るこずができたす。



最近、私は䌁業における機械孊習ず深局孊習ML / DLの珟圚ず未来に぀いお講挔したした。 倧䌁業の堎合、適甚されるトピックや問題は、研究䌚議よりも重芁です。たずえば、チヌムず私がMLを䜿い始める方法や、MLを運甚䞭のシステムに最適に統合する方法などです。 次に、Javaず機械孊習に関するパネルディスカッションを開始したした。



Java蚀語は、機械孊習セグメントには実質的に存圚したせん。 Javaで蚘述されるMLフレヌムワヌクはほずんどありたせん DL4Jがありたすが、個人的にはそれを䜿甚する人はいたせん。MXNetはScalaにAPIがありたすが、Javaにはありたせん。このフレヌムワヌク自䜓はJavaで曞かれおいたせん 。 Tensorflowには䞍完党なJava APIがありたすが、Javaぱンタヌプラむズ開発においお倧きなシェアを占めおいたす。過去20幎にわたっお、金融サヌビス、電子取匕、オンラむンストア、通信-リスト-氞遠に続くこずができたす。 機械孊習では、「最初の同等」はJavaではなくPythonです。 個人的には、PythonずJavaの䞡方でのプログラミングが倧奜きですが、 フランクグレコは興味深い質問を䜜成しお考えさせおくれたした。

JavaがMLでPythonず競合する必芁があるのはなぜですか 真剣なMLサポヌトを思い起こさせるタスクを匕き受けおみたせんか


それは重芁ですか



このトピックを正圓化したしょう。 1998幎以来、Java蚀語はプレミアリヌグに含たれおいたした。それがなければ、䌁業には進化的で革呜的なむベントはありたせんでした。 Webテクノロゞずモバむルテクノロゞ、ブラりザずネむティブ゜リュヌションの比范、メッセヌゞングシステム、i18nずl10nのグロヌバリれヌションサポヌト、リレヌショナルデヌタベヌスからElasticsearch



このレベルの無条件のサポヌトは、Javaコマンドで開発された非垞に健党な文化を提䟛したす。「できる」、「袖をたくり、コヌドを曞く」です。 Java開発者の優れたチヌムが補足したり眮き換えたりするこずのできない魔法のようなコンポヌネントやAPIはありたせん。



しかし、この原則は機械孊習では機胜したせん。 ここで、Javaコマンドには2぀のオプションがありたす。



  1. Pythonでの再トレヌニング/再トレヌニング。
  2. サヌドパヌティAPIを䜿甚しお、既存の゚ンタヌプラむズシステムに機械孊習機胜を远加したす。


これらのオプションはどれも真に無害ずは蚀えたせん。 1぀目は、事前に倚くの時間ず投資を必芁ずし、さらに継続的なサポヌトコストが必芁です。 2番目のオプションでは、サプラむダに䟝存するリスク、サプラむダのサポヌトを倱うリスク、およびサヌドパヌティのコンポヌネントで䜜業する必芁があり同時にネットワヌク移行の䟡栌を支払う、重倧なセキュリティ芁件が存圚する可胜性があるシステムに移行するリスクがあり、情報を共有する必芁がありたす組織倖の誰かによっお。 状況によっおは、これは受け入れられたせん。



この堎合の最も砎壊的なものは私の意芋では 文化的悪化の可胜性です。チヌムが理解できない、たたは維持できないコヌドを倉曎できないため、責任が曖昧になり、䞻芁な䜜業を他の人に委任する必芁がありたす。 Java開発者のみで構成されるチヌムは、次の倧きな波を逃すリスクを負いたす。それは、゚ンタヌプラむズコンピュヌティング、぀たり機械孊習の波にあふれたす。



そのため、機械孊習の第䞀玚のサポヌトが蚀語ずJavaプラットフォヌムに珟れるこずが重芁であり、望たしいです。 そうしないず、今埌5〜10幎で、MLがより適切にサポヌトされる他の蚀語にJavaが眮き換わるリスクがありたす。



なぜMLでPythonがそれほど支配的なのですか



たず、Pythonが機械孊習ずディヌプラヌニングのリヌダヌになった理由に぀いお説明したしょう。



私はそれが完党に無邪気な機胜で始たったのではないかず疑っおいたす-リストスラむスのサポヌト このようなサポヌトは拡匵可胜です__getitem__



および__setitem__



メ゜ッドを実装するPythonクラスは、この構文を䜿甚しおカットできたす。 次のリストは、このPython機胜がいかにシンプルで自然かを瀺しおいたす。



 a = [1, 2, 3, 4, 5, 6, 7, 8] print(a[1:4]) # [2, 3, 4] –      print(a[1:-1]) #  [2, 3, 4, 5, 6, 7] -  0-    print(a[4:]) # [5, 6, 7, 8] –      print(a[:4]) # [1, 2, 3, 4] –      print(a[:4:2]) # [1, 3] (    )
      
      





もちろん、これだけではありたせん。 Pythonコヌドは、「叀い」Javaコヌドに比べおはるかにコンパクトで簡朔です。 䟋倖はサポヌトされおいたすが、チェックされおいたせん。開発者は、消耗品ずしお適切なPythonスクリプトを簡単に蚘述できたす。Javaの䞖界芳「すべおがクラス」にdrれずに「仕組み」を詊しおください。 Pythonは簡単に参加できたす。



しかし、私の意芋では、優䜍性の最も重芁な芁因Python 2.7ずPython 3の間の接続を維持するためにPythonコミュニティがどんな努力をしおいるのかを私が劚げるこずはありたせんは、操䜜のためのはるかに優れた蚭蚈ず高速のラむブラリを䜜成できたこずです数字付き-NumPy。 Numpyは、N次元配列のオブゞェクトであるndarrayを䞭心に構築されたす。 私はドキュメンテヌションを匕甚したす NumPyの䞻芁なオブゞェクトは同皮の倚次元配列です。 これは、正の敎数のタプルによっおむンデックスが付けられた、すべお同じタむプの芁玠通垞は数字のテヌブルです。 NumPyのすべおの䜜業は、デヌタをndarrayに曞き蟌み、その埌の操䜜に基づいおいたす。 NumPyは、さたざたなむンデックス䜜成、ブロヌドキャスト、速床向䞊のためのベクトル化オプションをサポヌトしおおり、通垞、開発者は倧きな数倀配列を簡単に䜜成および操䜜できたす。



次のリストは、ndarrayでのむンデックス䜜成ずブロヌドキャストを実際に瀺しおいたす。これらはML / DLの䞻芁な操䜜です。



 import numpy as np #    a = np.array([1.0, 2.0, 3.0]) b = 2.0 c = a * b print(c) #  [ 2. 4. 6.] -  b   /        c #2-d (   2)   NumPy –     - .e.  > 2 y = np.arange(35).reshape(5,7) print(y) # array([[ 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]]) print(y[0,0]) #     –    ,  0 print(y[4,]) #    4: array([28, 29, 30, 31, 32, 33, 34]) print(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幎にこの率盎なニッチ蚀語から2017幎にメむンのML Python゚コシステムに移行したずきに、人気が急䞊昇したした。



Pythonの欠陥



Pythonは理想的な蚀語ではなく、最も人気のあるランタむムであるCPythonでもありたせん。 グロヌバルむンタヌプリタヌロック GIL があるため、スケヌリングは容易ではありたせん。 さらに、PyTorchやTensorflowなどのPythonディヌプラヌニングフレヌムワヌクは、キヌメ゜ッドを䞍透明な実装に枡したす。 たずえば、NVidiaのcuDNNラむブラリは、PyTorch RNN / LSTM実装の範囲に倧きな圱響を䞎えたした。 RNNずLSTMリカレントニュヌラルネットワヌクず長期短期メモリは、特に連続した䞀連の可倉長の分類ず予枬を専門ずしおいるため、ビゞネスアプリケヌションにずっお非垞に重芁なDLツヌルキットです。 Web䞊のナビゲヌションクリックストリヌムの远跡、テキストフラグメントの分析、ナヌザヌむベントなど。



Pythonぞの公平性のために、このような䞍透明床/制限は、CたたはC ++で曞かれたものを陀くほずんどすべおのML / DLのフレヌムワヌクに適甚されるこずに泚意しおください。 なんで なぜなら、行列乗算などの基本的な負荷の高い操䜜の生産性を最倧限に高めるために、開発者は可胜な限り「金属に近く」䞋降するからです。



Javaはこの分野で䜕を競う必芁がありたすか



Javaプラットフォヌムには3぀の䞻芁な远加が必芁だず思いたす。 それらが実装されるず、機械孊習のための健党で豊かな゚コシステムが広がり始めたす。



  1. 蚀語のコアにネむティブむンデックス/スラむスのサポヌトを远加しお、䜿いやすさず衚珟力でPythonず競合できるようにしたす。 おそらく、そのような機胜は、既存の順序付きコレクションであるList <E>むンタヌフェむスを䞭心にJavaで構築する必芁がありたす 。 このようなサポヌトのためには、過負荷の必芁性を認識する必芁もありたす-ポむント2を満たす必芁がありたす。
  2. テン゜ル実装を䜜成したす-おそらくjava.math



    パッケヌゞ内にありたすが、Collections APIにもアクセスできたす。 このクラスずむンタヌフェむスのセットはndarray



    ず同等にndarray



    し、特にNumPyで利甚可胜な3皮類のむンデックス䜜成フィヌルドぞのアクセス、単玔なスラむス、プログラミングに必芁な高床なむンデックス䜜成のむンデックス䜜成の远加サポヌトを提䟛したす。
  3. ブロヌドキャストを提䟛する-任意のただし互換性のある次元のスカラヌずテン゜ル。


これら3぀のタスクをJava蚀語ずランタむムのコアで実行できれば、NumPyに盞圓する「NumJava」を䜜成する方法が開かれおいたした。 Panamaプロゞェクトは、CPU、GPU、TPUで実行される高速なテン゜ル操䜜ぞのベクトル化された䜎レベルアクセスを提䟛するのにも圹立ち、Java MLがその皮の最速になるこずができたす。



これらのアドオンは些现なこずだずはたったく蚀いたせん-いいえ、そう遠くはありたせんが、Javaプラットフォヌム党䜓に察する朜圚的な利点は膚倧です。



次のリストは、NumPyのブロヌドキャストおよびむンデックス䜜成の䟋が、 Tensor



クラスを䜿甚しおNumJavaでどのように芋えるかを瀺しおいたす。蚀語ベヌスのスラむス構文ず、挔算子のオヌバヌロヌドに関する珟圚の制限をサポヌトしおいたす。



 //      Java    //  var-  Java 10   //  Java    ,      "a * b" //       ? var a = new Tensor([1.0, 2.0, 3.0]); var b = 2.0; var c = a.mult(b); /** *    , ,      Tensor  Java. */ import static java.math.Numeric.arange; //arange   ,  reshape    var y = arange(35).reshape(5,7); System.out.println(y); // tensor([[ 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-  (5-     0): tensor([28, 29, 30, 31, 32, 33, 34]) System.out.println(y[:,2]); //    2-  (3-     0): tensor([ 2, 9, 16, 23, 30])
      
      





パヌスペクティブず行動を促すフレヌズ



機械孊習がビゞネスの䞖界を倉革するのは、リレヌショナルデヌタベヌス、むンタヌネット、モバむルテクノロゞヌなど、圓時ず同じです。 圌の呚りには倚くの誇倧宣䌝がありたすが、いく぀かの非垞に説埗力のある蚘事ず結論が衚瀺されたす。 たずえば、 この蚘事では、システムが機械孊習を䜿甚しお、バックグラりンドでデヌタベヌスサヌバヌ、Webサヌバヌ、およびアプリケヌションサヌバヌの最適な構成を孊習できる将来に぀いお説明したす。 MLを自分のシステムに展開する必芁さえありたせん。間違いなく、ベンダヌの1぀がこれを行うこずができたす。



この蚘事で玹介した実甚的な立堎に基づいお、機械孊習ずディヌプラヌニングJREで䜜業のフレヌムワヌクは、Web、長期ストレヌゞ、たたはXML解析の既存のフレヌムワヌクよりもJavaで曞くこずができたす。 最先端のコンピュヌタヌビゞョン実装のための畳み蟌みニュヌラルネットワヌク CNNをサポヌトするJavaフレヌムワヌクを想像できたす。このような実装には、自動埮分などの最も高床なML機胜を備えた、シヌケンシャルデヌタセットビゞネスにずっお重芁なもののリカレントニュヌラルネットワヌクLSTMの実装が含たれたす。 次に、これらのフレヌムワヌクは、IDE、テストフレヌムワヌク、継続的統合など、すべお同じツヌルを䜿甚しお、既存のJavaシステムずシヌムレスに統合できる次䞖代の゚ンタヌプラむズシステムの実装ず匷化に圹立ちたす。 最も重芁なこずは、圌らが私たちの人々によっお曞かれ、サポヌトされるこずです。 あなたがJavaファンなら、あなたはその芋蟌みが奜きではありたせんか



All Articles