なぜ Python はディープラーニング・機械学習向けの人気プログラミング言語になったのか?

Question

この記事では「Q. なぜPythonはディープラーニング・機械学習向けの人気プログラミング言語になったのか?」という問いに,管理人なりに答えたい.

Answer (の著者が考える例)

これまでもざんざん掘り変えされた話題であり,Web検索をして頂ければ,各種ブログサイトだけでなく,RedditやQuora等の,大手QAサイトでも沢山の人たちのより多視点かつ様々な回答が見られる質問である.ただ,この記事では,私なりの画像認識屋さんとしての回答もできるので,あらためて本質に私なりの答えの例を述べておきたい.

科学計算まわりのオープンソースコミュニティの歴史や,numpy, scikit-learnの成り立ちに,米国での大学教育でのPython採用の躍進など,「エンジニア目線での普及の話」は,他の記事に任せておくことにする.その代わりに,この記事では研究者の端くれとしてコンピュータビジョン系の研究コミュニティの視点という観点に主な焦点を当てて,Pythonが機械学習や画像認識の主要言語となった歴史的経緯を述べておきたい.(※ ちなみに著者はアラフォーである)

Python に機械学習ライブラリが揃っていった経緯

機械学習の視点で見ると,現在,まず1台のPC内での作業を行うには「scikit-learn」の存在がある.深層学習までの基本的な機械学習モデル (SVMやk-NNなど) はsckikit-learnからすぐ使えるので,python では快適にプロトタイピングが可能である.また,ビックデータ解析用の分散サーバ構築目的では,Pythonで使えるApache Spark の存在なども大きい (Sparkは,Java/Scala 版もある).その理由は,機械学習の学習フェーズでは,巨大行列の操作や巨大テーブルの操作が必要だからSparkなどクラスタで分散化する必要が出てくる.

分散環境に限らず1台のPCで作業する場合も,プログラミング言語にリスト操作やベクトル操作が備わっているだけでは機械学習を行うには足りない.行列操作や最適化,ならびに確率統計がすぐに使える言語やライブラリが揃っていないと,機械学習のアルゴリズムは構築しづらい.

Pythonには行列処理向けに(Matlab-likeな)Numpyが昔から存在していたが,それに加えてデータ分析屋さん向けにはScipyやPandasなども登場した.「現場のエンジニアが,機械学習やデータ分析を行う際に,Rとpythonのどちらにしようか決定打がなかった」時代に,Pythonにもscikitも整備されていったり,Pythonの作者がGoogleに入社してWeb開発でもPythonが注目を浴びるなどの経緯もあって,他のプログラミング言語で機械学習やデータ分析を行っていた人たちのPythonへの移行が,2010年前後あたりに始まってきた(「データサイエンスブーム」がアメリカで始まった頃である).その流れの中でも,統計系の研究者は,当時もRを使い続けていたであろうが,実システムで機械学習予測や統計解析が使われるようになってきた中で,Pythonが機械学習やビッグデータ解析用の言語として選ばれるケースが増えてきたわけである.

IPython Notebook (Jupyter)の,Python人気への貢献度の大きさ

その中で,特に IPython Notebook (現 Jupyter Notebook ) の登場は大きかった.ノート環境で保存・実行したいというのは,データサイエンス側の現場のニーズからであったとも思うが,有料ツールのMathmatica Notebook等にインスパイアされた(その無料代替版を狙う) IPython Notebookと,コマンドラインベースのデータサイエンス向け計算環境であるPython + IPythonは 非常に相性が良かった .Perforce のフリー代替としてSubversionが出て,のちにGitが人気になっていったのと似た話である.Linuxなどもそうであるが,結局オープンソースコミュニティのやりたいことは,高価で便利な商用ツールのフリー代替化であるので.

かつて,科学計算で人気だったMatlabやデータサイエンスで人気だったRにも,ノートブック機能はなかったので,Jupyter Notebookの登場はとても大きかったと考える.2010年台初頭のあたりでは,データ解析側だとRStudioとR言語というチョイスが,データベーステーブルや帳票データに対する統計解析ではまだ人気であったと思うが,IPython が Notebook化もされたおかげで,Pythonでの機械学習やデータ解析の格段に便利さがグンと増して,かつPython言語でのコードの共有もGithubの隆盛もあり,更に活発化されたわけである.近年ではそれがGoogle Colabなどにも派生・継承されて,Deep Learning クラウドの利用利便性も増し,PyTorchをはじめ機械学習周りのツールが全て揃ったPythonと深層学習の相性が確固たるものとなっていると感じる.今更Python以外のインタプリタ言語で,Pythonと同等の機械学習ライブラリ群やインタラクティブツール群が整備されるとは思えない状況である.

ただし,ここでは詳しくは述べないが,Pythonは多少不便なところもある,一時代前のスクリプト言語でもあるので,言語として機械学習やディープラーニングに最適だとは思わない.一部分をc言語など低レベル言語で書かなくても,高性能がそのまま担保できて,(自然に数式をコードに落としづらいnumpyと違って) 数式通りにコードを書きやすいプログラミング言語が,機械学習でも覇権をとってくれた方が遥かに理想的ではあった.例えば,それらの性質をある程度満たす「Julia言語」とコミュニティには,もう少し頑張って欲しかったところである.

コンピュータビジョンやディープラーニングの視点で

次に,コンピュータビジョン・深層学習的な観点で見てみたい.2021年現在,研究者がDeep Learningを行うときの深層学習フレームワークのファーストチョイスはPyTorchである.1990年代やそれ以前,画像認識のアカデミックトップ研究者たちのコードは,かつてMatlabが一番人気であった.OpenCVが登場して以降,商用向けのマシンビジョンのコードはOpenCVを採用したC/C++のソフトウェアも増えていくことになるが,それでも欧米のトップ大学の研究者たちは,過去の研究の遺産がどれもMatlabで書かれたソフトウェアなので,引き続きMatlabで研究のコードを公開する状況が続いた.第一,OpenCVのPythonラッパーが普及する以前の時期なので,便利なプロトタイピング環境でコンピュータビジョンを行うにはMatlab一択であった.機械学習界隈でも,研究者界隈が個別にMatlab Toolboxを公開する文化があり,トップ研究者層がMatlabを積極的に使用する時代であった.(そもそも,この当時は一握りのトップ研究者しかソフトウェアやコードを無償公開しない時代である.今のように論文のほとんどがGithubに公開されたコードと紐づいている時代ではない).

ディープラーニングが流行した後のPyTorch登場まで

それが,ディープラーニングがブームになりはじめた初期の頃は(私も当時を思い出すが)TheanoやCaffeしかないころから始まり,そこにLua言語のTorchが登場すると,高速なLuaによるプロトタイピングが可能なことから,研究のコードをTorchに移行してGithubにも公開するトップ研究者群が増えていった.その頃に並行して,実環境(特にクラウド)でのデプロイ以降の安定性も重視するTensorflowがGoogleから登場したり,当時としては簡潔にコードを書ける初心者やエンジニアに寄り添った設計思想のKerasが登場したり,日本では日本語情報の豊富さやDefine-by-runの便利さからChainerが流行していた.これらはどれもPythonから使用できるライブラリであるが,これら以外にもDeepLearning4jなど他言語でも深層学習ライブラリは登場しており,現在ほどDeep Learningがエンジニア向けに実用段階向けには使われていなかった研究者がメインの使用者である時代でもあったので,決定版のライブラリは定まらず群雄割拠の状態であった.そんな中,使用Lua言語ベースなせいもあって伸び悩んでいたTorchが,PyTorchという形でPythonのライブラリとしてリニューアル登場する.

PyTorchはそれ以前のTorchやChainerなどの深層学習ライブラリの良いところどりの決定版プロトタイピングライブラリとして登場した.そして,米国のトップ層のAIリサーチャーもエンジニアもたくさん抱えるFacebookが保守していたこともあり,PyTorchは機能追加も早く保守性も高かった.またFacebook内のFAIRの画像物体認識のトップ研究者の研究コードがPytorchで提供されることにもなり,画像認識研究者たちのPyTorchの採用を加速させた.Torchで研究をしていた研究者も,それがPython化されて更に簡便になったPyTorchに移行したが,ややlow-levelすぎる書き方を強いられるTensorFlowと比べると,ちょうどよい按配のコード量で,しかも手慣れたPythonでサクサク書けるのもあり,PyTorch でDeep Learningの研究を行う(特にComputer Visionでは)が,デファクトの状態となっていった.ただし,デプロイにはGoogle系の環境やそこと相性の良いTensforFlowも便利である.よって,現在はPyTorchとTensforFlow,MXNet あたりが,トップ人気を3分している状態である(と著者は憶測している).

Python がオブジェクト指向言語であるのも利点

Pythonは,インタプリタでスクリプト言語のよう使える一方で,内実はしっかりしたオブジェクト指向言語であるという面も,機械学習向けにPythonがデファクト言語化する上で大きな要因となった.中〜大規模なシステムの開発を行う際には,JavaやC#などの,近代オブジェクト言語(もっと最近のものだとGoやScalaなど)による開発を行う方が,静的な型や冗長な記述は必要なものの,大規模メンバー間で(特にEnterpriseシステムを)開発する際に,保守や共同開発が行いすくなる利点がある.Pythonも,初心者がスクリプト言語的に(c-likeに)関数だけ並べてプロトタイピングするのに向いている「初学者でも簡単に触りやすい言語」である一方で,オブジェクト指向言語として厳格な言語としてソフトウェア開発できる.よって,多くの機械学習系のオープンソースコミュニティは,大規模なソフトウェアを構築する際に,Pythonを好んで(安心して)採用してきたわけである.

モジュールの結合で設計を行うDeep Neural Networkライブラリは,なおのことオブジェクト指向言語であるPythonと相性が良い.自分で独自の層を設計しない限りは,使いたい層(Linear やConv, ReLuなど)のオブジェクトをnew して,それらの入出力をつなげる様子を書くだけで,ネットワーク構造を記述できて,プログラミングがすぐおしまいになるからである.

Matlabの行列 -> Numpy Array -> Deep Learning ライブラリのTensor

また,PythonにはMatlabライクに行列計算・線形代数を行える「Numpy」の存在がある.Numpyでインタラクティブに行列・テンソルや線形代数を操作できることは,機械学習ライブラリやソフトウェアを楽しく作るには,大きな利点だったはずである.また,例えば PyTorchなどの深層学習ライブラリにおける「Tensorオブジェクト」も,(文法や仕様は微妙に異なるが) Numpyの配列と,似たように操作できるよう設計されている.

現在の若い世代で,Deep Learningブーム以降のことしか知らない方々は,Numpy のインスパイア元である,Matlabの開発動機の1つである「CやFortranで数値計算を行うのは学生は面倒だと思うので,BLASやLAPACKなどを便利にラッパーして,行列数値計算をスクリプト言語化したら,研究者・数値解析エンジニアをハッピーにできそうだ」という話は知らないかもしれない.しかし,この動機を持ったMatlabの行列や線形代数操作のインターフェースは,まずnumpyに継承され,更に昨今のTensorFlowやPyTorchなどのTensorオブジェクトにも順に継承されている.

従って,Matlab, numpyの流れをTensorインターフェース部分に継承した,Python系のDeep Learningフレームワークは,既に機械学習コミュニティがPython + numpy で慣れ親しんできた多次元配列インターフェースが似た形で引き続き使えるので,わざわざPython以外の言語の機械学習ライブラリに移行する人も少なくなる.もちろん,近年の開発寄りの現場だと「サーバーの開発言語の都合や,組み込みOSの都合などで,C++やJavaの深層学習ライブラリを使って開発するしかない!」という場面も多いと思う.しかし,そういった最終的なシステムへの組み込みをとりあえず気にしないで良い研究者・データサイエンティストや機械学習エキスパートなどは,ディープラーニング前もPythonで機械学習を行なっていたので,引き続きPyTorch やTensorflow をPythonで使用するわけである (ただ,TensforflowはPython以外もいろんな言語から使えるので,もちろん本番システムへのデプロイ時にはそれらのPython以外の言語も使われるであろうが).

最近は,Pytorch lightiningなどの簡便化ラッパーの登場もあり,PythonでのDeep learningが更に便利になってきていて,ずっとPythonだった研究者がわざわざ他言語に移行する理由がなかなか出てこないと思う.(※ ただし伝統的なトップ大学で,Matlab好きが継続している大学では,引き続きMatlabがメインで使用されているとは思うが ).

まとめ

以上のように,2000年代の米国のデータサイエンスブームから始まった機械学習・データ分析におけるPythonの人気は,そのあとの2010年代の深層学習ブームでも継続したと言える.そして,最終的にPyTorchの研究者向けのデファクト化がPythonの機械学習・深層学習・画像認識界隈での人気を決定的なものにしたと言える.

これだけ沢山のソフトウェアや研究のコードがPythonで書かれている現状を考えると,もはやPython以外の言語で,Pythonほど充実した機械学習や深層学習のライブラリ群が構築されることはなかなか考えづらく,今後もしばらくは Pythonがファーストチョイスであり続けるであろうと著者は推測している.とはいえ,深層学習ブームが予測不可能なところから突然やってきて大爆発したように,またもディープラーニングと同等の別の大きなパラダイムシフトがあった場合に,メインの言語がPython以外のものになる可能性はあるかもしれない.

References

Wikipedia : Comparison of deep-learning software