文系非エンジニアが機械学習初心者になるまでの過程

ちょうど節目かなってところまで来たので整理がてらアウトプット。
整理（美化？）してあるので、実際にはもっと寄り道してる。

## 機械学習に興味を持った経緯

一番最初に興味を持ったのはword2vecなので2年くらい前

[自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる](http://antibayesian.hateblo.jp/entry/2014/03/10/001532)

それから、色々とおもしろそうなニュースを横目に見ながらも自分でやるには難しそうだなと手を出せずにいた。そもそもろくにプログラミングもできなかったし。（プログラミングは本格的に勉強し始めてから1年くらい）
その後、プログラミングを勉強し始めてひと段落ついたところで、手をつけてみることにした。
この時点で興味はDCGANに移っていた。

[Chainerを使ってコンピュータにイラストを描かせる](http://qiita.com/rezoolab/items/5cc96b6d31153e0c86bc)

この流れで説得力ないが、アニメ嫌いじゃないけどアニオタではない……

## 最初にやったこと

登山に興味ないし登山に関する知識もないけど、他にいい比喩も思いつかなかったので登山に喩えてみる。

スタート時点では山の高さ・地形・特徴・必要な装備は何もわからない。見ず知らずの他人に聞いて（ネットで調べて）も、その人がどんな装備を持っていたのかはよくわからないので、その人のルートが自分に向いているかはわからない。
そもそも、登山の目的だって

- 頂上の景色が見れれば手段は問わない（目的が達成できればAPI叩こうが他人が作ったモデルをコピペしようが何でもいい）
- 季節や天候に応じて適切なルートで何度も登りたい（ツールとして使いこなせるようになりたい）
- チェーンソー持って他人が通ったことない道を切り開きたい（自分でガリガリ研究して新しい分野を切り開きたい）

と違うかもしれない。
自分の装備や目的をじっくり聞いて適切なルートを教えてくれる人がいればいいけど、そんな奇特な人に心当たりはなかったので、自分の場合はとりあえず外周をぐるりと回って

- 本当に自分の目的は達成できそうか？（世の中誇大広告ばかりで実際にやってみると思ってたほどのことはできないなんてザラ）
- 目的が達成できるとして適切な手段か？（[鶏を割くに焉んぞ牛刀を用いん](https://ja.wiktionary.org/wiki/鶏を割くに焉んぞ牛刀を用いん)みたいにより適切な代替手段がないかどうか）
- 目的を達成するまでにどういうステップを踏めばよさそうか？

ということを調べた。
具体的には、以前から興味を持ってストックしていた情報に新しい情報を少し足して、機械学習の利用事例をまとめた。

[(主に)ディープラーニングの成果を利用したAPI集(自分用)](http://qiita.com/shngt/items/966799cc3f7c77a6fa17)

調べる過程で、できそうなこと・できなさそうなこと・勉強方法などある程度見えてきた。
調査やインプットばかりでは飽きるので、APIを叩いたり、知識がなくても動かせそうなAzure Machine Learningを触ってみたりもした。

[Azure Machine Learningをわかった気になるために細かいことは気にせずに機械学習のことをまとめてみる - ディープラーニングの手前まで](http://qiita.com/shngt/items/c84ddb034a2cc4c4632e)
[Azure Machine Learningをわかった気になるために細かいことは気にせずに機械学習のことをまとめてみる - ディープラーニング](http://qiita.com/shngt/items/431d7749a67573085aec)

結果として、基礎的なことを少しはやらないと理解できないことが多く、やりたいことは実現できなさそうだなということが実感できた。

## 機械学習に入門する

色々な入門方法があると思うが、自分が選んだのはCourseraの授業

[Machine Learning](https://www.coursera.org/learn/machine-learning)

話しているのは英語だが日本語字幕つきなので、授業を受けるだけなら英語力はあまりいらない。
クイズに答えたり課題を提出したりするには英文を読む必要があるけど、嫌ならスキップすればいい。
線形代数（行列）に関しては最初のほうに説明があるし、これとこれをかけたら出力の形はこうなるということがわかれば、課題の提出くらいはなんとかなった。
微分は自分でやる必要はないので、微分が傾きを計算するもので、なぜ傾きを計算したいのかを理解していれば問題ない。
感覚的にはライブラリ（線形代数や微分などの数学）の目的や使いどころは知っておくが、中身のコード（数式）は問題が発生するまでスルーというスタンス。

このコースで機械学習の概観はだいたい理解できてきた。
Courseraの授業で扱わなかったものも含むし、あまり綺麗な分類ではないし、分類にしてあるものも回帰に使えたりするが

- 教師なし学習
 - クラスタリング
     - k-means
 - 異常値検出
 - 次元削減・特徴抽出
     - 主成分分析
     - オートエンコーダー
- 教師あり学習
 - 回帰
     - 線形回帰
 - 分類
     - ロジスティック回帰
     - サポートベクターマシン
     - 多層ニューラルネットワーク
     - 深層畳み込みニューラルネットワーク
- 半教師あり学習
- 強化学習
- 逆強化学習
- 生成モデル

次にもっと詳しい機械学習の本を読んでみてもよかったのだが、インプットばかりではモチベーションが下がるし、網羅的にやっていてもキリがないのでディープラーニングで具体的に何か作ることにした。
あと、学問的には順を追って説明するのが正しいかもしれないけど、とりあえず何かしたい初心者としては既に克服された過去の失敗やほとんど使われない過去の手法よりも、汎用的で洗練された手法を試してみたいというのもある。怒られそうだけど。長期的には体系立てて整理して理解したほうが近道なのかもしれないけど、学生じゃないので目の前のことを優先しないといけない時もあるという言い訳……

## ディープラーニングの実行環境を構築する

ディープラーニングをやると決めても全部自分で実装するわけないので、フレームワークを選ばないといけない。とりあえずTensorflowかChainerが良さそうだなと思い、手元のMacBook AirでTensorflowの[チュートリアル](https://www.tensorflow.org/versions/master/tutorials/mnist/pros/index.html)を実行してみた。
そうすると時間がかかるしPCは熱いし他の作業はできないしと大変だったので、使ったこともないAWSに実行環境を移すことにした。ついでにTensorFlowが使いやすくなるライブラリも見つけたので使ってみた。

[skflowでMNIST（DCNN）](http://qiita.com/shngt/items/1bc8f8ff9c2a71e014f5)
[Keras（TensorFlowバックエンド）でMNIST（DCNN）](http://qiita.com/shngt/items/0d9a5ea47dddd97fcd27)

あと、機械学習を実行するにはデータの収集と前処理も必要なので、そのためのツールは自作した。
ここに関しては、最初から本格的に自作するよりは既にあるもので小さなモデルを実行してみるところから始めたほうがよかったかなと思う。
オープンデータは探せば色々ある。

[THE MNIST DATABASE of handwritten digits](http://yann.lecun.com/exdb/mnist/) - 手書き数字
[CIFAR-10 and CIFAR-100 datasets](https://www.cs.toronto.edu/~kriz/cifar.html) - 一般物体認識用画像データのサブセット
[Visual dictionary](http://groups.csail.mit.edu/vision/TinyImages/) - 一般物体認識用画像、CIFAR10・CIFAR100の元データ
[ImageNet](http://image-net.org) - ILSVCRという世界的なコンテストで使用される一般物体認識用画像
[VisualGenome](https://visualgenome.org/) - 画像と単語が結びついたデータベース
[kaggle](https://www.kaggle.com) - 賞金つきの機械学習コンペなどを実施。コンペを依頼した企業のデータがある
[List of datasets for machine learning research](https://en.wikipedia.org/wiki/List_of_datasets_for_machine_learning_research) - 研究用データのリスト（wikipedia）

## 今後について

とりあえずDCGANを使ってサービスを1つ形にするのが目標。
DCNNやDCGANは構築できるようになったので、簡単なモデルを使ってパラメータの与える影響を見てみたい。
kaggleにも少しずつ参加してみたいなと思う。

## これから機械学習を始める人へ

まだまだ初心者なので大したことは言えないが、数式使わなくても機械学習始められたので、本当にやる気はあるけど数学の勉強から始めないといけないと思って尻込みしているなら数学飛ばしてさっさと始めてしまえばいい。

あと、他人の言うことはあまり信用しなくていいと思う。機械学習というのはプログラミングと同じように適用範囲が広く、やりたいことによってどこから手をつけたらいいかはそれぞれかなと。人工知能やディープラーニングといったバズワードに惹かれてる人（自分も含め）ならディープラーニングから始めたらいい。
機械学習やるから言語はPythonという巷の風説だって、作りたいものがレコメンドエンジンでレスポンスも早くしたいなら、もしかするとJavaが適切かもしれない。SparkのMLlibで協調フィルタリングは作れるらしい。

以上、参考になれば