HOME/ AINOW編集部 /データサイエンスに最適な言語とは何か
2022.06.27

データサイエンスに最適な言語とは何か

著者のLeah Simpson氏とRay McLendon氏はアメリカでデータサイエンティストとして働きながら、データサイエンスに関するeラーニングサービスData Science Rebalancedを運営しています(両氏が運営する各種SNSリンクはこのlinkteeを参照)。両氏がMediumに投稿した記事『データサイエンスに最適な言語とは何か』では、データサイエンスプロジェクトに最適なプログラミング言語が考察されています。
「データサイエンスに最適なプログラミング言語はPythonか、それともRか」というような論争は、今まで何度も繰り返されてきました。こうした論争では処理時間のような各言語の仕様や性能を比較するものです。しかし、注目すべきはデータサイエンティストがプロトタイプモデルを開発して顧客にモデルの価値を提供できるまでに要する時間である、と両氏は強調します。というのも、データサイエンティストが費やす時間がもっとも高価だからです。
続いて両氏は、プロトタイプ開発に要する時間を左右する要因を考察します。そうした要因には、以下のような2項目があります。

プロトタイプ開発所要時間を左右する2要因
  • モデルアーキテクチャ構築に要する時間:言語に実装されたライブラリが所要時間を左右する。
  • モデル学習に要する時間:転移学習や事前学習モデルを活用すれば、学習時間を短縮できる。

なお事前学習モデルの利用に当たっては、倫理的懸念が生じます。事前学習モデルにバイアスが混入していた場合、プロトタイプモデルにもバイアスが継承される可能性があるからです。それゆえ、事前学習モデルを流用する場合にはバイアスが継承されるリスクを考慮する必要があります。
以上をまとめると、データサイエンスプロジェクトに使うプログラミング言語を選定する際には、プロトタイプモデル構築までに要する時間の最小化という観点から、言語のライブラリや学習データがプロトタイピングにどのくらい貢献するかを考慮すべき、となります。

なお、以下の記事本文はLeah Simpson氏とRay McLendon氏に直接コンタクトをとり、翻訳許可を頂いたうえで翻訳したものです。また、翻訳記事の内容は同氏の見解であり、特定の国や地域ならびに組織や団体を代表するものではなく、翻訳者およびAINOW編集部の主義主張を表明したものでもありません。
以下の翻訳記事を作成するにあたっては、日本語の文章として読み易くするために、意訳やコンテクストを明確にするための補足を行っています。

画像出典:UnsplashArtturi Jalliより

この問いに対する答えは、思っているよりも微妙なもの

最近のグループディスカッションで、データサイエンティストたちが機械学習のフレームワークとして、PyTorchとTensorFlowのどちらが優れているかを議論しているのを見かけた。私が面白いと思ったのは、この議論の別バージョンをこれまで何度も聞いてきたからだ。PythonかRか、MATLABかMathematicaか、WindowsかLinuxか。私は長年にわたって色々とプログラミング言語を学んできたが、問題はどの言語やフレームワークがベストかではなく、目の前のタスクに最適なものはどれかであるべきだと気づいた。

それでは機械学習のプロトタイプを作るのに、どのような言語を使うのが最適なのだろうか。5人のデータサイエンティストにこの質問をしたら、5つの異なる答えが返ってくるかも知れない。この質問に答えるにあたり、機械学習のプロトタイプをできるだけ早く作成できるようにするために、自分が最も快適に使える言語は何か、またその言語で利用できるライブラリやモデルは何かを考える必要がある。

表記法としてのプログラミング言語と技術の比較

私たちはしばしば、プログラミング言語を技術の一形態と見なす。プログラミング言語はすべて、マシン・コードを開発するという同じ高度なタスクを達成するため、技術の一形態として同等と見なせる。しかし、同じ仕事をするにしても、ある言語ではその仕事が速くできるかも知れないし、別の言語ではできないもっと複雑な仕事ができるかも知れない。技術の一形態として見た場合、言語は論理的に同等である。だが表記法として見た場合、ある言語は、そのタスクに対して他の言語よりも優れているかも知れない。

(表記法にもとづいた比較を考えるにあたり)数学で例えるなら、関数のひとつである(微分の)導関数を計算する概念を引き合いに出せる。この作業を行うために、数学者はある形式の表記法を用いる必要がある(図1)。

(図1)図1:導関数の計算に使われる2つの表記法。左の表記はライプニッツが、右の表記はアイザック・ニュートン卿が開発した。技術として考えた場合、これらは論理的に等しい。画像は筆者が作成。

図1の右側は、アイザック・ニュートン卿が開発したドット表記法である。ほぼ同時期に左側に表されたゴットフリード・ヴィルヘルム・ライプニッツの表記法が開発された。これらの表記法を技術として考えると、どちらも導関数を計算できるため、論理的には同じである。

しかし、表記法として考えた場合、両者は必ずしもイコールではない。ある課題に対しては、ある表記法の方が優れている場合がある。例えば、ライプニッツの記法は、変数分離や部分積分などによる微分方程式の解法を、ニュートンの記法よりもはるかに直感的に理解できる。そのため、ライプニッツ記法はニュートン記法よりも微分方程式の解法に強いと考えられるだろう(図2)。

図2:表記法としての導関数は等価ではない。ライプニッツの表記法は優れた表記法であり、変数分離や部分積分などのアプローチによる微分方程式の解法に関してはるかに直感的である。そのため、より強力な表記法である。画像は筆者が作成。

もし、以上の2つの異なる形式の数学表記法に関して、その有用性に関連したさまざまなレベルの力があるとすれば、プログラミング言語にも関連した力のレベルもあるのだろうか。もちろんある!

最初のプロトタイプ作成時間を最適化

どのプログラミング言語が最も優れているかという議論では、常にその言語の計算性能が話題にのぼる。例えば、PythonはC言語の45,000倍遅いというPeter Xieが書いたこんな記事がある(※訳註1)。C言語がPythonより速いということは、C言語が優れているということだろうか。そうとは限らない。(私が提供するオンライン講座で)Pythonのコードを高速化するためのトリックをいくつか紹介してきたが(※訳註2)、私が思うに人々は本当に重要なポイントを見逃している。開発者やデータサイエンティストの時間は、マシンの処理時間よりもはるかに高価なのだ。

人はしばしば、1回目や2回目の反復でコードを完全に最適化しようとすることにとらわれがちだ。私が正しいと思うのはマシンの処理時間を最適化するのではなく、概念実証のためのコードを書いたうえで、最初に顧客に価値を提供するまでにかかる時間を最適化すべき、ということだ。

画像出典:UnsplashLukas Blazekより

PythonはC言語よりも計算速度が遅いかも知れないが、C言語と比較してPythonで機械学習モデルを作成するのに必要なコード行数は少なく、最終的にはコーディングに要する時間も短くなる。静的型付けよりも動的型付けのような小さなことが、プロトタイプを作成する際の速度に大きな差を生む。しかし、データサイエンティストが使用する標準的な言語の多くはPythonと同様の機能と抽象化を備えているため、Pythonが仕事に適した言語であるとは必ずしも言えない。(プログラミング言語の選定においては)実際には、コア言語よりもライブラリの方が重要なようだ。

私のように、自然言語処理(NLP)に数多く携わってきた読者がいることだろう。私の経験では、PythonはNLPのための最も強力なライブラリを持っている。scikit-learn、NLTK、spaCy、gensim、textacy、その他多くのライブラリによって、データサイエンティストはテキストデータのクリーニング、前処理、特徴抽出、モデル化を素早く行える。しかし、データのプロファイリングや時系列分析を行おうとすると、Rで利用できるパッケージの方がより強力であることがわかる。とは言うものも、リカレントニューラルネットワークのようなより洗練された時系列技法を使う必要がある場合には、Pythonのライブラリがディープラーニングに関して優れているため、Pythonに戻ってくることがよくある。

ディープラーニングのような複雑な機械学習アーキテクチャを使い始めると、通常、モデルの訓練にかかる時間は急速に増加する。しかし、計算能力が向上し続けているので、学習時間はそれほど問題にならなくなってきている。実際、私たちがより複雑な機械学習モデルを作っているのは、大きな計算能力が利用可能になり、組織がそのすべてを利用しようと競い合っていることが主な理由だと言えるだろう。

最終的にプロジェクトで使用する言語やライブラリを選ぶ際には、最初のプロトタイプを作る時間を最適化するものを選ぶことをおすすめする。ある言語でコードを書くことを学ぶと、その言語で実際に考えるようになる。私自身、このことを実感している。私は現在、主にPythonでコーディングしているが、問題を解決する方法を決める時はPythonで解決する方法を考えている。新しい言語を学んできた自分のキャリアを振り返ってみると、その時使っていた言語によって問題解決の方法が全く違っていたことに気づくのだ。

画像出典:UnsplashMarkus Winklerより

(※訳註1)PythonとAIの熱狂的支持者を自称するPeter Xie氏は2020年7月、Mediumに『PythonはCと比較してどのくらい遅いのか』と題した記事を投稿した。
この記事ではPythonとCの処理時間を計測するにあたって、初期値を0に設定したうえで1を加算するループコードを作成して、1秒間でどのくらいループを実行できるか、という方法を採用した。計測した結果、Pythonは1秒間に1,000万回ループしたのに対して、Cは4億5,000万回ループした。この結果から、PythonはCより45倍遅い、と結論づけた。
(※訳註2)この記事の著者の1人であるLeah Simpson氏は、クリエイティブ、ホビー、そしてテクノロジーに関するスキルを教えるオンライン講座Skillshareでデータサイエンス講座を担当している。

プロトタイピングのスピードに影響を与える要因

プロトタイピングのスピードに影響を与える主な要因の1つは、モデルアーキテクチャの構築にかかる時間である。モデルアーキテクチャを構築するのに、私はscikit-learnのようなライブラリに傾倒してきた。(scikit-learnを使うと)モデルアーキテクチャを構築するために多くの作業が不要となるため、初期モデルを迅速に構築できるからだ。私は通常、最も単純なモデルから始めて、モデルの複雑さを高めていく。より複雑なディープラーニングモデルを作り始めるのは、シンプルなモデルをやりつくした後である。現時点では、KerasやTensorFlowなどのツールを使って、モデルアーキテクチャをできるだけ素早く構築できるような抽象化機能を探しているところである。

プロトタイピングのスピードに影響を与えるもう1つの要因は、初期モデルの訓練に必要なデータ量だ。多くの場合、あまりデータを必要としないシンプルなモデル開発から始められる。しかし、シンプルなモデルでは精度の要求を満たせないことがある。そのため、より複雑なモデルを使用しなければならないのだが、その場合、たいていより多くのデータが必要になる。この場合、より多くのデータの取得や作成に1ヶ月を要することもあり、こうした事情によりプロタイプを開発するスピードが最終的に遅くなってしまう。

より多くのデータを取得/作成するプロセスを加速するために、転移学習の技法や事前学習したモデルを使おうとするかも知れない。これらの技法やモデルを使えば、より迅速にプロトタイプを作成できるだろうが、プロトタイプに深刻な倫理的問題を持ち込む可能性がある。

迅速なプロトタイピングにおける倫理的懸念

データサイエンティストとして、私たちのモデルが保護された集団に対して偏った結果をもたらさないようにする責任がある。Amazonはこの教訓を苦労して学んだ(※訳註3)。もし事前学習したモデルを使用している場合、そのモデルが学習したデータセットにアクセスできないかも知れない。たとえ学習データを持っていたとしても、そのデータがどのようにクリーニングされ、前処理され、学習とテストのためにサンプリングされたかを知らない可能性もある。これらのステップの1つ1つにおいて、データセットに内在するバイアスを取り除くのに失敗している可能性がある。さらに悪いことには、(事前学習の段階で)データセットにバイアスを導入したり、増幅したりする可能性さえある。私自身についてしか言えないが,事前学習モデルから転移学習の過程でバイアスを除去できる自信はない。そのため、私はこの手法の使用にはかなり慎重だ。しかし、ビジネス上のユースケースに関連するリスクが限定的であると確信するときは、どのライブラリを使うかをついてHugging Face(※訳註4)のようなウェブサイトに頼っている。

事前学習モデルを使う場合、使われる機械学習モデルのパワーが、実質的にライブラリのパワーや私が使うものを規定するプログラミング言語の代わりになっている。以上のようにして私は日常的にPyTorchで最先端のデータサイエンス作業を行っているが、こうした作業には転移学習を使ったり、他の組織が作ったモデルを転移学習なしで直接使ったりすることが含まれている。

(※訳註3)ロイター通信が2018年10月に報じたところによると、Amazonの機械学習研究チームは2014年に同社求職者を星1つから星5つまでに自動的にランク付けする機械学習モデルを構築した。しかし、2015年、同モデルが女性を不当に評価していないことが発覚した。
以上のようなバイアスが生じた原因として、過去10年以上にわたる履歴書と採用のあいだにあるパターンを学習した結果、男性が多く採用されていることを機械学習モデルが学習したから、と考えられる。こうしたバイアスを学習した結果、履歴書に「女子チェス部キャプテン」のような記述があると評価が下がるようになった。
なお、過去に男性を多く採用したことから、技術職において男性のほうが優れていると判断できない。というのも、採用されなかった女性のなかに優れた技術者になった人材がいたかも知れないからである。
(※訳註4)Hugging Faceとは、機械学習の民主化を標榜して各種モデルやデータセットを公開・提供しているスタートアップである。

結論

結局のところ、定期的に起こる言語、ライブラリ、モデルをめぐる争いは見当違いなものだ。データサイエンスに最適なプログラミング言語は1つではない。最適なプログラミング言語とは、最も速くプロトタイプを作成し、顧客やエンドユーザーに価値を提供できる言語である。

プロトタイピング中は、すぐにコードを最適化することにとらわれないようにしよう。その代わりに、データサイエンティストの(プロトタイピングを進める)スピードを最適化するようにしよう。あなたのモデルが目の前の問題を解決することをうまく証明できたら、プロファイラを使って、コードのどこにボトルネックがあるかを特定できる。こうしてマシンの処理時間を最適化できるが、プロトタイプのコードを書き終えるまではプロファイラは使えない。馬の前に馬車をつなげないようにしよう!解決しようとしている問題の種類を特定し、最速で構築するのに役立つ最適なツールセットを選択するようにしよう。

参考URL

  1. https://peter-jp-xie.medium.com/how-slow-is-python-compared-to-c-3795071ce82a#:~:text=It%20is%20450%20million%20loops,mode%20for%20a%20better%20performance.&text=Yes%2C%20it%20is%20unbelievable!,45%2C000%20times%20faster%20than%20Python
  2. https://skl.sh/3dq3Iz0
  3. https://www.reuters.com/article/us-amazon-com-jobs-automation-insight/amazon-scraps-secret-ai-recruiting-tool-that-showed-bias-against-women-idUSKCN1MK08G

原文
『What’s the Best Language for Data Science?』

著者
Leah SimpsonとRay McLendon

翻訳
吉本幸記(フリーライター、JDLA Deep Learning for GENERAL 2019 #1取得)

編集
おざけん

無料メールマガジン登録

週1回、注目のAIニュースやイベント情報を
編集部がピックアップしてお届けしています。

こちらの規約にご同意のうえチェックしてください。

規約に同意する

あなたにおすすめの記事

生成AIで“ウラから”イノベーションを|学生起業家が描く、AIを活用した未来

特許技術×AIでFAQを次のステージへ|Helpfeel

GPUの革新からAI時代の主役へ|NVIDIA

あなたにおすすめの記事

生成AIで“ウラから”イノベーションを|学生起業家が描く、AIを活用した未来

特許技術×AIでFAQを次のステージへ|Helpfeel

GPUの革新からAI時代の主役へ|NVIDIA