最終更新日:
同氏が考える機械学習初学者向けの学習の指針とは、以下のような6項目にまとめることができます。
- オンライン講座はどれも内容は似たようなもの。内容より学ぶ興味を掻き立ててくれる教師を探せ。
- ツールではなくプログラミング言語に精通せよ。
- 学習過程で開発したモデルは、開発環境で終わらせずに本番環境に実装せよ。
- 機械学習初学者に必要な数学の知識は、直面している問題を解決するのに必要なだけのもの。
- オンライン講座の修了証を集めるのではなく、スキルを磨け。
- 開発したモデルは共有せよ。
なお、AINOWではこの記事のほかにもBourke氏が執筆した記事の一部を翻訳しており、それらには以下のようなものがあります。
機械学習の独学について考えてみる?覚えておくべき6つのこと
わたしの機械学習エンジニアキャリア1年目で学んだ12のこと【前編】および【後編】
私はいかにしてTensorFlowデベロッパー認定資格に合格したか
Bourke氏が執筆している記事は、機械学習エンジニア志望者の役に立つと同時に学ぶ勇気を与えてくれるものと言えます。同氏こそが「学ぶ興味を掻き立ててくれる教師」かも知れません。
前編にあたる以下の記事本文では、学習の指針における項目1~3までを掲載します。
なお、以下の記事本文はDaniel Bourke氏に直接コンタクトをとり、翻訳許可を頂いたうえで翻訳したものです。また、翻訳記事の内容は同氏の見解であり、特定の国や地域ならび組織や団体を代表するものではなく、翻訳者およびAINOW編集部の主義主張を表明したものでもありません。
エンジニアを機械学習エンジニアに再配置する
私は地下室にいる。すべてが始まった場所に戻ったのだ。最初にMikeと出会った隠れ家のようなカフェに座っている。その昔、私は9ヶ月間にわたり自分の寝室で勉強し、そのあと洞窟の外に出たのだった。私の心の半分は、朝食に19ドル払わなければならないことを心配していた(クリスマスでない限り、週末にUberを運転するのはあまり儲からない(※訳註1))。もう半分は、オンラインでやっていた勉強に何か意味があるのかどうかと思い悩んでいた。
2017年、私はAppleストアの店員を辞め、Webスタートアップを作ろうとして失敗し、機械学習を発見し、恋に落ち、コーディング経験ゼロから始められるディープラーニングコースに申し込んで、サポートチームに返金ポリシーがどうなっているのかをメールで問い合わせ、返金を受けず、その後の3ヶ月間、課題を4~6日遅れで手渡し、何とか合格し、そのまま続けることを決め、自分のAI習得カリキュラムを作った。
9ヶ月間、自分のAI習得カリキュラムに没頭し、その後Mikeに会ってコーヒーを飲み、私もコーヒーを飲みながら自分の壮大な計画を話した。世界をもっと動かし、より良い食事をするのを助けるためにAIを使うという計画を話すと、彼はCamに会うべきだと言った。私はCamに会ったことがあり、彼に会いにアメリカに行くと伝えると、Mikeは彼なら今度の木曜日にオーストラリアに来るから、ここに居てはどうかと言った。私はそれでOKと返事した後、週に1回開催される木曜日のインターンシップに行き、それからさらに2週間後、Max Kelsenから機械学習エンジニア見習いの職種のオファーを受けたのだった。
機械学習エンジニアの仕事に就いて14ヶ月目にして、私はKelsenのところから離れ、自分のやり方で機械学習に取り組むことにした。私は学んだことについて記事を書き、Andreiがその記事を見つけ、初心者向けの機械学習講座を作りたいかどうかをメールで尋ねてきたので、私はイエスと答えた。そして、私たちはその講座を作り、6ヶ月間で150ヶ国以上の27,177人の受講生に講義するという栄誉に与った。
私の機械学習エンジニアとしてのキャリアは、合わせると約3年。このキャリアは、私の本来の学部の修了に必要とされていた期間(何度か失敗したため、3年制の学位を取るのに5年かかった)くらいである。
そんなわけで、私はちょうど機械学習学部を修了したような気分になっている。
機械学習の門外漢から見れば、私が機械学習について少なからず知っていて、実際それを実行できる、と思うかも知れない。私も機械学習を始めた頃よりは多くのことを知っているが、同時に知らないことがいかに多いかも知っている。こうした知識の増加に伴う無知の自覚は、知識そのものの問題なのだ。
- 機械学習を初めて1年目:ハネムーン期は、初心者の収穫期としても知られている。この時期では初心者よりもはるかに優れていて、おそらく多少の自信を持っている(自信を持つのは悪いことではない)。
- 2年目:自分が思っていたよりも上手くないかも知れないことに気づく段階。初心者のスキルは成熟し始めているが、今はさらに熟達するには努力が必要だと気づいている。
- 3年目:まだまだ学ぶことが多い段階。もう初心者ではないが、今では自分の知らないことの多さに気づくほどの知識を持っている(私はここにいる)。
一般に何かの学習を始めると、はじめは目ざましい学習結果が得られる(outstanding initial result)が、この結果は、かつては無知だった初心者だからこそ得られる成果である(noob gains)。学習を進めると、その効果はいつしか横ばいになる(levelling out)。横ばい状態が続くと学習効果が実感できず、「果たして何かが身についたのだろうか」という疑問を抱くようになる(do I even know anything ?)。横ばい状態の時にあきらめずに学習を続けると、突如大きな進歩が体験される(unexpected progress)。このように学習とその効果は右肩上がりの直線ではなく、途中に下降を含む曲線的なものなのだ。
まあ、私のことはもういい。それは私の話だ。読者諸氏も似たようなものかも知れないし、今日から機械学習を始めるのかも知れない。
これから始めようとしているのであれば、この記事はあなたのためのものだ。ベテランならば、私の考えに対してアドバイスや批評を提供できるだろう。
それでは本題に入ろう。
機械学習講座のリストを見たいのならば、この記事にはそれはない
私は機械学習のオンライン講座をたくさん受講した。私自身が講座を作ったことさえある。
その結果、何がわかったか。
オンライン講座は全部、同じことのリミックスに過ぎない。
どのコースがいいか悩むよりも、自分をワクワクさせてくれる先生を見つけよう。
何を学ぶにしても、必要なのは10%の教材と90%の学ぶことのワクワク感だ。
学校の先生は何人覚えているだろうか。
私の推測では、教師が何を教えたかに関係なく、教材よりも教師自体を覚えているはずだ。そして、教材のことを覚えている場合、それは教師が記憶に焼き付けられるのに十分な火をスパークさせたからなのだ。
それではどうすればいいのか。
いくつかの教材を試してみよう。最高の教材を見つけるにはそうするだけで十分だ。どの教材が興味を掻き立て、没頭して取り組み続けるに足るものかを探していこう。
教師が学ぶことを興味深いものにしてくれるのならば、技術を身につけるのは不愉快なことではなくなる。
エンジニア(と技術オタク)の呪い
最新にして最高なユースケースを実行していると言うエンジニアに会わせてほしい。私はそんなエンジニアがアマチュアであることを示すだろう。
告白するが、かつては私も罪を犯していた。新しいピカピカのフレームワークが出てくるたびに、あるいは最新のモデルが出てくるたびに、私はそれを追いかけていた。
市場にリリースされた新しいツールがどんなものであれ、それを使うために私は問題を考案しようとしている自分に気づくこともしばしばあった。まさに馬の前に荷馬車をつける古典的な間違いを犯していたのだ。
シェフの仕事とは火と包丁という2つの道具をいかにコントロールして使うか、というものである。
シェフの仕事は、私がこれまでに受けた最高のプログラミングのアドバイスが具現化されている:つまり、フレームワークではなく、言語を学ぶべきである。
習い始めたばかりで、習っているツールの数を片手で数えられないならば、あまりに多くのツールを使いこなそうとしているのだ。
「モノを作りたい」
Webアプリケーションやモバイルアプリケーションなどのモノを作りたいのであれば、機械学習の前に(少なくとも並行して)ソフトウェアエンジニアリングを学ぼう。
Jupyter Notebookのなかで生まれては死んでいくモデルが多過ぎる。
それはなぜか。
なぜならば、機械学習とはインフラストラクチャの問題だからである(インフラストラクチャとは、他の人がそれを使用できるようにするあなたが開発したモデルの周辺で動作するすべてのものを意味しており、最新の専門用語で言うことをお望みならばMLOps(※訳註3)のことだ)。
そして、開発したモデルを他人の手に渡す実装は、実に難しいものなのだ。
しかし、だからこそ、実装にもっと時間をかけて取り組むべきなのだ。
もし私が今日からまた機械学習を始めるとしたら、私が構築したすべての半端なモデルを実装する方法を見つけようとするだろう(共有する価値のあるものにつながる何十もの実験のために作った例外を除いて)。
それでは、どうやって実装するのか。
シンプルなものを作るのを恐れないこと。GitHub のレポジトリにあるノートブックよりも、誰かと相互作用できる基本的なフロントエンドの方がはるかに面白いものなのだ。
そうは言っても、一体どうやって?
モデルを訓練し、Streamlitを使ってフロントエンドアプリケーションを構築し、アプリケーションをローカル(つまりコンピュータ上)で動作させ、アプリケーションが動作したらDockerでラップし、DockerコンテナをHerokuや他のクラウドプロバイダにデプロイするのだ。
確かに、以上の作業はあまりに多くのツールを使用しないというルールに反しているが、こうした作業を数回行うことで、機械学習モデルを人々の手に渡すことがどのようなものかを考えさせられるようになる。
モデルを実装することで、機械学習モデルがJupyter Notebookの中で棲息している時には尋ねられることがなかった疑問が生まれてくる。そんな疑問とは、以下のようなものだ。
- 推論(モデルが予測を行うまでの時間)にはどのくらいの時間がかかるのか。
- 人々は実装したモデルとどのように相互作用するのか(おそらく彼らがあなたの開発した画像分類器に送るデータは、あなたが使ったテストセットとは異なるはずだ。そして、現実世界のデータは頻繁に変化する)。
- 実装したモデルを実際に使う人はいるのだろうか。
(後編に続く…)
原文
『How I’d start learning machine learning again (3-years in)』
著者
Daniel Bourke
翻訳
吉本幸記(フリーライター、JDLA Deep Learning for GENERAL 2019 #1取得)
編集
おざけん