情報系学生がCoursera Machine Learningを修了した感想（一回挫折）

Courseraの機械学習コース"Machine Learning"は言わずと知れた人気コースですが、
**情報系の学生からの目線での記事を見かけない**ので、書くことにします。  
**恥ずかしながら1回目のトライでは挫折してしまいましたが、１年ほど経ってから再トライして、無事修了できました。**
その失敗から学べたことも書くので、少しでも皆さんのために***再現性のある体験記***になれば幸いです。

https://www.coursera.org/account/accomplishments/verify/37WKNEZNUEWA

https://www.coursera.org/learn/machine-learning


#バックグラウンド
- 大阪の情報系大学新3回生
- 大学では機械学習を**体系的**に学んだことはない。  
(プログラミングの課題でgradient descentの穴埋めが出たことがあるくらいだが。)
- Webフロントエンドかじったことがある
- 語学力 TOEFL iBT 87, 英検1級


# 情報系学生がこの講座を受講する意義は？

いくつもありますが、特に感じたことを抜粋して書きます。

## このコース:プログラミングで手を動かして実用的なMLの全体像をつかめる

一つのテーマの数学的側面にめちゃくちゃ深入りする、ということはありませんでした。
これは段階を踏む必要のある初心者の僕にはありがたかったです。
特に、MLの分野は多種多様なので、はじめから一つの分野に深入りすることはリスクだと思います。

###  実用性を意識させる講義やプログラミング課題  
- 映画のレコメンディング機能の実装や、実際の機械学習の開発での心構えなど
- 「初めはdirty implementationでとにかくプロトタイプを作ってみる」などの研究におけるマインドセット
- F1スコアなどの指標によるモデルの評価の方針や、パラメータの実践的な選び方
- 機械学習プロジェクトで何に時間がかかり、どこが改善して効果が出るかなど判断するための手法（最終講義）
- Andrew先生の実際の経験や見聞きしたことによる、うまくいかなかった事例のケーススタディ

**なお、教授が温かい言葉をはじめから最後までかけてくれます。**

## 大学の授業:アカデミック色が強くCourseraのコースほど親切ではない

- 理論だけで、実際に手を動かして実装する機会は学部では少ない（私の大学の場合）
（**私の大学の授業の場合**に限って例を述べると、最近人工知能に関連する専門講義を受講し始めましたが、**理論的な学習**をして、レポートを書くスタイルの講義で、コーディングしたりすることはないようです。）
- 数式が教科書にぶちこんであり、「あとは自分で理解してね」といわんばかりの教科書  
**こういった教科書は、学習のモチベーションを保つには難しく**、「数学が大好き」といいがちな一部の変態ハードコア学生、ではない僕のような学生にとって不向きですし、Googleなどが提唱する**「AIの民主化」**という流れに反していると思います。
- 特定のアルゴリズムの数学的な側面にばかりフォーカスしていて、現実世界での応用を意識させる内容ではない
一方、学習内容の実用性を意識できた方がより学習の効率が高いという研究結果があるそうです。メンタリストDaigoの本にもよくこのことは出てきますね。

# 講義の難易度について

## 全体的な傾向
- クイズは動画を見れば解ける 
- プログラミング課題は、時間がかかることがある（後述）

## かかる時間：初心者の僕はだいたいWeekの数だけかかった

だいたい11週くらいです。 （コースの最終締め切りの数日前）

- 僕は初学者なので動画は飛ばさず、ほとんどは1倍で視聴
- プログラミング課題の締め切りが僕の場合は月曜だったので、**週末に焦りながらこなしました。**
- 課題は週末とかの朝の時間帯に集中 (朝だけで終わることもあれば、朝x2くらいかかることも)

### 注意:かかる時間は人によりけり
**コースの左下に出てくる目安の時間はあくまで目安なので、参考程度に見れば精神的に楽です**
なぜなら、受講者は十人十色で経験がそれぞれ違うからです。
**僕の知り合いのロシア人のエンジニアは、長期休暇に2,3週間くらいで終わらせたらしいです。**
ただ、その人は数学とか統計のバックグラウンドがもともとあったみたいです。
つまり、**もともとこの分野や統計の素養がある人は短期集中で終われせられる**みたいですね。
大学学部生で初学者の僕はそうはいきませんでした。**僕のような初学者は地道にやるしかないですね！**
まあ、初めは誰しもが通る道なのでしょう。



## 理系情報系学生には有利だった場所
いくつか抜粋して例を述べます：

### 初期の多項式のフィッティング
必修で取らされた物理実験などで用いた最小二乗法の知識が応用できる

### 異常検知
正規分布や確率密度関数の考え方は物理実験で扱ってたので楽だった

### SVMのガウシアンカーネル
画像処理の必修の授業から学んだガウシアンカーネルも見たことがあったので、精神的に楽でした

### その他、行列がいろいろ出てくるところ(PCA,Regression, etc)
線形代数でのベクトルや行列、固有値や固有ベクトルなどは勉強してて役立ちました。
また、行列の最小二乗解の知識があれば、最初のregression,回帰の行列の方程式を逆行列を用いてanalyticallyに解く真面目な方法とかが、腑に落ちるでしょう。
また、プログラミング課題で何かとベクトル表現を要求されます。これは、行列の知識が結構いかせます。
**逆に、行列の知識がないと、挫折してしまう大きな要因になる気がします。**
というか、僕は前回受講時は挫折しました。

### プログラミング課題
MATLABは情報系で触るC,C++,Javaとかとは違う部分が多いです
（MATLAB自体がそれらとは目的が異なるためですが）
しかし、ループをネストさせたりするとか、そういう根本的な部分は情報系の学生は慣れてるので、無からやるよりは有利だと思いますし、マインド的にも挫折の確率は下がると思います。**大学入学当初に前回挫折した時は、プログラミング自体に慣れてなく、動かないときに萎えてました。**

おそらく、人間の脳には、一度に学べることは限られていて、知らないことの量が一定の閾値を超えると、挫折する可能性は高まると思います。ですので、**やはり線形数学の基礎とプログラミングの基礎は先に身につけておくことに越したことはないと、身をもって理解しました。**

## 特に難しかった箇所： Back Propagationの範囲の理解
名前がカッコいいと僕の中で話題の「ニューラルネット」というブツはロジスティック回帰の複雑なバージョンと考えることができます。
ここまではちゃんと受講していれば、前回の講義の復習になりアハ体験です。
そして、ニューラルネットでは最初にcost functionを求めるforward propagationを扱います。

でもそれだけじゃ最適化できなくね？と画面の前で一人ツッコミを入れてました。
すると、次週ではback propagationという手法が登場し、ランダムにinputを初期化して、後ろの層から前の方にシータを変化させていって、その変化の伝播を考えると、なんと勾配が求まるという、びっくり仰天しました。

**勾配がもとまればGradient Descentとかで最適化できる!!**

ニューラルネットの表現だけでも思いつくの難しそうなのに、思いついた人、天才ですね、
と改めて画面の前からツッコミを入れさせていただきました。
**数学的証明は難解**なので直感的な理解がしづらいですが、理解できなくてもNNを使うのに支障はそれほどないそうです。  
(**Andrew先生が「すぐに分からなくても大丈夫、これは私も昔は難しいと感じたよ。」と励ましてくれます**)
**このBack Propagationの回が、クイズとプログラミング課題と共に僕にとっては鬼門でした。**  
また、他の受講者にとっても難しいのではないでしょうか？
B.P.が難しかったという感想をよくネットで目にしましたし、
**Googleの検索候補でも、機械学習の扉を叩いた先人の苦悩を垣間見ることができます。**

Google様の検索候補：
![スクリーンショット 2021-05-15 21.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614389/728748c5-5328-ff64-884d-c7f87addb4c7.png)

余談： この検索エンジンにも機械学習が用いられていることを考えると、感動しますね。
先人の苦悩は、無駄になることなどなく、ちゃっかりGoogleの機械学習モデルによって学習されて後世にバトンタッチされてるみたいです。


#前回は挫折しました
大学入学直後に自分で受講してみましたが、その際は途中で挫折しました。

## 前回の失敗の内的要因
- **線形代数、コーディング**の知識が不十分だった。
- モチベーションが一時的にweb系の勉強にうつってしまった。

## 前回の失敗の外的要因
- 前回は機械学習をやる**モチベーションを保つ外的要因がなかった**  
 （今回は春からML研究系の会社で働かせていただくことになったため、その点は有利でした）


今回は、**線形代や情報工学の基礎**が大学で身についたこともあり、比較的前回よりも進み具合がよく、無事修了できました。
（大学の授業で役立ったことなどは後述します）

# 挫折から学んだ2つのこと

## 1.段階的に学ぶ
私が前回挫折した内的要因は、線形代数やプログラミングのスキルが不十分であったことです。

Qiitaの記事では、情報系学生でない人でも線形代数の知識や解析学の知識がなくても大丈夫だよ、という記事をいくつか見かけますが、それを鵜呑みにするのは危険だと思います。 

**特に初心者は、知識の欠如から、大事なことと、そうでないことの区別がそもそもできません。** 

ですので、例えば、最小二乗解というブツが講義で出てきました。その最小二乗解のくだりは、あくまでgradient descentのように反復的に求めるアルゴリズムとの対比で説明されているだけですが、前回挫折した時は、線形数学の知識がないにもかかわらず、Wikipediaでこれを理解しようとしてしまいました。

最小二乗解とはこんな方のことですが、機械学習ではデータの量がムッチャ少ないとかの特殊なケースを除いて、あまり使われません。

```math
w = (X^T X)^{-1}t 
```

しかし、これを理解しようとしようとすると、学習の初期段階ではストレスになり、挫折の可能性が高まります。

ですので、あくまで「いやー僕みたいな〇〇でもできました」という記事タイトルは、記事のPV数を上げるためにテクニック的に使っている可能性もあることを念頭においておく必要があり、**線形代数の知識が必要ないとか、そういうことではない**ことを覚えておくと、僕のように一回挫折することは起きにくいのではないでしょうか？

## 2.再現性のある情報を探す

どういう経歴の人が、どういう過程を経て、どういう結果を得たという記事を探すことが大事だなと痛感しました。

勝俣さんという方が、必要な数学の知識について素晴らしい記事を挙げられているので、情報系でなくても、理系でなくても、こうしたステップを踏めばこのコースは無理なく修了できる可能性が高まるのではないでしょうか

https://qiita.com/poly_soft/items/8ea0fc85577f0726f098

**余談ですが、僕の高校時代の指導要領には行列が削除されていたので、行列を学んだのは、大学の線形代数の授業が初めてでした。**
線形代数を学ぶ前にCourseraに挑むのは、初学者の僕にとって初めは酷だったと思います。今回はすでに線形代数で行列などが身についていたので問題はありませんでしたが。


# 次のステップ
あくまでCoursera Machine Learningははじめの一歩なので、これが終わったからといって、実務で今のバイト先の会社に貢献できることはそれほどないので、まだまだ勉強しなければな、と思います。それと同時に、一回失敗したことができるようになったのは、小さな成功体験になったのでよかったです。

https://course.fast.ai/

次は、 fast.ai という実践的な教材をコーディングしながらやっていくつもりです。
**この教材は日本語の記事とか情報が少ないので、また完了したら感想などをQiitaに書こうと思います。**

ここまで読んでいただき、本当にありがとうございました☺️