初心者
ML
機械学習

初めての深層学習ロードマップ [随時更新&文献追加 予定]

はじめに

先日、SEの友人と機会学習について話していて、「どういう風に機会学習を勉強していけば良いのかイマイチわからん」と言っていました。時間があればCourseraを取ればいいのでしょうが、ある程度高等数学も勉強した身だと、冗長過ぎるきらいがあるようです (マイペースで勉強できないというのも大きい)。

私自身、広範囲の機械学習のトピックについては勉強不足なので、今回は深層学習を全く知らない方が、どのように勉強していけば良いのかについてまとめることにしました。1から10まで示すことはしていませんが、キーワードを提示することで大まかなガイドラインを示すことにしました。

深層学習と機械学習の違いについて
一般的に、機械学習はデータセットに対して個別にアルゴリズムを設定する必要があります。一方深層学習では、コンピュータ自身が(画像や音声から)自ら特徴量を取り出し、学習を行います。大雑把に言えば、大量のデータを放り込むだけで全部やってくれます。ニューラルネットワークは機械学習のアルゴリズムの一種ですが、分野としては特に最近注目を浴びています。この記事でもこの定義を踏襲し、深層学習のみを扱うことにしました。

参考文献
- 今さら聞けないディープラーニングの基本、機械学習とは何が違うのか


☆どういう方向けか

  • 自分である程度文献は探せるし、勉強するモチベーションがある人
  • 予備知識として数学等いろいろ必要なのは知っているが、どの程度やればいいかわからない
  • 時間がなく、マイペースに行き当たりばったりやっていきたい人
  • とりあえず深層学習全体で勉強すべきことを知ったほうがモチベーションがあがる人
  • ニューラルネットワークを用いた深層学習に興味がある人 (よってSVM等は言及しない。)

☆本記事に関するいくつかの注意点

  • 有益な文献等を見つけたり、修正が必要なところが見つかり次第、積極的に更新する予定です。
  • この記事は手取り足取り解説するものではなく、町のガイドマップのような役目を担っています。実際に教材を見つけ、学習するのは各々の判断に任せています。
  • 基本的に簡単なコメントと、キーワードをまとめています。必要ならば文献も示しています(日本語の文献をメインに紹介しています)。(逐次追加予定)
  • 大まかな学習の順序を考慮した配列にしていますが、互いに関わり合う部分もあるので、必ずしも一直線になっていません。
  • ところどころ「〜しておけば十分」というような記述がありますが、それは「初心者の段階で」という意味であることに注意してください。もちろん、プロとして深層学習を扱うには、より深い数理的な部分についても理解する必要があります。逆に言えば、この記事の内容を全てやっていれば、コードで自分が何をやっているかが確実に分かるようになります。

・・・深層学習の勉強を始める前に、以下の点を心に留めておいてください。

☆深層学習を始める前に知っておいてほしいこと

  • 100%理解しようとしない!: 各テーマを100%理解する必要があるのは情報科学系を専門とする人たちです。
  • 自分が必要とする計算に対して、どのくらい投資すべきかよく考えること: GPUは本当に必要? (必要になってから投資!)
  • まだまだ発展途上の分野なので、わかっていないことが多いこと。 必要ならば原論文を当たる必要があり、どこかで納得しなければならない。(ガチ英語+数学が必要)
  • 裏を返せば、情報がすぐ古くなるため、参照する際にはいつのものか必ずチェックする必要がある。
  • 深層学習の計算がどのように行われているか、という根本的な部分についてはまだまだ解明されていないので、パラメータの選び方については運の要素が強い。(どうしてそのようにパラメータを選べばよい精度が得られるか十分説明できない。)

深層学習を学ぶモチベーションや、深層学習で得られた結果の解釈については以下の記事も参考になります。

参考文献
- 深層学習を一から学ぶときやってはいけないこと
- ディープラーニングの判断根拠を理解する手法

深層学習を試せるおすすめのサービス

深層学習を気軽に行うサービスとしてAWSやGoogle Cloud、Azure等あるようですが、個人的にはFloydhubをお勧めします。まだまだ情報は少ないですが、機械学習を行うまでのステップが圧倒的に楽です。

参考文献
- とりあえずFloydhubで遊んでみた
- GPUでディープラーニングやるならAWSよりFloydHub

2018/01/21: 最近 Google Colabというサービスが提供されているようです。詳しくは以下より

私も少し触ってみましたが、GPUが使えるだけあって、CIFAR-10も一瞬で計算が終わります。。。これはすごい!12時間以上かかるタスクはめったにないので、いろんなフレームワークを触って見る段階では、このサービスで十分な気がします。ぜひどうぞ!

深層学習に向けてのロードマップ

まず深層学習を行う上での大切な概念についてまとめます。必ずしも実装する上で必要はないかも知れませんが、あるのと無いのとではぜんぜん違うので、ちゃんと勉強しておくべきだと思います。(深層学習は、結果が正しいものかどうかを知るのが難しいので、背景知識が大切です。)

1. 予備知識

プログラミング環境、準備


深層学習は99%がPythonで書けると言っても過言ではないので、基本的なPythonを書けることは仮定します。Pythonの環境整備は以下から。

参考文献
- Pythonテキスト作りました
- Pythonでデータサイエンス Python のインストール

実際に深層学習を行われる際には、Jupyter環境下で試されることをおすすめします。

参考文献
- はじめるJupyter Notebook
- Pythonでデータサイエンス Jupyter Notebook を使ってみよう

また、ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 (斎藤 康毅著) は必携です。この本を読まずして、参照せずして人に質問してはいけません。またこの本を理解できないときは自分の数学の理解が乏しいか、深層学習に向いていないかのどちらかだと思ったほうが良いです。(質問するなという意味ではありません。)

深層学習はホットな話題だけあって、ネットで入門的な情報を容易に見つけることができますが、情報が断片的なので、こういった書籍を読んでから細部に踏み込んでいくことをおすすめします。(その中での情報の取捨選択や、モチベーションにこの記事が役に立つだろうと思います。)

数学


深層学習では、「線形代数」と「微積分」の理解が必要です。これら無しで理解することは可能ですが、中で何が起きているかわからずに実装することになります。私自身実装する際にいちいち意識しているわけではないですが、無いよりはあったほうが良いです。

理想としては、深層学習の本のおまけ的な内容よりは、薄めの線形代数の本で勉強して、実際に手で計算してみるのが良いと思います。実際に手で計算できる分野なので、できるに越したことはないです。

キーワード: 線形代数線形 (1次) 変換, 微分偏微分

参考文献
- 深層学習をこれから始める人の線形代数を学ぶモチベーション
- 入門線形代数 三宅 敏恒著
- 【プログラマーのための数学】目次 - 深層学習のために

上では「入門線形代数」を挙げておきます。書籍の後半部は固有値について扱っていますが、必要ないので要りません。はじめの数章の行列計算ができるようになれば大丈夫だと思いますよ。

ネットワーク


具体的に実装していく上で、ネットワークが頭にイメージできないようでは何もできません。ニューラルネットワークの基本的な用語については知っておくべきでしょう。

キーワード: ニューラルネットワーク入力層隠れ層出力層重みバイアスパーセプトロン論理回路(XOR, AND)

注意
- パーセプトロンの論理回路については、「なぜ線形活性化関数ではなく、非線形の活性化関数を使う必要があるのか」がわかる程度で良いと思います。
- 重みやバイアスについては、上で学んだ数学としての線形代数に意味づけする程度でいいと思います(「あのときの線形代数でやったのは、こういう風に役立つのか〜!」となれば十分)。ニューラルネットワークとか関係なく計算できるようになれば、特にこのために線形代数を理解し直す必要はないです。

参考文献
- ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- Neural Network Tensorflow入門講座 : PDFファイル

深層学習とは


以上の予備知識を踏まえて、深層学習とはどういうことをするのかについて学ぶと良いと思います。大別して、線形回帰問題と、分類問題があります。それぞれのタスクに応じて損失関数も選ぶ必要がありますし、自分がやりたいことがどちらに属するかを考える必要があります。

一番最後に言及していますが、深層学習で画像・文字列を生成することもできます。これらのタスクは複雑なネットワークを扱うので、分類問題・単回帰解析等のチュートリアルに飽きたら取り組まれることをおすすめします。

キーワード: 線形回帰分類問題, etc...

参考文献
- 深層学習って何ですか?
- 画像や映像を自動でタグ付けするAIサービス Clarifaiを触ってみた
- ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

Clarifaiは典型的な深層学習を用いた画像分類サービスです。分類問題がどういうものかを知るには面白いサービスなので、一度使ってみることをおすすめします。

2. ネットワークを組む

予備知識を身に着けたら、実際に計算させる上で必要となる知識について学びます。これらは実装する上で無くてはならないもので、避けては通れません。

ライブラリを選ぶ


実際に深層学習を行う際には、イチから全部自分で実装する必要はありません。GoogleからはTensorflowという深層学習向けのライブラリが提供されていますし、その他にもKeras, CNTK, Chainer, tflearn等が使えます。

最初の学習段階ではシンプルな学習モデルしか使わないと思うので、実装は比較的簡単に (Tensorflowで) できると思いますが、CNN等を使うようになってくると面倒になってきます。その場合、Kerasやtflearnといったライブラリを使うと、とても簡単に実装できます。一方、簡単に書けるということは、裏返して言うとブラックボックス化されているところがあるということなので、まだ深層学習に触れたばかりの段階ではTensorflowで組んでみることをおすすめします。

2017年11月9日 Theanoはすでに開発停止になっているのでご注意ください。
キーワード: Tensorflow, Keras, tflearn, Chainer, CNTK

参考文献
- DeepLearning系ライブラリ、Kerasがあまりにも便利だったので使い方メモ
- Chainerで始めるニューラルネットワーク
- MicrosoftのDeep Learningライブラリ「CNTK」チュートリアル
- 【Chainer、Keras、TensorFlow】ディープラーニングのフレームワークの利点・欠点
- 各深層学習ライブラリの比較をまとめる : 情報が古い可能性があるので要注意

Tensorflowの後、どのライブラリを使うかは初心者にとって大きな悩みですが、私はKerasをおすすめします。理由としては、とても簡単に実装できるからというのが一つ。あとはTensorflowやCNTKをバックエンドで実行できるので、どちらかを知っていれば混ぜて実装できるからです。
確かにChainerだと日本語の文献が見つかりますが、GithubではKerasで書かれたコードのほうが多いと思います。またtflearnはKerasとほとんど同じと言っても過言ではないので、Kerasさえできるようにしておけば、深層学習の題材はたくさん見つかるので良いと思います。(トラブルも圧倒的に解決しやすい。)

なお、私はまだそれほど触れていないのですが、日本の会社 Preferred Networkによって開発された、Chainerは日本でポプテピピックポピュラーなようです。これについてのチュートリアルは以下参照ください(わかりやすかった)。

活性化関数


データを層の間を通すとき、非線形活性化関数を使います。その活性化関数のそれぞれの関数としての特徴を理解しておくことが必要です。上の予備知識では線形代数の理解は、そのネットワークの背景で起こっていることを理解するために必要で、実際に実装するときは必要なかったですが、活性化関数を間違えると、ほしい精度が得られないことが多々あります。ネットワーク毎にどういう活性化関数を選ぶか考える必要があるので、このステージは重要です。

キーワード: 線形活性化関数非線形活性化関数ReLUSigmoidtanh、etc...

参考文献
- 活性化関数のまとめ(ステップ、シグモイド、ReLU、ソフトマックス、恒等関数)

最適化法


深層学習では、大量の入力データを計算させつつ、その誤差が小さいものになるように最適化します。その際、どのような損失関数や最適化法を使うかは、全く自由で、我々が選ぶ必要があります。全部を学ぶことは必要ないですが、それぞれの最適化法の特徴を抑えておくことは必要です。(最近でも新しい最適化法が考案されているようなので、必要な最適化法はその時々で参照すればいいと思います。

誤差逆伝播法についても勉強する必要はありますが、これはあくまでも理屈でしか無いので、必要に応じてやればいいと思います。

キーワード: 最適化法AdamAdagradAdamaxSGD損失関数MSE, 交差エントロピー, etc...

参考文献
- AdaGrad, RMSProp, AdaDelta, Adam, SMORMS3
- 勾配降下法の最適化アルゴリズムを概観する

ネットワーク構造


どうやって計算させるかというのは、最適化法や誤差関数を指定することで決められますが、ネットワークの構造の決定については別途必要になる知識です。たとえば、画像は2次元の情報を持つので、画像を学習させるときはCNN (Convolutional Neural Network)を使う必要があるとか、文字列を扱うときは記憶させた情報をもとに学習させたり、文字列を生成させるために、RNN (Recurrent Neural Network) とかLSTM (Long Short-term Memory) を実装する必要があります。

これらはネットワーク構造としてある程度型が決まっているので、深層学習のタスクが決まれば自然に決まってきます。

キーワード: 全結合層, 畳み込み層 (CNN), Recurrent Neural Network, LSTM, etc...

参考文献
- ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- Convolutional Neural Networkとは何なのか
- LSTMネットワークの概要
- わかるLSTM ~ 最近の動向と共に
- The Neural Network Zoo -> 全結合層や、CNN, RNNにとどまらない、より発展的なネットワーク構造のまとめ

学習モデル


実際に深層学習を行うには、自分でデータを揃える必要があります。これをデータセットと言います。もちろん初めて行う際にデータセットの作成から行うのは酷なので、すでに使いやすいデータセットが提供されています。MNISTというもので、手書きの0から9までの画像6万枚が、データセットとしてあります。これを学習させれば、どの程度の割合で数字を分類できるかが分かります。TensorflowのチュートリアルページからMNISTチュートリアルが提供されているのでどうぞ。MNISTは2.0GHzほどのPCなら実行できるのでおすすめです。

もう一つはCIFAR-10です。これは6万枚の32x32画像を学習させ、10個のラベルに分類させるタスクです。画像を扱うのでパワーが無いと計算は出来ないのですが、非常に面白い問題です。こちらは比較的ヘビーな計算を行うので、GPUがあればなお良しです。上で紹介したサービスを利用して、実行してみてください。

他にも探せばデータセットが見つかります。たとえばMNISTと同じ形式のデータセットで、Fashion-MNISTがあります。

キーワード: データセット, MNIST, CIFAR-10, Fashion-MNIST

参考文献
- 【入門者向け解説】TensorFlowチュートリアルMNIST(初心者向け)
- MNIST For ML Beginners
- 人工知能に関する断創録 CIFAR-10
- Tensorflowを2ヶ月触ったので"手書きひらがな"の識別95.04%で畳み込みニューラルネットワークをわかりやすく解説
- Keras データセット

CIFAR-10については、私がKerasを用いたCIFAR-10チュートリアルを書いているので、ぜひやってみてください。

3.学習させる

以下は、エラーを出さずに (望んだものか否かを問わず) 結果を得たときに、考慮すべき事柄になっています。つまりその結果をより精度の高い (もしくは損失関数の値の小さい) ものにしていくかに注力していくことになります。

ハイパーパラメータ


深層学習で一番難しいのはハイパーパラメータの設定です。ハイパーパラメータとは、「人間が学習前に設定すべきパラメータの総称」です。たとえば最適化法で言えば「学習率」とかがそれに当たります。以下で述べるDropoutの割合もハイパーパラメータです。これについては「こうなったらこうすべき」という方法はないので、ランダムサーチをしたり、グリッドサーチをして一番良い結果を与えるハイパーパラメータの組を探してやる必要があります。

キーワード: ハイパーパラメータランダムサーチグリッドサーチ過学習, etc...

参考文献
- 深層学習 : ハイパーパラメータの設定に迷っている人へ
- ハイパーパラメータ自動調整いろいろ

過学習


過学習というのは、必要以上に学習データにフィッティングした状態を言います。以下は2次関数へのフィッティングですが、$M=9$ では過学習が起きていますね。($M$は近似させる関数の次数)

Screen Shot 2017-08-17 at 02.06.02.png

過学習を見るためには、入力データとして与えるデータを3つに分けます。
- 訓練データ
- validaton data
- test data
訓練データは学習させるもので、validation dataは、訓練データの何割かを与えるもので、過学習を見るためのデータです。test dataは、最終的な学習の後、その結果が汎化可能かを見るためのものです。

Screen Shot 2017-08-17 at 02.11.01.png

上の図では、'undertraining'の領域では訓練不足、'overtraining'では過学習が起きていることを示しています。よってこの間の領域、validation setに対する損失関数が最小になるところで学習を止める必要があります。

このような理屈を踏まえて、過学習を防ぐための手法がいくつか必要になります。

キーワード: validation dataDropoutRegularlizer, 汎化可能、etc...

参考文献
- 過学習を防ぐ正則化
- 「そのモデルの精度、高過ぎませんか?」過学習・汎化性能・交差検証のはなし

4. 発展的な話題

深層学習には単回帰解析と、分類問題があると書きましたが、実際には画像のノイズ処理や、画像の生成等も可能です。これらについても調べてみると面白いと思います。

また、すでに学習させたモデルを用いて、他の問題にその結果を用いることができます。これを転移学習と言います。たとえば、ImageNetというデータセットでは普通のコンピュータでは計算するのに非常に時間がかかります。

このデータセットは14,197,122枚の画像に、21841個だけカテゴリー分けされています(2017/08/25現在)。

より小さい分類問題を計算させる際には、このデータセットを学習させた後の重みやバイアスを利用して、計算させることができます。Kerasの場合には、こちらをどうぞ。このような発展的な話題についても学ぶと面白いと思います。

キーワード: GAN (Generative Adversarial Networks ), Restricted Boltzmann Machine, Variational Autoencoders, 転移学習 etc...

参考文献
- Variational Autoencoders徹底解説
- RBMから考えるDeep Learning ~黒魔術を添えて~
- 少ない画像から画像分類を学習させる方法(kerasで転移学習:fine tuning)

おわりに

基本的に以上の事柄を知っておけば、深層学習を実際に実装する段階にあると思います。実際に深層学習を行う際は3でパラメータの調整が非常に重要になってきます。いかに精度の高いパラメータの組を見つけるかが肝です。

以上のことをすらすらできるようになったならば、深層学習の初歩は卒業していると考えて良いです。次はDeep Learning (Adaptive Computation and Machine Learning series)に進んで、より深層学習の数理的な背景について勉強していくことになります。

また本記事では扱いませんでしたが、このようなニューラルネットワークを用いた深層学習(深層学習)以外にもアルゴリズムが存在します。この領域については個人的に勉強不足なので、参考となるリンクを挙げておくに留めます。

参考文献
- 代表的な深層学習手法一覧

最後に、本記事では勉強の道しるべ的な役割を担いましたが、より広範囲の深層学習全般に関するキーワード等のまとめ記事として、以下のものがオススメです。範囲が広すぎて圧倒されますが、参考になるかと思います。

参考文献
- 深層学習いろいろ

また、強化学習というものも知られています。これについてはまだまだ勉強不足なのでおいおい...

参考文献

-Kerasで最短で強化学習(reinforcement learning)する with OpenAI Gym

さらに先にすすめるために...

深層学習の可能性はとんでもないものがあります。Qiitaの深層学習や機械学習のタグ等をフォローし、アンテナを張っていてください。可能であれば、あなたのアイデアを実行し、それをQiitaに投稿してみてください。

おまけ: 大学のカリキュラム

以下では私がRWTH Aachen工科大学で学んだ深層学習のカリキュラムについてまとめておきます。

講義名: Deep Learning in Physics Research at RWTH Aachen University

1.Fundamentals of deep learning

深層学習と深層学習について。A Neural Network Playground - TensorFlowを利用して、活性化関数の特徴について学んだ。

2.Regularization & generalization

Tensorflowの単回帰解析の例を用いて、過学習とは何かについて学んだ。

3.Optimization & hyperparameter tuning

過学習の防ぎ方について学び、グリッドサーチやランダムサーチを通して、最適なハイパーパラメータの組の見つけ方を学んだ。

4.Convolutional neural networks

CIFAR-10を用いて、画像の分類問題について学んだ。この回の内容については、記事にしてあるのでどうぞ -> Kerasを用いたCIFAR-10チュートリアル

5.Classification of magnetic phases

物理学への応用例第一弾: 磁性体の分類について扱った。磁化されているかされていないかを白黒で区別し、その画像を深層学習を行うことで分類させた。

6.Advanced computer vision methods

発展的な話題として転移学習等を学んだ。

7.Application in astroparticle physics

物理学への応用例第二弾: ネットワークを途中で分岐させ、異なる結果を得、考察した。入力データもばらつきがあるので、バイアスの初期値には差をつける必要があった。

8.Autoencoders & application in solid state physics

物理学への応用例第三弾: 宇宙線を検出したとき、その画像のノイズを取り除く方法について学んだ。(Autoencoder)

9.Variational Autoencoders & Generative Adversarial Networks

GANを用いて、MNISTを例として、入力データと似た画像を生成した。(教師なし学習)

10.Restricted Boltzmann machines

RBMを用いて、MNISTを例として、入力データと似た画像を生成した。(教師なし学習)

11.Recurrent networks

三角関数や、二進数から算術計算を行った(理解できていない)。

12.Text processing with recurrent networks

arXivからタイトルやアブストを取得し、それらから新しいタイトル・アブストを生成した。(LSTM)