レコメンド初心者の基本学習方法と結果・感想

仕事でレコメンドに関わるので基本から学習しましした。その学習方法と記録、感想などです。
Udemyのレコメンドに関するコース[Recommender Systems and Deep Learning in Python](https://www.udemy.com/course/recommender-systems/)を受講しました。ちょうどブラックフライデーで1800円と格安でした。この値段で効率よく学習できたと思えば異常にコスパ良いです。1万円払ってもいいくらい。
レコメンドは他の機械学習分野と比べて癖があるので、基本を学べる機会ができて良かったと感じました。このコース中か、どこかのサイトでか「レコメンドは回帰や分類と違い、欠損値補完に近い」と書かれていて、その感覚が腑に落ちました。

https://www.udemy.com/course/recommender-systems/

後で気づいたのですが、Googleの以下のLearning良いですね。非常にわかりやすかったです。

https://developers.google.com/machine-learning/recommendation

# サマリ
OptionalのLectureは結構飛ばしていて、RBMも完全に理解していません(Codingもしていない)。

|項目|内容|
|:-:|:--|
|目的|レコメンドの基本習得|
|期間|約2.5ヶ月|
|総時間(実績)|約45時間|
|方法|[有償オンラインコース「Recommender Systems and Deep Learning in Python」](https://www.udemy.com/course/recommender-systems/)|
|Repo(学習結果)|https://github.com/YoheiFukuhara/recommender-system|
|Repo(学習元)|https://github.com/lazyprogrammer/machine_learning_examples/tree/master/recommenders|

## 学んだことサマリ
レコメンドの考え方における基礎、そして協調フィルタリングとMatrix Factorizationについて学べました。数式からコーディングも含めて覚えることができました。
私は基礎のみを覚えたかったので飛ばしましたが、RBM(制限ボルツマンマシン)およびSparkでの実装についてはスキップしています。

# 数学と機械学習の前提知識
数学と機械学習が入り混じっていますが、以下の勉強をしていた状態で臨みました。大学は文系卒で数学苦手です。ここにたどり着くまで長すぎ。英語は基本的に難しくないですし、字幕もあるので問題ありません。たまに数学・統計用語の英単語がわからず？となることがあり。

1. 高校数学復習と大学基礎レベルの数学(微積・統計・線形代数)勉強
2. [「統計学入門 (基礎統計学)」](http://amzn.to/2oVhAqI)で統計基本を勉強
3. [「Rによるやさしい統計学」](http://amzn.to/2mDoNMH)でR言語を使いながら統計基本を勉強
4. [「やさしく学ぶ 機械学習を理解するための数学のきほん」](https://amzn.to/2qfN9AP)で機械学習と数学を勉強
5. ディープラーニングを使った画像処理システムを仕事で構築
6. [Coursera機械学習入門オンライン講座](https://qiita.com/FukuharaYohei/items/b2143413063376e97948)で機械学習に入門
7. [言語処理100本ノック 2015年版](https://qiita.com/FukuharaYohei/items/6f0af3c4e270d8af2d99)で言語処理の基礎をPythonで勉強
8. [「はじめてのパターン認識」](https://amzn.to/2JlEWRz)で機械学習基礎を勉強

**「1. 高校数学と大学基礎レベルの数学」は絶対に必要**ですね。詳しくは、[記事「文系卒社会人が統計・機械学習を理解するための数学勉強方法【随時更新】」](https://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参照ください。あと、「5. Coursera機械学習入門オンライン講座」は必須ではないですが、強くおすすめします。レコメンドに関しても[9周目](https://qiita.com/FukuharaYohei/items/32caeaca6f77bf6f92dd#2-recommender-systems)で学習します。

# 学習の進め方
動画を見て自分自身の理解が浅いと思ったことは、ネットで調べたり、コードを見たり書いたり、数式を書きながら理解を深めていきました。
こうして書いてみると特別なことはしていませんね。

# Lecture 一覧
以下は Lecture 一覧で、「難易度」列は:star:が多いほど難しい。動画を1回見るだけでも12時間ほどかかります。

|No|Section|総動画時間|Lecture数|難易度|学んだことなど|
|:--|:--|:-:|:-:|:--|:--|
|1|Welcome|19分|4|:star:|コース概要や注意点のみ|
|2|Simple Recommendation|2時間31分|20|:star::star:|Associations, Lift, ExploreとExploitのジレンマ, 評価指標, ベイズアプローチ|
|3|Collaborative Filtering|1時間29分|8|:star::star:|ユーザベース, アイテムベース|
|4|Beginner Q&A|14分|3|:star:|Cold-Start問題|
|5|Matrix Factorization and Deep Learning|2時間6分|19|:star::star:|MFとディープラーニング|
|6|Restricted Boltzmann Machines(RBM's) for Collaborative Filtering|1時間36分|13|:star::star::star:|制限ボルツマンマシン(RBM)|
|7|Big Data Matrix Factorization with Spark Cluster on AWS/EC2|47分|19|:star:|SparkでのMF|
|8|Basics Review|36分|13|:star::star:|Keras, 信頼区間, 共役事前分布|
|9|Setting Up Your Environment(FAQ by Student Request)|38分|2|:star:|Anaconda, Python環境|
|10|Extra Help With Python Coding for Beginners(FAQ by Student Request)|42分|4|:star:|コーディング関連Tips|
|11|Effective Learning Strategies for Machine Learning(FAQ by Student Request)|1時間|4|:star:|機械学習の勉強法|
|12|Appendix / FAQ Finale|8分|2|:star:|追加|

# 内容
スキップしているLectureもあります。Section 1 だけ補足を書きます。他は流石に有償コースなので書けないです。

## Section 1. Welcome
まずは簡単な概要。コードはGitHubでデータはkaggle|

|Lecture|時間|内容|
|:--|:-:|:--|
|1. Introduction|3分|推薦使用例やコースで何を学ぶかの概要|
|2. Outline of the course|5分|コースの流れ|
|3. Where to get the code|5分|コードとデータの取得元|
|4. How to Succeed in this Course|6分|3つのTipsなど|

### 3. Where to get the code
#### コード
[取得元 Repository](https://github.com/lazyprogrammer/machine_learning_examples/tree/master/recommenders)。 「コードは頻繁に変えるからForkするな、Cloneしろ」と言っていました。結局私はCloneもせずに、必要に応じてコピペして終わりました。

#### データ
データは[Kaggle](https://www.kaggle.com/grouplens/movielens-20m-dataset)からダウンロード。動画内にURLは書いてあるが、検索エンジンで検索しろと注意書きありました。たまにURL変わるのでしょうか。
ディレクトリは以下のように作るように指示がありましたが無視しています。rating.csvファイル以外は使いません。

```shell:Directory
root/
 ├─recommenders
 ├─large_files/movielens-20m-dataset/rating.csv
 └─...ohter folders...
```

### 4. How to Succeed in this Course
3つのTipsあり

1. Use the Q&A
1. Meet the prerequisites
1. Code by yoruself

Udemyコース内だけでなく、以下のサイトもQAとしてある。

https://forum.lazyprogrammer.me

## Section 2. Simple Recommendation Systems
レコメンドの基本。(パーソナライズではなく)ジェネラルなレコメンドを学びます(売上ベースなど)。取っ掛かりとして非常に良い内容。Bayesian Approachは学習しませんでした。

|Lecture|時間|内容|短評|
|:--|:-:|:--|:--|
|5. Section Introduction|4分|セクションの流れ|
|6. Perspective for this Section|4分|セクション概要|
|7. Basic Intuition|5分|基本的な概念|
|8. Associations|5分|組み合わせ|
|9. Hacker News - Will you be penalized for talking about the NSA?|7分|Hacker Newsの事例|人気のある記事と時間軸の考慮|
|10. Reddit - Should censorship based on politics be allowed?|9分|Redditの事例|ポリコレへの言及あり|
|11. Problem with Average Rating & Explore vs. Exploit(Part 1)|11分|Average Rating問題|信頼区間などの数式は深く理解しない|
|12. Problem with Average Rating & Explore vs. Exploit(Part 2)|8分|Average Rating問題とExploreとExploitのジレンマ|
|13. Bayesian Approach part0(Preparation)|12分|Bayesian Approachを理解するためのChecklist|任意のLecture|
|14. Bayesian Approach part1(Optional)|11分||先を急ぐためスキップ
|15. Optional: Bayesian Approach part2(Sampling and Ranking)|6分||先を急ぐためスキップ
|16. Optional: Bayesian Approach part3(Gaussian)|8分||先を急ぐためスキップ
|17. Optional: Bayesian Approach part4(Code)|12分||先を急ぐためスキップ
|18. Why don't we just use a library|6分|なぜライブラリを使うか|
|19. Demographics and Supervised Learning|7分|人の属性と教師あり学習|
|20. PageRank(part1)|11分|Page Rank|任意で先を急ぐためスキップ
|21. PageRank(part2)|12分||任意で先を急ぐためスキップ
|22. Evaluating a Ranking|5分|ランキングの評価|
|23. Section Conclusion|4分|セクションのまとめ|
|24. Suggestion Box|3分|このコースのフィードバック方法|

以下の3つの記事を参考にしました。

https://hironsan.hatenablog.com/entry/non-personalized-recommendation

https://hironsan.hatenablog.com/entry/recommendation-by-confidence-interval

https://hironsan.hatenablog.com/entry/explore-exploit-dilemma-and-bayesian-approach

## Section 3. Collaborative Filtering
協調フィルタリング。数式とコードで学びます。

|Lecture|時間|内容|短評|
|:--|:-:|:--|:--|
|25. Collaborative Filtering Section Introduction|12分|前Section振り返りと本Section概要|
|26. User-User Collaborative Filtering|14分|User-User Collaborative Filtering|タイトルのとおり|
|27. Collaborative Filtering Exercise Prep|10分|Exerciseの準備説明|
|28. Data Preprocessing|15分|データ前処理|コーディングに想像以上時間かかった|
|29. User-User Collaborative Filtering in Code|16分|レコメンド処理のコーディングExercise|処理時間長い・・・
|30. Item-Item Collaborative Filtering|9分|ユーザベースと類似|
|31. Item-Item Collaborative Filtering in Code|7分|ユーザベースと類似|
|32. Collaborative Filtering Section Conclusion|6分|Sectionまとめ|

## Section 4. Beginner Q&A
ビギナーにありがちな質問への回答。基本的に「*Common Sense*に従え」と。ビギナーは経験が無いが故に迷いがちだが、論理的にシンプルに考えると答えに行き着く。

|Lecture|時間|内容|短評|
|:--|:-:|:--|:--|
|33. How do I Choose Which Model to Use?|4分|モデル選択のTips|シンプルなケーススタディと頭の体操|
|34. How do I Solve the Cold-Start Problem?|4分|Cold-Start問題対処法||
|35. What if I Don't Like Math or Programming?|6分|数学とプログラミング苦手だった場合||

## Section 5. Matrix Factorization and Deep Learning
このコースのメインとなるトピック。数式からコーディングまでがっつりやりました。

|Lecture|時間|内容|
|:--|:-:|:--|
|36. Matrix Factorization Section Introduction|4分|Sectionの導入
|37. Matrix Factorization - First Steps|15分|MFの基本考え方
|38. Matrix Factorization - Training|9分|MFの損失関数と微分による最適化
|39. Matrix Factorization - Expanding Our Model|8分|バイアス項の導入
|40. Matrix Factorization - Regularization|6分|正則化
|41. Matrix Factorization - Exercise Prompt|1分|次のExercise注意点
|42. Matrix Factorization in Code|6分|Exercise
|43. Matrix Factorization in Code - Vectorized|10分|1つ前のコードを高速化
|44. SVD (Singular Value Decomposition)|8分|SVD(Optional)
|45. Probabilistic Matrix Factorization|6分|確率的MF
|46. Bayesian Matrix Factorization|6分|MF + ベイズ
|47. Matrix Factorization in Keras (Discussion)|8分|KerasでのMF実装(理論)
|48. Matrix Factorization in Keras (Code)|7分|KerasでのMF実装(Code)
|49. Deep Neural Network (Discussion)|3分|NNでのモデル実装(理論)
|50. Deep Neural Network (Code)|3分|NNでのモデル実装(Code)
|51. Residual Learning (Discussion)|2分|MFとNNのアンサンブル(理論)
|52. Residual Learning (Code)|2分|MFとNNのアンサンブル(コード)
|53. Autoencoders (AutoRec) Discussion|10分|Autoencoder(理論)
|54. Autoencoders (AutoRec) Code|12分|Autoencoder(コード)

## Section 6. Restricted Boltzmann Machines(RBM's) for Collaborative Filtering
難しい。前提知識にFree Energyなど物理の知識？が必要っぽく、勉強時間かかりそうなのでざっと流しました。概要レベルでは理解したつもり。コーディングもしていません。

|Lecture|時間|内容|
|:--|:-:|:--|
|55. RBMs for Collaborative Filtering Section Introduction|2分|Sectionのイントロ|
|56. Intro to RBMs|8分|RBMの基本|
|57. Motivation Behind RBMs|7分|Boltzmann Machines概要|
|58. Intractability|3分|計算量の難しさ|
|59. Neural Network Equations|8分|ニューラルネットワークの計算式|
|60. Training an RBM (part 1)|12分|RBM訓練の数式|
|61. Training an RBM (part 2)|6分|RBM訓練の数式|
|62. Training an RBM (part 3) - Free Energy|7分|Free Energy解説|
|63. Categorical RBM for Recommender System Ratings|12分|カテゴリカル(ランキング)も含むRBM|
|64. RBM Code pt 1|7分|RBMコーディング|
|65. RBM Code pt 2|4分|RBMコーディング|
|66. RBM Code pt 3|12分|RBMコーディング|
|67. Speeding up the RBM Code|8分|RBM高速化|

## Section 7. Big Data Matrix Factorization with Spark Cluster on AWS/EC2
Matrix FactorizationをSparkで処理。Sparkを直近で使う予定もないので、動画を1回見ただけ。

|Lecture|時間|内容|
|:--|:-:|:--|
|68. Big Data and Spark Section Introduction|7分|ビッグデータとSpark|
|69. Setting up Spark in your Local Environment|8分|Sparkのローカル環境構築|
|70. Matrix Factorization in Spark|10分|SparkでのMF|
|71. Spark Submit|6分|Sparckのサブミット|
|72. Setting up a Spark Cluster on AWS / EC2|13分|AWSでのSpark構築方法|
|73. Making Predictions in the Real World|3分|Sparkでの推論方法(遅いからバッチ処理しとく)|

## Section 8. Basics Review
Kerasとその他がごっちゃに詰まっている。「79. Gaussian Conjugate Prior」は軽く見ただけで理解していない。

|Lecture|時間|内容|
|:--|:-:|:--|
|74. (Review) Keras Discussion|7分|Kerasの基本|
|75. (Review) Keras Neural Network in Code|7分|Kerasコーディング|
|76. (Review) Keras Functional API|4分|Keras Functional API解説|
|77. (Review) How to easily convert Keras into Tensorflow 2.0 code|2分|Pure Kerasをtf.kerasへ書換|
|78. (Review) Confidence Intervals|10分|信頼区間|
|79. (Review) Gaussian Conjugate Prior|6分|共役事前分布|

## Section 9. Setting Up Your Environment(FAQ by Student Request)
自分には十分かと思い見ていません。

|Lecture|時間|内容|
|:--|:-:|:--|
|80. Anaconda Environment Setup|20分||
|81. How to How to install Numpy, Theano, Tensorflow, etc...|18分||

## Section 10. Extra Help With Python Coding for Beginners(FAQ by Student Request)
「85. Python 2 vs Python 3」はPython2をもう使わないでしょう、と思い見ていません。

|Lecture|時間|内容|
|:--|:-:|:--|
|82. How to Code by Yourself (part 1)|16分|コードの重要性とアドバイス|
|83. How to Code by Yourself (part 2)|9分|82の続き。Summaryもあり。|
|84. Proof that using Jupyter Notebook is the same as not using it|12分|Jupyter Notebookについて|
|85. Python 2 vs Python 3|5分||

## Section 11. Effective Learning Strategies for Machine Learning(FAQ by Student Request)
ここに機械学習の学習単元ごとの依存性の説明あり。

https://deeplearningcourses.com/course_order

|Lecture|時間|内容|
|:--|:-:|:--|
|86. How to Succeed in this Course (Long Version)|10分|「6. How to Succeed in this Course」の長バージョン|
|87. Is this for Beginners or Experts? Academic or Practical? Fast or slow-paced?|22分|色々FAQ|
|88. Machine Learning and AI Prerequisite Roadmap (pt 1)|11分|機械学習を学ぶためのロードマップ|
|89. Machine Learning and AI Prerequisite Roadmap (pt 2)|16分|機械学習を学ぶためのロードマップ|

## Section 12. Appendix / FAQ Finale
少し見ただけです。機械学習を学ぶための内容ではありません。

|Lecture|時間|内容|
|:--|:-:|:--|
|90. What is the Appendix?|3分||
|91. BONUS|6分||