アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

書籍『Tensorflowで学ぶディープラーニング入門』の内容まとめ(2章〜5章)#多層ニューラルネットワーク(CNN)で何ができるようになるか

前記事の続きです。この記事では書籍『Tensorflowで学ぶディープラーニング入門』の2〜5章を学んで、Tensorflowで何ができるようになるかをまとめています。

あくまで学習メモですが、この書籍を通してTensorflowがどこまで学べるかの参考にしてもらえればと思います。

前置については前記事をご覧ください。2〜5章は多層ニューラルネットワーク(CNN)の全体像を理解し、CNNをコードで実装できるようになる内容です。

この書籍ではMNISTという画像のデータセットを用いて、CNNを実装していきながら全体像を理解する構成になっています。この記事では2〜5章でCNNの理解を通し、「何ができるようになるのか」を淡々と書いていきます。

あくまで学習メモですので、専門用語が出てきますが、なるべくわかりやすく書いたつもりです。




機械学習の基本アルゴリズムの実装
機械学習では
・教師ありアルゴリズム
・教師なしアルゴリズム

に大きく分かれます(正確には強化学習アルゴリズムもあり)。ディープラーニングを扱うTensorflowは「教師ありアルゴリズム」が対象になります。

1章のまとめ記事でみたように「教師ありデータアルゴリズム」の基本的なステップは
①与えられたデータを元にして、未知のデータを予測する数式を立てる
②2乗誤差関数(損失関数)を求める
③勾配降下法を使って2乗誤差関数を最小にする

の3つです。『Tensorflowではじめるディープラーニング入門』ではTensorflowを学べるので、このアルゴリズムをコードで実際に実装することが可能になります。





多層ニューラルネットワーク(CNN)の実装
ディープラーニングのほんどのモデルはCNNです。他にもRNNやLSTMなどがありますが、ディープラーニングでは圧倒的にCNNが主流です。

f:id:trafalbad:20170320124339j:plain
CNNの全体図

CNNを構成する
・ソフトマックス関数
ドロップアウト
・全結合層
・プーリング層
・畳み込みフィルター

をコードにより実装することが可能になります。Tensorflowでは各層やフィルターの役割を果たす関数が用意されています。それらは独立して紹介されていますが、それらを実際に組み合わせることでCNNを構成することができます。

機械学習の基本アルゴリズムと組み合わせて回帰問題や分類問題に対処できるようになりました。これで単純な話、ディープラーニングをコードで実装できる。

*CNNを用いて分類問題を試せる
この本ではMNISTを使ったデータセットを使ってCNNを実装し、学習させますが、自分でオリジナルの分類問題を作ってCNNを試すことができます。
主に乱数表示させたガンの罹患患者(○)と非罹患患者(×)の分類表を作り、CNNを使ってこれらを正確に分類させることができます。もちろん実際のデータではないので、一般的な汎用力はつきませんが、実際のデータを入れて本格的な機械学習の問題に対処できるやり方が身につきます。




ロジスティック回帰のアルゴリズムが実装できる
ロジスティック回帰で使う数式は「最尤推定法」という統計学では有名な方法で、「与えられたデータが正しい確率を最大化」します。

機械学習では基本的なアルゴリズムである「損失関数から勾配降下法」という流れは同じです。しかし確率問題に帰着させるロジスティック回帰では最尤推定法の計算式が必要になります。


ディープラーニングでもソフトマックス関数を使って同じ計算式を使うので、ディープラーニングアルゴリズムを実装する上でも必須です。

ソフトマックス関数だけでなく、最尤推定法にのっとった数式をコードで表現するテクニックが身につきます。




オーバーフィッティング防止テクニック
ディープラーニングの目的は本来、未知のデータに対応できる力(汎用力)をコンピュータに身につけさせるためです。しかし、トレーニングセットのデータにだけ慣れすぎてしまい、汎用力が身につかないことがあります。これを「オーバーフィッティング」といいます。

これを防止する方法として、
・ゼロワン誤差計量を用いた判別法


が紹介されており、このテクニックが身につきます。実際にコードで実装しているので、どのようにすればいいかもわかりやすいはずです。
他にオーバーフィッティングを防止する方法として
・クロスバリデーション(交差検証)
・正規化項の追加
がありますが、これは紹介されていません。




ミニバッチ学習と確率的勾配降下法
与えられたデータセットかとてつもなくデカイ場合、普通の勾配降下法では時間がかかりすぎてしまいます。それを防ぎ、時間を短縮する方法として、データセットの一部を取り出して勾配降下法までを実装し、全体の近似とみなす「ミニバッチ学習」があります。
f:id:trafalbad:20170320124607j:plain



ミニバッチ学習では例えば60000万枚の画像から、2000枚を取り出し一回式にかけ、最適値を求めます。そしてまた2000枚で同じことをし、全体で30回、最適化アルゴリズムにかけることを繰り返します。これにより本来60000枚全てを一回アルゴリズムにかけ最適値を求め、それを何回も繰り返す必要がなくなりました。

全データを一回式にしてかけるだけで済むので大幅な時間短縮になります。



その際、勾配降下法は「確率的勾配降下法」と呼ばれるものになります。このミニバッチ学習と勾配降下法のテクニックが身につきます。

f:id:trafalbad:20170320124552j:plain





プーリング層と畳み込みフィルターによるCNNの精度の向上

CNNを構成するプーリング層と畳み込みフィルターは、それらをどのように組み合わせるかで、CNNの精度が変わります。精度が向上するということは、テストセットに対するトレーニングセットの正解率が高まるということ。

プーリング層では画像などのデータの特徴的な性質(特徴変数)を抽出し、畳み込みフィルターで特徴変数を分類する役割を持ちます。

プーリング層と畳み込みフィルターを組み合わせることで、MNISTデータセットでは97%の正解率を達成しています。




Tensorflowで学ぶディープラーニング入門で習得できるテクニックはこんなところです。もっと書籍を細部まで噛み砕けば、別なテクニックも見つかるかもしれませんが一通り学んだ上でできることはこんなところです。

Tensorflowのチュートリアル5以降はもっと別の書籍やサイトで勉強する必要があります。またここで紹介したCNNは最も基本的なものであり、正規層などを組み込んだもうちょっと発展的なCNNもあります。

関連記事はこちら

trafalbad.hatenadiary.jp



trafalbad.hatenadiary.jp

広告を非表示にする