素人がCaffeを使ってDeepLearningしてみた(概要編)

#はじめに
この記事は
1. Deep Learningって何？を説明する 概要編(この投稿)
2. Deep Learningライブラリの一つであるCaffeのインストールする [導入編](http://qiita.com/yuishihara/items/1dfa2eed5261104381a7)
3. Caffeを使って簡単な学習をさせてみる [実践編](http://qiita.com/yuishihara/items/3f0adf0877cd8fe1c394)
の三本構成になっています

タイトルにもありますが、Deep Learningの研究者でもなんでもない素人が残した記録程度の投稿なので、間違った記述があるかもしれない点はご容赦いただき、読んでいただくようお願いします
(もしおかしい点があればコメントで指摘していただけると嬉しいです)

#そもそもDeep Learningってなんですか？
すごくざっくり言ってしまうと、いろいろな見方はありますが、Deep Learningは機械学習の一種として知られるNeural Networkをびっくりするほど多層(Deep)にし、それまでの常識ではありえないくらいの大量のデータ(画像とか音声とか)を使って、そのデータに含まれる特徴や意味などの高次の概念を学習することを可能にする機械学習手法の一つです


#なんでDeep Learningが注目されているのか
Deep Learningは2006年にカナダ、トロント大のGeoffrey Hintonらによって発表された[論文](http://www.cs.toronto.edu/~fritz/absps/ncfast.pdf)に端を発して、2010年前後に画像認識の[有名なコンペティション](http://www.image-net.org/)で、年に1-2%性能が改善する程度の緩やかな進化だったところに、2位以下に10%以上の圧倒的な認識性能の差をつけて優勝したことで注目されるようになりました

最近では、Googleが[コンピュータが猫を認識できるようになった](https://googleblog.blogspot.jp/2012/06/using-large-scale-brain-simulations-for.html)と言ったり、UC BerkleyのチームがDeep Learningを使ってロボットが簡単なタスクを自動でできるよう学習したと言った報告がなされたりしています
[![UC Berkley BRETT](http://img.youtube.com/vi/JeVppkoloXs/0.jpg)](https://www.youtube.com/watch?v=JeVppkoloXs)

このように、ロボットなどの学習にも応用され、非常に性能が高いことや、これまで人間が設計していた画像の特徴量などの職人技的な部分を自動で機械が学習できるため、汎用性が高いことから注目され、世界中で研究が進められるようになってきています

#CaffeでDeep Learningはじめるために知っておくべき3点
当然いろいろ理解するにこしたことは無いですが(自分もまだ全然)、ここではとりあえず素人がDeep Learningはじめるぜ！となる前に、知っておきたい知識を3つだけ簡単に書きます
##Neural Network
Deep LearningはNeural Networkの一種です。なので、Neural Networkについて知っておく必要があります。
それではNeural Networkとは一体なんでしょうか？

Neural Networkは脳内のニューロンが行っている電気信号のやりとりを単純化したモデルです

Neural Networkでは、ニューロンを、入力に対して重みを掛けたものが一定のしきい値を超えたら、信号を出すものとしてモデル化し、それを複数用意してつなげます


>![Neural Network Image](https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Colored_neural_network.svg/300px-Colored_neural_network.svg.png)
>[Wikipedia](https://en.wikipedia.org/wiki/Artificial_neural_network)より引用

この例では、Inputに3つ、Hiddenに4つ、Outputに2つのニューロンが有り、InputはHiddenに、HiddenはOutputに一方向につながっています(相互につながるNeural Networkもありますが、説明しません)
さらに図には書いていないですが、上の重みは各矢印にあると思ってください。
そして、次のようなことをします。

1. Inputの各ニューロンに出力値(数値)を与える
2. InputとHiddenの各矢印ごとに、入力*矢印の重みを計算してつながっているHiddenのニューロンに与える
3. Hiddenの各ニューロンは2.で入力された数値の和にバイアス値と呼ばれるゲタを足して、しきい値を超えていたら出力する
4. InputをHidden、HiddenをOutputに読み替えて2,3をする
5. Outputの出力を得る

数式の詳細は省きますが、これらは行列演算として最終的には表現されて計算していきます。とりあえず、各ニューロンは他のニューロンからの入力を受けて、それが一定以上だった次のニューロンに出力するというイメージを持てればいいかと思います。こうすることで脳内を次から次へと伝搬する電気信号のやりとりをモデル化できました

Deep Learningでは、これをInput→Hidden→Hidden→・・・(たくさん)・・・→Hidden→Outputとなるように、層を増やし(深く＝Deep)ます

そして、たとえばInputに画像、つまり各Pixelの値を入れて、画像が猫だったらOutputの一番上のニューロンが1、それ以外は0となるように、重みの値を調整していきます。これがNeural Networkでの学習になります
すると、(うまくいけば)猫だったらこのニューロンが発火、人間だったらこれが発火というように、入力画像に応じてOutputが反応するようになり、Networkが画像から上位概念の猫や人間といったものを認識できるようになっていきます

##GPU
Neural Networkは結局のところ行列演算を繰り返して学習が進みます
当然、その計算はコンピュータを使ってするのですが、Deep Learningでは、Deepという名がつく通り、その行列演算が学習に際し大量に走ります。計算に時間がかかると、学習結果を得るのが何日も後とかいうことになりかねず、それでは困ります

そこでGPUを使います。GPUはもともとCPUではとてもできないような、グラフィックスの処理を高速にするためのものですが、GPUはCPU以上にたくさんのコアが載っていて、何千というスレッドをつくって同時並行的に同じ処理をひたすらやるのが得意という特徴があります。一方、行列演算は行と列同士の和や積を繰り返しますが、それらは、それぞれ独立に計算することが可能(行1と列1の掛け算を待ってからでないと行2と列2の計算ができないということはない)なので、GPUでの処理にすごく向いています。
CPUではなくGPUを使えば、最終的な学習に必要な時間が短縮されるので、Deep Learning界隈では計算にGPUを使うことが非常に多く、後述するライブラリでもGPUを使うことが推奨されています

特に、nVidiaが出している[CUDA](http://www.nvidia.com/object/cuda_home_new.html)というGPUを使うためのライブラリがよく使われています
CUDA対応のGPUかどうかはnVidiaのチップが載ったグラフィックカードの説明書に書かれているので確認してみてください
[CUDA対応チップ一覧](http://www.nvidia.co.jp/object/cuda_learn_products_jp_old.html)
(そもそもnVidiaじゃない…という場合はすみません。CUDA対応グラフィックカードは安いものだと2万円前後から買えますので是非！)

ちなみにそんなGPUもってません！買う予定もありません！という方も、後述するCaffeはCPUを使っても学習を(遅くはなるけど)走らせられます
また、小さいデータであればCPUでも数十秒〜数分で学習はおわります

とりあえず、Deep LearningではGPUを使うと、CPUより学習が早く終わるとおぼえておいて頂ければいいかと思います

##Deep Learningライブラリ
Deep Leaningを始めるにあたり、一からコーディングをして、Neuronをモデル化したり、学習の仕組みを構築することもできますが、Deep Learningには、学習を容易にできるようにするための便利なライブラリが多数公開されています
ここでは、その中のライブラリの一つであるCaffeを使ってDeep Learningをしていきます

Caffe以外にも、[Theano](http://deeplearning.net/software/theano/)や[Torch](http://torch.ch/)などのライブラリがあります

明確な理由は無いですが、Theanoよりも簡単(らしい)という情報と、ライブラリはC++で書かれていて、Pythonから使えるため、プログラミング言語的に学習の敷居が低そうだったので、ここではCaffeで進めます

言いたいのは、ライブラリがあるので知識なくてもなんとなくできてしまうということです

#さいごに
これでDeep Learningを始める準備がととのいました
次の記事ではUbuntu上でのCaffeのインストール手順について説明したいと思います

#参考資料
[Deep Learning](http://deeplearning.net/reading-list/tutorials/)
[Caffe](http://caffe.berkeleyvision.org/)
[奈良先端大のDeep Learning講義の動画(英語)](https://www.youtube.com/watch?v=DLItuVVKJOw&list=PL-GM1TDq4tIqFDyqZkHzyeEU1_Hka7t-1)
[CUDAプログラミング入門](https://www.youtube.com/watch?v=dnuACytuVsU)