Julia は、高度に抽象化された動的プログラミング言語です。あらゆるプログラムを開発できる汎用言語ですが、科学技術計算や数値計算に適した特長をいくつか備えています。 Python は 1990 年代初頭にシンプルなオブジェクト指向プログラミング言語として登場し、現在では大きく進化しています。この記事では、ニューラル ネットワークと機械学習におけるパフォーマンスについて説明します。
Julia のアーキテクチャは、主に動的言語におけるパラメトリック ポリモーフィズムとマルチ ディスパッチのプログラミング パラダイムによって特徴付けられます。これにより、メッセージ パッシング インターフェイス (MPI) または組み込みの「OpenMP スタイル」スレッドの有無にかかわらず、同時並列および分散コンピューティングが可能になり、コードを追加することなく C および FORTRAN ライブラリを直接呼び出すことができます。 Julia はジャストインタイム (JIT) コンパイラを使用します。これは、実行前にデフォルトですべてのコードがマシンコードにコンパイルされるため、Julia コミュニティでは「ジャストアヘッドオブタイム (JAOT)」と呼ばれています。
Python とは異なり、Julia は統計と機械学習用に設計されています。 Julia は線形代数演算をすばやく実行できますが、Python は非常に遅いです。これは、Python が機械学習で使用される行列や方程式に対応するように設計されていないためです。 Python 自体、特に Numpy は悪くありませんが、パッケージを使用しない場合、Julia はより数学に合わせて作られているように感じます。 Julia の演算子は Python よりも R に似ており、これは大きな利点です。ほとんどの線形代数演算は、より少ない時間と労力で実行できます。
ご存知のとおり、Python は近年、機械学習とデータ サイエンスの分野を席巻しています。 Python では、機械学習コードの作成に役立つさまざまなサードパーティ ライブラリを使用できるためです。 Python には非常に多くの利点がありますが、依然として 1 つの大きな欠点があります。それは、Python がインタープリタ型言語であり、非常に遅いということです。今はデータの時代で、データが増えれば増えるほど処理に時間がかかるため、Julia が登場します。
これまでのところ、Julia に関する研究作業は、高性能や Julia の科学計算能力などのトピックに焦点を当ててきました。ただし、ここでは、複雑な科学計算だけでなく、ビジネスベースの問題、さらには機械学習や Python などのニューラル ネットワークも効率的に処理できる Julia の能力について説明します。
Julia は Python と同じくらい単純ですが、C と同様にコンパイルされた言語です。まず、Julia が Python よりもどれくらい速いかをテストしてみましょう。これを行うために、最初にいくつかの単純なプログラムでそれらをテストし、次に実験の焦点に移り、機械学習と深層学習の機能をテストします。
Julia と Python はどちらも、多くのライブラリとオープンソースのベンチマーク ツールを提供します。 Julia でのベンチマークと時間の計算には、 CPUTime
および time
ライブラリを使用しました。Python の場合は、 time ## も使用しました。 #モジュール。
最初は簡単な四則演算を試してみましたが、あまり時間差がなかったので、行列の掛け算の時間差を比較することにしました。ランダムな浮動小数点数の 2 つの (10 * 10)
行列を作成し、それらに対して内積を実行します。ご存知のとおり、Python には Numpy
ライブラリがあり、行列やベクトルの計算によく使用されます。 Julia には、行列やベクトルの計算によく使用される LinearAlgebra
ライブラリもあります。そこで、ライブラリを使用した場合と使用しない場合で行列乗算にかかる時間をそれぞれ比較しました。この記事で使用されているすべてのソース コードは、 GitHub リポジトリ に配置されています。以下に、Julia で書かれた 10×10 行列乗算プログラムを示します。
@time LinearAlgebra.mul!(c,x,y) function MM() x = rand(Float64,(10,10)) y = rand(Float64,(10,10)) c = zeros(10,10) for i in range(1,10) for j in range(1,10) for k in range(1,10) c[i,j] += x[i,k]*y[k,j] end end end end @time MM 0.000001 seconds MM (generic function with 1 method)
Julia では、ライブラリを使用すると 0.000017 秒、ループを使用すると 0.000001 秒かかりました。
Python を使用して、次のように同じ行列乗算プログラムを作成します。結果から、ライブラリを使用したプログラムは、ライブラリを使用しないプログラムよりも時間がかかることがわかります。
import numpy as np import time as t x = np.random.rand(10,10) y = np.random.rand(10,10) start = t.time() z = np.dot(x, y) print(“Time = “,t.time()-start) Time = 0.001316070556640625 import random import time as t l = 0 h= 10 cols = 10 rows= 10 choices = list (map(float, range(l,h))) x = [random.choices (choices , k=cols) for _ in range(rows)] y = [random.choices (choices , k=cols) for _ in range(rows)] result = [([0]*cols) for i in range (rows)] start = t.time() for i in range(len(x)): for j in range(len(y[0])): for k in range(len(result)): result[i][j] += x[i][k] * y[k][j] print(result) print(“Time = “, t.time()-start) Time = 0.0015912055969238281
Python では、ライブラリを使用すると 0.0013 秒、ループを使用すると 0.0015 秒かかります。
次に実行した実験は、ランダムに生成された 10 万個の数値に対する線形検索です。ここでは 2 つの方法が使用されています。1 つは for
ループを使用する方法、もう 1 つは演算子を使用する方法です。 1 ~ 1000 の整数を使用して 1000 回の検索を実行しました。また、以下の出力でわかるように、データセット内で見つかった整数の数も出力しました。以下に、ループを使用する場合と、 IN
演算子を使用する場合の時間を示します。ここでは、3 つの CPU 実行時間の中央値を使用します。
Julia で書かれたプログラムと実行結果は次のとおりです。
(LCTT 翻訳注釈: ここの原文には Julia コードがありません)
Julia で書かれたプログラムPython と実行結果は次のとおりです。
import numpy as np import time as t x = np.random.rand(10,10) y = np.random.rand(10,10) start = t.time() z = np.dot(x, y) print(“Time = “,t.time()-start) Time = 0.001316070556640625 import random import time as t l = 0 h= 10 cols = 10 rows= 10 choices = list (map(float, range(l,h))) x = [random.choices (choices , k=cols) for _ in range(rows)] y = [random.choices (choices , k=cols) for _ in range(rows)] result = [([0]*cols) for i in range (rows)] start = t.time() for i in range(len(x)): for j in range(len(y[0])): for k in range(len(result)): result[i][j] += x[i][k] * y[k][j] print(result) print(“Time = “, t.time()-start) Time = 0.0015912055969238281
FOR_SEARCH: Elapsed CPU time: 16.420260511 seconds matches: 550 Elapsed CPU time: 16.140975079 seconds matches: 550 Elapsed CPU time: 16.49639576 seconds matches: 550 IN: Elapsed CPU time: 6.446583343 seconds matches: 550 Elapsed CPU time: 6.216615487 seconds matches: 550 Elapsed CPU time: 6.296716556 seconds matches: 550
上記の結果から、Julia でループと演算子を使用しても、大きな時間差は生じません。ただし、Python でのループ処理には、演算子 IN よりもほぼ 3 倍の時間がかかります。興味深いことに、どちらの場合でも、Julia は Python よりも大幅に高速です。
次の実験は、機械学習アルゴリズムをテストすることです。私たちは、単純なデータセットを使用する、最も一般的で最も単純な機械学習アルゴリズムの 1 つである線形回帰を選択しました。使用したデータセット「Head Brain」には、「HeadSize」と「BrainWeight」の 2 つの列からなる 237 個のデータが含まれています。次に「頭の大きさ」のデータを使って「脳の重さ」を計算します。 Python と Julia の両方で、サードパーティのライブラリを使用せず、線形回帰アルゴリズムを最初から実装しました。
Julia:
GC.gc() @CPUtime begin linear_reg() end elapsed CPU time: 0.000718 seconds
Python:
gc.collect() start = process_time() linear_reg() end = process_time() print(end-start) elapsed time: 0.007180344000000005
Julia と Python にかかる時間は上記のとおりです。
次に、両方の言語のライブラリを使用して、最も一般的な機械学習アルゴリズムであるロジスティック回帰の実験を実行しました。 Python の場合は最も一般的なライブラリ sklearn
を使用し、Julia の場合は GLM
ライブラリを使用します。ここで使用するデータセットは銀行顧客に関するもので、10,000 件のデータ エントリが含まれています。ターゲット変数は、消費者が銀行口座を使い続けるかどうかを区別するバイナリ変数です。
Julia がロジスティック回帰を実行するのにかかる時間は以下のとおりです:
@time log_rec() 0.027746 seconds (3.32 k allocations: 10.947 MiB)
Python がロジスティック回帰を実行するのにかかる時間は以下のとおりです:
gc.collect() start = process_time() LogReg() end = process_time() print(end-start) Accuracy : 0.8068 0.34901400000000005
在各种程序和数据集上测试这两种语言后,我们在神经网络上使用 MNIST 数据集继续测试它们。该数据集包含从零到九的手绘数字的灰度图像。每张图像为 28×28 像素。每个像素值表示该像素的亮度或暗度,该值是包含 0 到 255 之间的整数。该数据还包含一个标签列,该列表示在相关图像中绘制的数字。
Figure 1: Example of MNIST data set
图 1 是 MNIST 数据集的示例。
对两种语言我们都建立了一个简单的神经网络来测试它们耗费的时间。神经网络的结构如下:
Input ---> Hidden layer ---> Output
该神经网络包含了一个输入层、隐层还有输出层。为了避免神经网络的复杂度过高,我们对数据集没有进行任何的预处理工作。在 Julia 和 Python 中我们都进行了40次训练并比较它们的时间差异。
Figure 2: Julia takes 5.76 seconds in a neural network
在 Julia 中,Flux
库通常被用于建立神经网络;在 Python 中我们常使用 Keras
库。图 2 展示了 Julia 在神经网络上的耗时。图 3 展示了 Python 的神经网络经过了若干次训练的耗时。
Figure 3: Python takes 110.3 seconds in a neural network
这个结果展示了 Julia 和 Python 在处理神经网络时存在巨大的时间差异。
表 1 总结了此次实验的测试结果并计算了 Julia 和 Python 时间差异的百分比。
实验 |
Julia(秒) |
Python(秒) |
时间差(%) |
|||
矩阵乘法(不使用库) |
0.000001 |
0.0015 |
99.9 |
|||
##行列の乗算 ( を使用)ライブラリ) |
0.000017 |
0.0013 |
98.69 |
|||
|
|
|||||
#0.43 |
##6.2 |
93.06 |
#線形回帰 |
|||
|
|
| #0.025 |
0.34901 | ##92.83 | #ニューラル ネットワーク|
|
##110.3 |
94.77 |
|
以上がJulia と Python、どちらが速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。