最近、機械学習をやる上で必要な数学とは、どの分野のどのレベルの話なのか(数学が大の苦手な人間バージョン)の記事を読みました。
私も数学(数式)が大の苦手であり、且つ仕事でデータを扱う部署に異動になった際に先輩に色々教われるという環境でもなかったため、自分で試行錯誤して数式に対する抵抗感を減らしてきました。
(少なくとも、異動になったころなどに体験した、「数式が色々出てきて、もうこの本読み進められる気がしない・・無理・・」ということは大分減ってきました)
その試行錯誤過程において、時間もお金も結構無駄になった面もあり、異動になったころに知っていればなあ・・という点を徒然と書いていきます。(主観的な内容となります。また、あくまで私自身のケースで、実際には多くの方にとっては役立たない内容かもしれません)
ちなみに、仕事だったりプライベートで機械学習などを扱う上で、何とかなる、といったレベルです。最先端を行く、数学ばりばりの専門家ではないので、そういった点はご了承ください。
(英語で、ネイティブではないけど、ある程度は英文が読めるので、githubやstackoverflow、洋書の技術書が読めるので便利といったようなものに近く、本など読む際に数式に抵抗が少ないと便利、といった感覚)
また、「非理系出身のエンジニア」という視点から書いています。理系出身の方や数学の専門家の方達からすると、不快な内容もあるかもしれませんが、その辺りもご了承ください。
TL;DR
- 数式は「プログラム言語の一つ」と考えることにした。
- 新しい言語を学ぶ際には、ただ眺めていても身につかない。プログラムの勉強をする時と同様に、分からないと嘆く暇があればどんどん写経してしまおう。
- 数学単独の本ではなく、理論と数学、スクリプトと英語の専門用語がセットになっている本がおすすめ。
- どうしても分からない点は、諦めずに他の本などを色々勉強していると、理解が深まったり知識が繋がってきて、後で理解できることも多い。分からなくても落ち込まずに、続けることが大事。
書いてる人の経歴
「理系出身ではないけれども、実は学校でしっかり数学勉強してきている」とかだとタイトル詐欺で怒られそうなので、少し経歴的なところを書いておきます。
- 高校は数Ⅲ・Cまでは受けず(途中から美術などの科目を選択)
- 4年間デザインの専門学校へ(数学とは無縁)
- 2年弱程度デザイナー
- 5年間程度ゲームのフロントエンジニア
- 2年間ほど前に、データを扱ったり、データが関連するツール開発・運用する部署へ異動(フルスタック気味なお仕事担当)。
異動したタイミングでは、「Python書いたことない」「線形代数・・何それ?」「機械学習や数学など教えてくれる先輩はいない」「高校数学から10年以上経過していて、記憶がほとんどない」といった状態からのスタートです。Googleの方が記事にしていらっしゃるとおり、例に漏れずハードモードからのスタートでした。(勉強しないといけないことが多すぎな状態・・)
この例に限らず、日本ではデータサイエンティストも機械学習エンジニアも「獅子の子落とし」が如く*8、「何の手助けもない試練の中から這い上がってきた者だけがプロとして扱われ成功する」的な要素が濃いように見受けられます。
以前の記事でも取り上げたことがありますが、経験者採用しかされない一方で上記の内閣府の例のようにOJTすらも組織立ってなされないとなると、データサイエンティストや機械学習エンジニアとして一人前になるには自力でゼロから研鑽を積んだ挙句自力で職務経験を積む努力しかない、というかなりつらい立場に追いやられがちです*9。
レビュー評価の高い数学本も多いし、簡単そうなタイトルの本消化すれば余裕だよね
そんなことはなかった。
レビューでは「大学でよく分からなかった私でもしっかり理解できた」「長年よく分からなかったのが、やっと理解できた」といったものが並んでいるにも関わらず、本を進めてもしっくりきません。
序盤の方などは理解できるものの、途中で躓いて理解が難しくなり、結果として線形代数だけで何冊も、読み終わることなく本が積み上がることになりました。
よく機械学習の本で紹介されているプログラミングのための線形代数などでさえ、しっくり来ませんでした。
おそらく、大学の授業などを受けていたり、大学受験でしっかり数学を勉強した方が多いと思うので、数学の下地の差かな・・と思いました。(当時結構焦りを感じたというのも記憶しています)
転機 : 数式をプログラム言語の一つだと思うようにした
一つ目の転機となったのが、ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装の書籍です。
発売されてすぐに購入したため、レビューが少ない(なかった?)状態での結構博打的な購入でしたが、結果としては大正解でした。他の書籍は途中で挫折することばかりだったのに、この書籍はあまり躓くことなく、しっかりと理解を深めることができました。
なぜこの書籍だと色々理解ができたのか?少し考えて見たところ、以下のような点が浮かんできました。
- 理論・数式・スクリプトがセットになっており、自分で手を動かしながら進めていました。
- 他の数学の本などでは、紙とペンで手を動かして計算したりすることはあるものの、コードを書いたり、といったことはありませんでした。
- プログラミングのための線形代数の書籍でも(言語が確かRubyで、書いたことがなかったというのもあり)、書籍を眺めて進めていました。
手応えを感じたため、同じようにスクリプトを書いて手を動かしながら、実行結果を見ながら進められる線形代数(1): Pythonによる科学技術計算 実践編という本を購入しました。
この書籍からは、薄めの本だったというのもあり、試しに本文も全て写経、数式もLaTeXで全て写経しつつ、Jupyterでもスクリプトを書いて実行・結果を確認しつつ進めてみました。
結果としては終盤少し理解が及ばないところも出てきましたが、他の数学の本の時と比べると、断然に躓かず、理解が深まる結果となりました。
この時、LaTeXを初めて触り始めましたが、LaTeXを書いている内に、「なんだかプログラム言語みたいだ」という意識が生まれてきていました。(エンジニアをしていたこともあり、プログラム言語みたいに思い始めたら、抵抗感が薄れていきました)
また、写経をすることで、今まで数式を眺めていただけだったのが、しっかりと数式を見ないと写経できないこともあり、写経後その数式がどんな構造になっているのかの理解が深まるという経験を何度も体験しました。
数式だけでなく、理論やスクリプトも写経することによって、「数式だけだとよく分からない」といったところがスクリプトを書いて動かしたりしていると「この数式はこういったことを表していたのか」といった風に理解が進むということも結構ありました。
数式とスクリプトなどが一緒になっていることで、「数学は理解できたけど、実際にPythonだとどう書くの?」「どの関数を使うの?」といった点がクリアになったという点を大きかったように思います。
専門用語の英語表記なども充実していたので、「NumPy(SymPy)のこの関数名は、この用語に由来するのか」といった知識が増えることもあり、それらもプラスになったように感じます。
実際に仕事で扱う際には、紙とペンで計算したり、といったことは(私の環境では)無いので、数学の知識をスクリプトとライブラリと紐付ける、というのも重みを置くべきだと思っています。
紙とペンだと計算にかなり時間がかかるのが、NumPyで書けば数行で済んだりする(しかも過程の計算ミスをしない)ため、その時間をもっと理論やスクリプトに割いてあげるのも(仕事のことだけ考える上では)いいのでは、と思います。
思えば、プログラム言語の勉強も眺めているだけでは無理だった
新しいプログラム言語を学ぶ際、入門書をただ眺めていれば(少なくとも私は)マスターできたりはせず、どんどん写経して、実際に動かして身につけていく、という方が多いのではないでしょうか。
英語も、ただ英文を眺めているだけではなく、音読したり、シャドウイングしたり、瞬間英作文的なトレーニングしたり、ライティングしたり、多聴したりと五感を色々使ったほうが学習が捗ると思います。
数式も同様、眺めているだけではなかなか身につきません(例外的に、ちょっと眺めればさくっと身につく天才的な方もいらっしゃるとは思いますが)。
どんどんLaTeXだったりで写経したり、スクリプトで表現して動かしたりしていきましょう。
LaTeXをすぐに書ける環境が色々ある
LaTeXで写経していくといっても、書いたことがない・・どういった環境を用意すればいいの?という場合には、QiitaだったりJupyterなどがお手軽でおすすめです。
Qiitaであれば、
```math
```
といったようなコードブロック内にLaTeXを書いていけば、更新の度にレンダリングしてくれます。
インラインで書く場合、$記号で囲めば書くことができます。($w_1, w_2,...$といった具合に)
ちなみに、Qiitaでインラインで書く場合には、下付き文字を設定する場合、エスケープしないとうまく認識してくれないことがあります。$w_1, w_2,...$ではなく$w\_1, w\_2,...$といった具合に書くようにしておくと安心です。
Jupyterであれば、マークダウンのセルで$記号で囲うことで扱えます。
理論と数式・スクリプトがセットになっている本がどんどん充実してきている
前述の2冊の他にも、理論と数式・スクリプトがセットになっているデータサイエンスの書籍が色々充実してきています。
Pythonで体験するベイズ推論 PyMCによるMCMC入門などもそうですし、これらの書籍でも「数学だけだと理解が難しい」といったことが書かれており、スクリプトがとても充実しており、内容の理解がとても捗りました。
他にも、まだ読んでいませんが、
などの書籍も良さそうな印象を持っています。基礎はいくらしっかりしていてもし過ぎることはないと思うため、そのうち買って読みたいところです。
至れり尽くせりで、今後もどんどん書籍が充実していくでしょうから、数学単体、理論単体、スクリプト単体・・といった風に書籍を買わなくてもいいように(単体の書籍を買うメリット少なく)なっていくのではないでしょうか。
その時は理解ができなくても、他の本を読み進めたら分かるようになったことも多い
数学だけでなく、理論やプログラムなどもそうですが、ある本を読んでいて、写経をしたりなんどか読み直しても理解が及ばないということがあります。
そんなときには、そんなものだと思って、後に他の本を進めていると思わぬところで理解が深まることがあります。
たとえば、私は詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理の本を読んだあとにPythonで体験するベイズ推論 PyMCによるMCMC入門の本を読みましたが、ベイズの本のおかげで、詳解 ディープラーニングの本であやふやだった点が色々クリアになった、ということを経験しています。
一時的に分からなくても落ち込まずに、どんどん本を読んでいくといいと感じます。
余談
前述した記事のGoogleの方でも数学が苦手とおっしゃっていますし、
常々公言しているように数学が大の苦手な身ながらどの分野のどのレベルの数学が機械学習をやっていく上で必要なのかという点について戯言だらけの駄文を書いてみることにします。
機械学習をやる上で必要な数学とは、どの分野のどのレベルの話なのか
ディープラーニングの書籍だったり、記事を色々書いていらっしゃる清水社長も苦手だと書かれていますし、
おれは数学が嫌いだ。もちろん苦手でもある。高校程度の数学は全く解らない。この話をするとよく驚かれるが、本当のことである。
道具としての数学
お二方からすると遥かに下の方の知識と技術しかない私(もちろん数学への苦手意識があります)でも一応データのお仕事ができているわけで、まあ別に数学に苦手意識があっても、それは自然なことで恥ずべきことでもなく、一歩一歩、焦らず勉強を続けていればいいのかな・・と少し思ったたりしています。
補遺
一応、コミュニティガイドラインについての補足説明など目を通していますが、皆さんから見てもしこういった投稿がNGそうでしたらご連絡いただけますと幸いです。