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

Question

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

著者が考える Answer (の例)

これまでもざんざん掘り変えされた話題であり,Web検索をしてもらえれば,RedditやQuora等の大手QAサイトでも沢山の人たちのより多視点かつ様々な回答が見られる質問であるものの,このサイトなりの立場で私なりの画像認識屋さんとしての回答もできるので述べておきたい .つまり,オープンソースコミュニティの歴史や,scipyやsciki-learnの成り立ちや,米国での大学教育でのPython採用の躍進など,「エンジニア目線での普及の話」は他の記事に任せておくことにする.その代わりに,この記事では研究者の端くれとしてコンピュータビジョン系の研究コミュニティの視点という観点にも焦点を当てて,Pythonが機械学習や画像認識の主要言語となった歴史的経緯を述べておきたい.(※ ちなみに管理人はアラフォーである)

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

機械学習の視点で見ると,現在,まず1台のPC内での作業を行うには「sciki-learn」の存在がある.深層学習までの基本的な機械学習モデル (SVMやk-NNなど) はsckikit-learnからすぐ使えるので,python では快適にプロトタイピングが可能である.また,ビックデータ解析用の分散サーバ構築目的では,Pythonで使えるApache 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 Notebook ) の登場も大きかった.データサイエンス側のニーズであったとも思うが,有料のMathmatica Notebookにインスパイアされた(そのフリーでの代替版を狙う) IPython Notebookと,コマンドラインベースのデータサイエンス向け計算環境であるPython ならびに IPythonは,非常に相性が良かった.かつて科学計算で人気だったMatlabやデータサイエンスで人気だったRにも,ノートブック機能はなかったので,Jupyter Notebookの登場はとても大きかったと思う.2010年台初頭のあたりでは,データ解析側だとRStudioとRというチョイスが,データベース系のテーブルや帳票データに対する統計解析ではまだ人気であったが,IPythonがNotebook化もされたおかげで,Pythonでの機械学習やデータ解析の格段に便利さが増したわけである.近年ではそれがGoogle Colabなどにも分岐して,Deep Learningクラウドの利用利便性も増し,Pythonと深層学習の相性が確固たるものとなっており,今更Python以外のインタプリタ言語で,Pythonと同等の機械学習ライブラリ群やインタラクティブツール群が整備されるとは思えない状況である.

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

深層学習が流行した後のPyTorch登場まで

それが,深層学習がブームになりはじめた初期の頃は(私も当時を思い出すが)TheanoやCaffeしかないころから始まり,Lua言語のTorchが登場すると,高速なプロトタイピングが可能なことから,研究のコードを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の開発動機である「CやFortranで数値計算を行うのは学生は面倒だと思うので,BLASやLAPACKなどを便利にラッパーして,行列計算をスクリプト言語化したら研究者をハッピーにできそう」という話は知らないかもしれない.しかし,この同期を持つMatlabの行列や線形代数操作のインターフェースはnumpyに引き継がれる.更に,昨今のTensorFlowやPyTorchのTensorオブジェクトにも,順に引き継がれている

従って,TensorオブジェクトにMatlab numpyの流れを引き継いだPython系のDeep Learningフレームワークは,既に機械学習コミュニティがnumpyを通じて慣れ親しんでいたインターフェースがTensor操作に使えるので,わざわざPython以外の言語に移行する人も少なくなる.もちろん,近年の開発寄りの現場だと「サーバーの開発言語の都合や,組み込みOSの都合などで,C++やJavaの深層学習ライブラリを使って開発するしかない!」という場面も多いだろうが,そういうことはとりあえず気にしないで良い研究者陣は,PytorchやTensorflowをPythonで使うのがメインとなっているのも至極当然であろう.昔ながらの行列・テンソル計算のインターフェースが採用されている深層学習ライブラリが,今も人気を得ているわけである.

まとめ

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

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

References

Wikipedia : Comparison of deep-learning software