HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

初学者が機械学習の勉強を進めるためには必ず手を動かす

 

 

follow us in feedly

https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png

機械学習に必要な知識

ネット上の様々な意見

機械学習の勉強をしていく上で大事なものは何でしょうか。 調べればプログラミングだとか統計だとか、解析学・線形代数学であるなど、いろいろな意見が見られます。

おそらくネット上で見つかるいろいろな意見、「機械学習では○○を勉強すべき」という話は、少なくともその話を言っている人の中では真であるのだろうと思われます。 要するに、その勉強をしたことによって(あるいはその知識を持っていたことによって)、その人は何らかの機械学習に対する知見が得られたと言っているのです。

 

しかし、それらネット上の意見全てを実直に受け入れ、実際に自分の費やせる時間で勉強を進めていこうとすると間違いなく限界が来ます。 まず、プログラミングにしても数学的知識にしても、その分野を勉強すべきだとおっしゃる方が、その分野を機械学習を学ぶ前準備として勉強したものであるとは限りません。 それ以前から知っていた知識(獲得のために新たな時間を費やす必要のなかった知識)が、思い返せば機械学習の理解に効力を発揮したという場合も多々あると思われます。

 

特に、数学や物理などの理学部に所属していた人たちにはそういう人が多いのではないでしょうか。 元々の専門で学んできた高度な数学的知識が、機械学習の奥底にある理論を理解するのに役立った、 機械学習を理解する下地になった、という結果論であることも多いはずです。

 

いくらその数学が役に立ったというのが本当だったとしても、 数学的なバックグラウンドを持っていない人間に、まず数学からやりましょうというのは私はとても酷な話だと思います。

 

機械学習への携わり方と必要な数学

機械学習をやろうと思った時、そのレベル感は人によって様々です。 既存の機械学習手法をビジネスに合致するように当てはめていきたいということなのか、機械学習手法自体を用途に合わせて考案していきたいのか、 機械学習の手法を総括できるような理論を理解したいのか、あるいはその理論を構築したいのか。

 

それぞれのレベルに応じて、どれくらいの数学的能力が必要になるのかは、私にも(恐らく誰にも)分かりません。 自分で見つけるしか無いのです。

 

ただ、正直、機械学習全体の理論に踏み込んでいくのは、機械学習を始めようと言う段階で数学的なバックグラウンドを持っていない人には極めて厳しいと思います。 (理学部はもちろん)工学部で数理工学だとか計数工学だとか、数学を応用することをメインとしていたような方でないと厳しいのではないでしょうか。 もちろん大学4年間で学ぶような数学を自力でできるなら話は別ですが(そんな人は、機械学習の数学がうんぬんで困るような人ではないだろう)。

 

私自身が感じている、最低限必要な数学は、

行列の計算ができること 偏微分が計算できること

だと思います。これで十分だとは言っていません。しかし、もしも数学に関してまっサラな状態からスタートするならば、 ひとまずココを抑えてしまってから機械学習に進むのが吉だと思います。

 

具体的に勉強を進める

簡単な問題で動作を確認

勉強を進めていく際の方針としては、まず行列や偏微分の計算を抑えて、簡単な手計算をするのが良いと思います。 手計算だとせいぜい2次元を扱うのが精一杯と思われますが、それで構いません。

 

ニューラルネットワークでもSVMでもPCAでも、とりあえず手計算で実際に動作を追ってみると良いでしょう。

s0sem0y.hatenablog.com

 

しかし、新しい機械学習を学ぶ度に手計算でやるのは大変かもしれません。 ある程度、機械学習の手法を手計算していると、他の手法は頭の中で思い浮かべることができるようになるはずです。 そうなれば、必ずしも手計算を一々やる必要はありません。 しかし、せめて1つくらいは何も参照すること無く、学習を手で計算して誰かに説明できるくらいにはなったほうが良いでしょう。

 

プログラムを書く

そして、プログラムを書きます。 実際にはこちらがメインでも良いでしょう。最初からプログラムで良くない?と思う人もいるかもしれません。 もしも、機械学習の手法を教科書などで確認するだけで、すぐプログラムに落とせるのであればそれでも良いはずです。 でもまっサラな状態から、そんなことができる人は中々いません。

 

そもそもプログラムとは人間が一々手作業でやっているようなことを自動化するための手段です。  

あなたが一生懸命面倒くさいと思いながら手作業で解いた機械学習の手法を、コンピュータにやらせるためにプログラムを書くのです。 手計算ができるのであれば、プログラムを書くことも難しくありません(その言語の使い方には慣れる必要がありますが)。

 

もしもプログラミング言語に既に長けており、手計算をするのと同じくらい自由自在にやりたいことを記述できるのならば、 手計算で機械学習手法を確認することと、プログラムを書いてみることは、紙に書くかエディタに書くかの違いしかありません。 そうなればプログラムを書くという事に専念するようになっていいでしょう。

 

そして恐らく、機械学習の勉強を進める上で最も重要なのは、実際に手を動かしてプログラムを書いてみるということであるとも思っています。

これが最も重要である!という話は、数学だとかの理論を疎かにして良いという意味ではありません。 間違いなく数学に長けている方が、機械学習を学ぶ上では有利であることは間違いないです。

 

それでも絶対に欠かしてはならないのは手を実際に動かすこと(プログラミング)であると強く主張します。 具体的な動作を順に追う(順に書く)ことをしなければ、プログラムは動作しません。 これができないとプログラムが動作しないということは、デバッグの作業それ自体が、自分の機械学習の理解の確認になるのです。

 

もしここで、なんで上手くいかないのか、上手く行くのはなぜなのか、具体的にわからない点がハッキリと浮き彫りになってきたら、 (それがバグではないとしたら)分からない原因は数学的な理解の欠如である可能性があります。 そのときになって初めて、必要な数学を補強していくという順序で私は構わないと思っています。

 

このような勉強の仕方をできそうな書籍を重点的に以下の記事で取り上げました(Deep Learning本を除く)。

s0sem0y.hatenablog.com

 

Kaggleはやるべき?

データ解析コンペとして有名なKaggleですが、少なくとも「勉強を始めました」の段階でやるようなものではないと私は思っています。

 

コンペはハイレベルです。確かにMNISTなどのような馴染みのある入門者用のテーマもあります。しかし、そのようなテーマをKaggleでやる意義ってほとんどありません。 スコアをついでに提出するかどうかくらいの違いしか無く、Kaggleをやったからって機械学習の勉強が捗るとは私には思えません。

 

Kaggleはもっと次のステージに進んでからの話だと思います。 機械学習手法を幾つか使える中で、データの選定であったり前処理であったり、泥臭さも含む機械学習手法の試行錯誤を総合的に試す場です。

 

機械学習それ自体の勉強をするためには少々レベルが高いように思います(そして焦点もずれている)。 きっとKernelを読んだところで、そもそもそこで使われている手法などを予め知っておかなければ「ほーん?」ってなるだけです。

 

Kaggleはある程度機械学習の勉強が進んでから、他の人の試行錯誤を追体験するためにKernelを読み、 そして自分なりのデータ解析がどれくらいスコアを出せるのかを力試しするために参加してみてください(気になるのなら、1個くらいやってみても良いかもね)。

 

勉強を進める上で使えるツールたち

Python

現状の機械学習の環境は、Pythonが最も充実しています。 可視化のためのライブラリや数値計算のためのライブラリ、データ処理に特化したライブラリなど機械学習を試すには抜群の環境です。

 

Pythonの導入方法はOSによって異なるので、それぞれ調べてみてください。

 

Jupyter Notebook

Jupyter Notebookは非常に便利です。 これもネット上でかなり情報が出回っているので、すぐに見つかるはずです。

scikit-learn

Pythonの機械学習ライブラリ。 すごく簡単に機械学習を実行できます。 ただしこれは何も理解していなくても、とりあえず動かせてしまうので手法それ自体の勉強という用途には使えないかもしれません。

 

しかし、ある程度勉強を終えた後ならば、実際にデータに対してそれぞれの手法がどのような結果をもたらすのかを比較してみて、 Kaggleで実際に使っていっても良いでしょう。

 

ただ、何も分からずこれを叩いていても、何の勉強も進まないということだけは意識しておきましょう…

TensorFlow

数値計算、特に深層学習が得意なライブラリです。 Googleが開発元であり、これを使いこなせれば大体のことはできると思います(がTensorFlow自体が難しい)。

 

自動微分が入ったGPU利用が簡単な低レベルの数値計算ライブラリのように使うこともできますし、 深層学習の高レベルAPIとしても使うことができます。