Julia 語言的未來性
目錄
Julia 作為一個新興的語言,他有眾多的優點,他不僅執行快速,而且像 python 一樣,是動態語言非常容易上手好寫。Julia 本身的套件管理系統也具有足夠高的再現性(reproducible),並且自動安裝內含編譯過的函式庫檔案。作為一個泛用性以及開源的程式語言,這些特色帶來許多優點。
隨著今日科學社群不斷的擴大,科學計算與數值計算相關的軟體也不斷的發展,Julia 作為一個以科學計算為目的的語言,不僅融合了現代的科學計算工具、新穎的演算法、優異的性能,以及平易近人的語法。由於 Julia 優異的語法設計,搭配多重分派以及型別系統,讓獨到的即時編譯(just-in-time compilation)變得自然,型別推斷讓 Julia 的速度得以提升。
現代化
科學計算有長遠的歷史。在歷史悠久的軟體當中很難整合現代的功能,例如 GPU 或 TPU 支援,有的甚至連平行處理都可能沒有。Julia 語言挾著年輕的優勢,在建立微分方程套件時,也整合了 CUDA 的運算。語言的可組合性讓各式各樣的數值計算方法以及模型,可以輕鬆的支援 GPU 以及 TPU 的運算。在同樣的編譯器架構下,相同的原始碼可以被編譯為不同硬體的版本。
優秀的套件管理系統也是近代才有的產物,他可以確保套件的安裝與移除是完整的,並且套件不會有遺失的狀況。Python 的 Anaconda 也是優秀的套件管理系統。Julia 背後支援的 BinaryBuilder.jl,可以整合套件中需要使用到的動態函式庫,以及一些編譯好的執行檔。因此,目前 Julia 的套件,像是 CUDA.jl,所需要的函式庫,例如 CUDA 函式庫,就可以藉由 Julia 的套件管理系統安裝到。使用 CUDA.jl 時,他會自動地而且惰性地(lazy)安裝相對應的 CUDA 函式庫。
機器學習
Python 是目前最大的機器學習語言,他擁有 TensorFlow 以及 PyTorch 兩大深度學習框架,分別由 Google 及 Facebook 維護。然而 Julia 也在深度學習套件上有著不輸 Python 的特色。深度學習框架的一個核心引擎是自動微分,我們訓練模型都需要倒傳遞演算法(backpropagation),倒傳遞演算法計算的則是模型的微分式,面對各式各樣不同的深度學習模型,我們不可能為每一個深度學習模型量身訂製一套他們自己的微分式,所以我們勢必要讓電腦知道怎麼自動推論模型的微分式。Zygote.jl 就是在 Julia 上非常知名的自動微分推論引擎,在開發者積極的開發下,Julia 的自動微分推論引擎已經成爲語言的第一支援,由於語言本身支援的自動微分引擎可以微分任何東西。如此徹底的實現了 LeCun 講的可微分程式設計(differentiable programming)。如此,這樣子的系統在機器學習領域佔有一席之地。
Flux.jl 是在 Julia 上使用 Zygote.jl 作為自動微分引擎的深度學習框架,其中的影像辨識及自然語言處理模型都已經使用這個自動微分引擎自動推論。Flux.jl 是個百分之百純 Julia 寫成的深度學習框架,它支援高階的抽象,以及低階的 API,也就是,要像 Keras 那樣一層一層定義網路架構,或是自己從底層寫起,定義 loss function、定義運算,甚至是梯度或是 normalization 都是可行的。套件裡的函式都可以直接跟語言相容,所以 Flux.jl 讓開發者有非常大的自由度以及彈性可以自由發揮。本身支援 CUDA,但不依賴 CUDA C 函式庫,由 Julia 社群提供的 CUDA 編譯器,可以直接將 Julia 的原始碼編譯為虛擬組合語言並且送至 GPU 執行,所以可以利用 Julia 語言本身的編譯能力最佳化 CUDA 的執行效率。
不只深度學習,在經典的機器學習套件,Julia 有 MLJ 這個由英國的 The Alan Turing Institute 所開發及維護的機器學習套件,目前所支援的模型數在一百五十個以上,足以覆蓋一般商業及工程的應用場景。MLJ 也支援 scikit-learn 套件中的模型在 Julia 使用,
Turing.jl 是 Julia 中支援機率程式設計(probabilistic programming)的知名套件。不只可以自己用機率搭建機器學習模型,還可以訓練機率性深度學習網路,或稱貝氏深度學習(Bayesian deep learning)。目前此套件也跟 Flux 以及 MLJ 整合,可以結合各方所長,打造更加穩固而可信的模型與系統。
資料科學
有了充足的機器學習基礎,資料科學家的得力工具更是不可或缺。
DataFrames.jl 提供了對應於 pandas 的功能,能夠操作表格類(tabular)的資料,並搭配 Statistics 或 StatsBase 提供多樣的統計功能,可以方便地對資料做抽樣、分割、選取欄位,甚至是樞紐分析。如果需要處理時間序列相關的資料,只要搭配 Julia 語言本身的 Dates 及 TimeZones,便可以方便地在 DataFrame 物件中操作時間序列資料。
資料的讀取則由不同的套件負責。CSV.jl 支援 .csv、.tsv 等等相關檔案的讀取,Excel 檔案則由 ExcelFiles.jl 或是 XLSX.jl 負責。不同的讀檔都可以得到 DataFrame 物件,處理完之後儲存成各自的檔案格式中。
Gadfly.jl 支援非常優秀的繪圖功能,不僅有 garmmar of graphics 的語法設計,並且繪圖類似於 R 的 ggplot2。Plots.jl 支援眾多的繪圖引擎後端,包含 GR、plotly、pyplot、UnicodePlots 等等繪圖引擎。可以繪製的圖形種類眾多,搭配上 StatsPlots.jl 或是 GraphPlot.jl,更可以支援 graph 物件的繪製。
CSV.jl 也跟資料庫整合地非常好,有 Tables.jl 作為介面,並且可以將資料流導向 SQLite、MySQL 或是 PostgresQL 等等資料庫系統。如果希望在資料流水線上對資料做處理,TableOperations.jl 可以提供相關的功能,在資料流過時做即時地處理。
微分方程
Julia 也有號稱地表最強大的微分方程套件 DifferentialEquations.jl,支援多種微分方程的計算,包含常微分方程(ordinary differential equations, ODEs)、偏微分方程(partial differential equations, PDEs)、隨機微分方程(Stochastic ordinary differential equations, SDEs)、微分代數方程(Differential algebraic equations, DAEs)等等。同時比較了不同語言的微分方程套件,包含 MATLAB, R, Julia, Python, C, Mathematica, Maple 和 Fortran,Julia 的 DifferentialEquations.jl 有全方位優異的表現。
科學機器學習
由於近年來深度學習及機器學習的興起,Julia 也整合了經典微分方程及深度學習的計算,基於神經微分方程(neural ODE),將所有種類的微分方程以及深度學習模型做了整合,則有了科學機器學習(scientific machine learning, SciML)的新領域。此領域以及相關的套件工具是其他語言社群所沒有的,這同時也彰顯了 Julia 一個非常重要的語言特性:可組合性的威力。
科學機器學習是結合機器學習或深度學習與經典的微分方程的方法。由於目前科學探索還有部分領域,還有未知的部份是尚未可以用微分方程求解的,所以這部分可以先用深度學習或是機器學習模型加以取代,待日後研究更進一步。如此,整合機器學習或是深度學習的科學計算方法,成為了科學機器學習的主軸,並且以神經微分方程為核心出發,攻克各個科學的未知領域。
作業研究及最佳化
JuMP.jl 包含眾多作業研究及最佳化方法的套件,裡頭支援的方法包含一般的線性規劃(linear programming)、混和整數規劃(mixed-integer programming)、二階錐規劃(second-order conic programming)、半定性規劃(semidefinite programming)以及非線性規劃(nonlinear programming)等等。更有 Changhyun Kwon 教授幫這個套件寫書,介紹作業研究這個領域,並且書上的範例為 Julia 程式碼。
Julia 將成為未來科學計算與人工智慧的計算引擎
以上述的科學計算與機器學習套件為基礎,在 Julia 這個可組合性極佳的語言底下,各個套件可以發揮其 1+1 > 2 的能力,不同套件之間可以無縫地整合,不如其他語言的套件之間會有不同的界面或是隔閡存在。在極具彈性的語法跟極佳的效能下,能夠發揮硬體最大的極限。可以想見,Julia 將成為未來科學計算與人工智慧的計算引擎!
除了上述跟學術或是理論相關的套件以外,Julia 也有非常優秀的 MVC 架構的網站框架 – Genie.jl,有 routing 機制,頁面呈現有模板語言(template language),模型與資料庫有物件關係對映(object relational mapping,ORM),可以寫 RESTful API 或是大型網站。在強大的計算模型的基礎之上,也可以提供網頁的應用程式。
目前已經有非常多世界頂尖大學以及研究所在教授 Julia,可以參考官網頁面最底下。在自動控制與最佳化理論領域相當知名的 Stephen Boyd 教授,與 Lieven Vandenberghe 教授,所共同撰寫的 Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares,更是將範例程式碼從 MATLAB 轉成 Julia。目前正在從人才端補足 Julia 程式設計師不足的狀態。
目前 Julia 語言已經穩定,而相關套件也正在趨於完善,想必未來能帶給這個世界更加精彩的作品!