「実装ディープラーニング」を読んだ

f:id:asmsuechan:20190512142711p:plain

本の情報

項目 情報
ページ数 265P(巻末の付録を抜くと209P)
章数 全6章
著者 藤田一弥さん

全体的な感想

シンプルに分かりやすくまとまっているとてもいい本です。ディープラーニング一冊目に最適だと思います。コードに関してはあまり込み入った解説はないのでザッと1周写経して流れを掴むのがよさげです。

こんな人が読むと良さそう

手を動かしてディープラーニングを使ったスクリプトの実装を身に着けたい人におすすめです。ただし書籍内の環境以外では動かないことが結構あるので本当に同じように動かしてみたい時はバージョンをしっかり揃えたほうが良さそうです。

この本のスクリプトを動かすにはGPU動かせるマシンが必要になります。私はGPUマシンを持っていないのでAWSGPUインスタンス(g3.sxlarge)を使いました。

この本を買った理由

研究の引き継ぎをしていて、先輩が「これ読んで強化学習学んだ」と言っていたためです。

自分の開発経験

ディープラーニングに関しては完全に初めてですが、機械学習は少し分かるといった程度です。 ニューラルネットワークに関する知識も多少あります。

1章

この本全体の流れの紹介とUbuntuのインストールを含めた環境構築手順が紹介されています。

この本では強化学習を使った画像認識を行っていきます。具体的にはCaltech 101データセットを使って画像の6クラス分類を行います(第4章)。

上にも書いたように私はEC2のGPUインスタンス上に環境を構築したのでOSはUbuntu 16.04で1GPU, 4vCPU, 30.5GB RAM, $1.04/h(ap-northeast-1) って感じのスペックです。

ミドルウェアのインストールにも触れられていたのですが、私はLambda Stackを使って環境構築しました。楽ですね。

LAMBDA_REPO=$(mktemp) && \
wget -O${LAMBDA_REPO} https://lambdalabs.com/static/misc/lambda-stack-repo.deb && \
sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
sudo apt-get update && sudo apt-get install -y lambda-stack-cuda

CUDA/cuDNNについて簡単に説明します。

(1) CUDA (Compute Unified Devicev Architecture)

NVIDIAが開発しているGPU演算を使えるようにするツールです。ディープラーニングだけではなくてGPUを使う処理一般で必要になります。

(2) cuDNN (CUDA Deep Neural Network library)

NVIDAが開発しているディープラーニング用のライブラリです。諸々の最適化のおかげでcuDNNを使うと早くなるそうです。

2章

この章ではニューラルネットワークの基礎が説明されています。

畳み込みニューラルネットワーク(CNN)

畳み込みニューラルネットワーク入力層、畳み込み層、プーリング層、全結合層、出力層から構成されています。

こちらも参考にしました。

ml4a.github.io

畳み込み層

畳み込み層は入力データに対してスライドしながらフィルターをかけることで、画像のどこに特徴が存在するかを示す特徴マップを抽出します。畳み込み処理を行うと入力データより小さい特徴マップが作成されますが、ここで同じ大きさにしたい場合はパディングを入力データに追加してフィルターを書けます。また、逆により小さい特徴マップが欲しい場合はスライドさせる量(ストライド)を大きくすることで小さい特徴マップが作成されます。

プーリング層

プーリング層は特徴マップのある領域の代表値を抽出するものです。使われる代表値には最大値や平均値などがありますが画像認識では最大値を一般的に使います。

3章 基本用語

ディープラーニングでの学習では、予測された値と教師データとの誤差を損失関数を使ってこの誤差を最小化するようにしていきます。

例えば10000行のデータを100行ずつ100回の学習に分ける時この学習方法をミニバッチ学習といい、一回の学習で学習する量(ここでは100行)をバッチサイズといい、一回の学習をエポックといいます。

分類問題で使う全結合ニューラルネットワークでは最終的な出力を出すのに活性化関数を通します。損失関数には二乗誤差、クロスエントロピー、二値クロスエントロピーなどがあって4章の画像分類ではクロスエントロピーを利用します。クラ分類ではソフトマックス関数を使うことで0-1の範囲で表される確率の形になります。

確率的勾配降下法(SGD)

1層の全結合ニューラルネットワークにおいて誤差の和が最小になるように重みを更新していきます。例題があって分かりやすいです。

4章

4章では実際にPythonディープラーニングを使った画像分類のスクリプトを書いていきます。環境構築から画像へ対する前処理をした後にKerasでニューラルネットを学習させていきます。前処理しながら思ったんですが、画像の分類ってやること多いですね。

9層のネットワークでの学習

9章のネットワークをkerasで構築します。

学習の様子です。 f:id:asmsuechan:20190514180803p:plain

推測の様子です。 f:id:asmsuechan:20190514181940p:plain

16層の学習済みモデルでの学習

2014年のILVSRCで2位になった出力が1000クラスの16層のニューラルネットを使って6クラスの出力を得られるニューラルネット再学習(Fine Tuning)します。9層と違って畳み込み層とプーリング層が増えてるみたいです。

6章 強化学習

強化学習はもともとは心理学の言葉で、ラットなどの実験用動物にある動作を覚えさせたい時(たとえば、ボタンを押したら餌が出てくるなど)に期待した動作をすれば報酬がもらえるという学習です。これを機械学習に応用して報酬と罰により適切な行動を学習するものです。

Q学習

強化学習を実現する手段の1つがQ学習で、Q値と呼ばれる値を使って報酬を得ながら報酬が大きくなる方向に進み、かつその報酬を使って以前使ったQ値を更新していくことでより良い行動を学習するものです。

DQN

複雑な問題に対してQ学習を適用するためにディープラーニングを使うモデルがDQN(Deep Q-Network)です。

DQNの実装の登場人物は (1) Environment, (2) RL_Glue, (3) Experiment, (4) Agent の4人です。Environmentが学習が行われる環境で、Agentがその中で学習を行うプログラムです。そしてExperimentは勝ち負けの判定や学習の開始や終了を判断する審判のような役割です。そして最後にRL_Glueがこれら3つをつなぎ合わせるためのglue(のり)です。

で、6章も動かそうとしたのですがRL-Glueのコードが、死亡したGoogleCodeにホストされてた上にGitHubなどへのマイグレーションがされてなくてダウンロードできなくて断念しました(どっかにはあるんでしょうけど)。

感想

一番読んでいて楽しかったのは6章でした。2, 3, 6章は繰り返し読もうと思います。