世界を目指すIT少年の学習記録

世界を股にかけITを武器に暮らしていく!ことを目指す少年の備忘録。本のレビュー、勉強したこと、学んだことなどを記録していきます。

Deep Learningの基礎を概観しました@ UdacityのDeep learning nanodegree foundation

 

最近Udacity のDeep learning の一連の講座を卒業したので、その概観の紹介。

そして、理解したこと、まだ理解していないことを自分のために書きます。

そこ違うよ、これ参考になるよとかあれば教えてください!

 

 

目次

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

※注 本職はウェブマーケターです(広告、SNSSEO、ASOなど)何か良い案件(副業など)あれば随時ご相談下さい笑 連絡先はプロフィール

データサイエンスは趣味&将来への投資です。Pythonでのウェブアプリ開発とかも少しできるので、他にも何か面白いことあればいつでも紹介してください。基本乗ります。

 

そもそもUdacity とは?

 インターネット上でオープンかつ(ほとんど)フリーのオンライン大学の総称である、Massive Open Online Corses 通称MOOCsの一つです。

他に有名どことしては、edX, Courseraがありますが、Udacityは人工知能の世界的権威の1人であるSebastian Theran が作ったこともあり、データサイエンス系やcomputer scienceが充実しているのが特徴です。

 

UdacityのDeep learning nanodegree foundation とは

このUdacity はひとつ特徴があります。それはNanodegree というもので、企業などとコラボしてオンラインで取れる学位(みたいなもの)を取得できる一連のプログラムです。

例えばMachine learning nanodegree は最近グーグルに買収されたKaggleとコラボした講座です。さらにUdacityのnanodegree の面白いところは、nanodegree plusというものに申し込むと、卒業後転職まで保証してくれるというプログラムがあるところです。(ただし現状はアメリカ人に限る)

 

何を言いたいかと言えば、日本の教育のように大学とかで学んでることと社会が求めていることが違うという歯がゆさはなく、学んだことが実世界のスキルに直結する。という点が画期的だと思っています。

Deep learning とは?

知ってるよ!という人は多いと思いますが、簡単に言えば今一番流行ってる人工知能のことです。

ただし人工知能と言っても人間の脳のようになんでもできる万能マシーンではなく、一部のタスクにのみ特化した特化型人工知能です。

わかりやすい例で言えば、囲碁で世界チャンピオンを負かしたAlphaGoとかですかね(あれは強化学習が入ってるので、Deep learning とはまた違うのを組み合わせているようですが)

 

DL nanodegreeで学んだこと

Deep Learning(以下DL)nanodegree foundationで学んだことは以下の5つのパートに分かれていました。

基本、理論の理解→実装→実践的なプロジェクト

の3本立てで、実践的なプロジェクトはそれぞれレビューがあり、それをすべて合格しないと卒業証書がもらえないという形になっていました。

  1. 単純パーセプトロンPythonで初めからコーディング
  2. TensorFlow(DL用のライブラリ)の学習
  3. 畳み込みニューラルネットワーク(CNN: Convolutional Neural Network)の理論と実装、画像解析プロジェクト
  4. 再帰ニューラルネットワーク(RNN: Recurrent Neural Network )の理論と実装、映画の字幕を自動生成
  5. GAN: Generative Adversarial Neural networkの理論と実装、人の顔を自動生成

では以下により詳細を説明します。

 

単純パーセプトロンの学習

単純パーセプトロンとは、ニューラルネットワークのうちの最も単純な形です。

 

ニールセンの

ニューラルネットワークと深層学習

https://nnadl-ja.github.io/nnadl_site_ja/

の第一章の途中が一番わかりやすいかと思います。

 

f:id:kenjioda:20170727221301p:plain

基本的には人の脳のニューロンを模倣しているモデルで、あるインプット(ここでいうX1,2,3)などにたいして、係数をかけ合わせて、その値がある一定の値を超えた時に発火するというモデルです。

 

例えば、「ある食べ物を食べるか食べないか」(これがOutput)を判断するときに、

甘いもの、辛いもの、酸っぱいものというインプットが与えられているとします。

このときあなたが非常に甘党であれば、甘いものに対しての優先度が非常に高いので、

甘いものという入力に10倍重み付けをするかもしれません。

逆に辛いもの、酸っぱいものはそんなにすきじゃないので、3倍、1倍と掛け合わせます。

すると、甘くて辛いものを見たときには、10+3=13というアウトプットが得られます。

あなたが食べるか食べないかのしきい値が3.5だとすると、13は3.5を超えているので、あなたはその食べ物を食べるという結論を出します。

逆に、酸っぱいもの単体では、足し合わせが1なので、3.5をうわまらないので、食べないという決定を下します。

これが単純なパーセプトロンですね。

output={01if jwjxj thresholdif jwjxj> threshold

output={01if jwjxj thresholdif jwjxj> threshold

 

 誤差逆伝播法(Back propagation)と勾配消失問題(Vanishing gradient problem)

誤差逆伝播法とは何か?の細かい説明は以下のリンクなどを見ればわかるかと思うのですが、簡単にいえば、「ニューラルネットワークの重み付けを効率的に更新していくためのアルゴリズム」です。

重み付けを更新するときに、予測した値と実際の値の誤差=目的関数 を最小化することがニューラルネットワークの目標です。

なぜかといえば、予測した値がなるべく本当の値に近いほうが良いに決まっているからですね笑

そして、この予測と実際の値に差があるときに、それを学習データとして、より良い重み付けを探っていきます。そのときにこの誤差逆伝播を使います。

qiita.com

 

ただし、誤差逆伝播には問題があり、それが勾配消失問題です。

勾配消失問題とは、重み付けを更新していくときに、アウトプットに近い層は重み付けの更新がうまくいくものが、よりインプットに近い層に進むに従い、うまくいかなくなるという問題です。

これがなぜ起こるのかに関して以下のリンクがうまく説明しています。

 

medium.com

 

誤差逆伝播では、活性化関数の微分を計算します。このとき、活性化関数の種類によって、微分での値が異なります。

 

例えばシグモイド関数

シグモイド関数微分を行うと下の図のように、最大で1/4しか値を返しません。

つまり、もし活性化関数にシグモイド関数を使っていると層が進むにつれて、1/4x1/4x1/4… といって重みの更新が非常に小さくなりほとんど学習しなくなります。

これが勾配消失問題です。

 

 

f:id:kenjioda:20170727221211p:plain

それに対して、以下の

Rectified linear unit 通称ReLUは微分するとステップ関数になって重みとしては1を返していきます。ですので層が深くても重みが更新され、勾配消失問題が発生しなくなります。

 

f:id:kenjioda:20170727221241p:plain

勾配消失問題と逆で重みが、消失するのではなく、発散してしまうケースもあるとのことですが、その場合明らかに異常値が出てくるのでそこまで問題にはならないようです。

 

 

TensorFlowの学習

Deep learning を実装するにあたり、色々なライブラリがあるかと思いますが、Udacity の場合はGoogleが提供しているTensorFlowでした。

 

そもそもDL以外も色々できるようにしようというコンセプトらしいので、正直僕のようなプログラミング弱者には辛いです笑

 

 

本家の畳み込みニューラルネットワークチュートリアルなどは参考になるかもしれません。

TensorFlow

 

 

ディープラーニングなライブラリは色々あり、それぞれによって特徴が結構違うらしいですが

、世界ではTensorflowが流行りのようです。

日本ではプリファードネットワークが出しているChainerが人気だと思うので、おそらく日本語の資料は多く見つかるのではないでしょうか。そしてChainerは短く書けると聞いたことがあります。

 

 

TensorFlowが難しすぎる人にはKerasというライブラリが簡単なのでオススメらしいですが、僕もちゃんと使ったことはないです。

チュートリアル見た感じ簡単そうでしたが。

 

 

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

畳み込みニューラルネットワークディープラーニングを一躍有名にしたものだと思いますが、ディープラーニングで特に得意とする画像認識に用いられます。

もともとネオコグニトロンという日本の研究者のモデルをもとにしており、人の脳での視覚野での処理を模倣しています。

 

詳しくは以下文献が特に参考になりました。

 

 参考になった文献

 

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

 

 基本的には、画像内の特徴的なパターン(斜め、縦、横など)に反応する層を畳み込み層とします。ここで画像の特徴的なものを抽出します。

次にもう少しざっくりした概念を抽出するプーリング層を挟みます。ここでは、ざっくりとある領域の中で最も大きいピクセルのみに反応する(マックスプーリングの場合)というような処理をするので、畳み込み層で抽出した特徴をもう少しボカすような処理をします。

 

これが実際脳の視覚野でも同じようなことが行われており、実際プログラミングでもうまく画像認識することが可能になります。

 

これがざっくりとした畳み込みニューラルネットワークの仕組みです。

 

再帰ニューラルネットワーク(RNN: Recurrent Neural Network )とLSTM: Long term short memory

再帰ニューラルネットワーク通称RNNはその名の通り再帰的な構造を持ちます。 

再帰とはウィキによると

再帰(さいき)は、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう

と書かれています。

つまり自分自身を再度参照するよーってことですね。

これを行うと何が嬉しいかというと、自分の前の状態を参照できる。

それによって「時系列的な影響を考慮できる」というメリットがあります。例えば一個前がこういう状態だったからその値を再帰的に参照して次の時間の状態に引き継ぐことができます。

 

これがRNNの本質かつ、大きな特徴です。

またRNNをより拡張して特に自然言語処理などに使いやすいと言われているものがLSTMでこれは以下のリンクで美しく説明されています。

Understanding LSTM Networks -- colah's blog

 

 

www.youtube.com

 

 

 

Chat botの作成(Seq to seq)

自然言語処理と言えばチャットボットでしょ。という話があるかと思いますが、LSTMのみで作るとわけわからない文章が生成されたりします。実際映画の字幕から自動で字幕生成するという課題をやったところ結構わけわからないものが出てきました笑

 

現状は完璧に扱えるものがないので、半分くらい人間が用意した文章をもとにチャットするみたいなSequence to sequence モデルが使われているようです。

※これあんまりよくわかってないから復習する

www.wildml.com

www.wildml.com

 

GAN: Generative Adversarial network 

 最後にGANをやりました。

先述の

深層学習 (機械学習プロフェッショナルシリーズ)ではCNN, RNNそしてディープボルツマンマシン(DBM)しかなかったので、この講座で初めて知りました。

 

確かあのBengio先生もニューラルネットワークの中で最も面白い発見の一つみたいに言ってるらしく(確か)確かに今までのものとは違うので面白いです。

 

僕が解説するよりも以下の記事を読んだ方が圧倒的にわかりやすいですが、特にGANとはなんぞやを説明している文を抜粋すると

 

この関係は紙幣の偽造者と警察の関係によく例えられます。偽造者は本物の紙幣とできるだけ似ている偽造紙幣を造ります。警察は本物の紙幣と偽造紙幣を見分けようとします。

次第に警察の能力が上がり、本物の紙幣と偽造紙幣をうまく見分けられるようになったとします。すると偽造者は偽造紙幣を使えなくなってしまうため、更に本物に近い偽造紙幣を造るようになります。警察は本物と偽造紙幣を見分けられるようにさらに改善し…という風に繰り返していくと、最終的には偽造者は本物と区別が付かない偽造紙幣を製造できるようになるでしょう。

GANではこれと同じ仕組みで、generatorとdiscriminatorの学習が進んでいきます。最終的には、generatorは訓練データと同じようなデータを生成できるようになることが期待されます。このような状態では、訓練データと生成データを見分けることができなくなるため、discriminatorの正答率は50%になります。

 

です。このように、ランダムなノイズから生成した画像を本物の画像と同じように偽造していくモデルを構築というのがGAN がやってることです。

詳しくは以下を要参照!

elix-tech.github.io

 

 

その他参考になる概念やリンク

 

ハイパーパラメータのチューニング

ハイパーパラメーターとは、重みとかがパラメーターかと思いますが、それよりも前に定義しなければいけない
層数とか層ごとのユニット数などです。
入力と出力はデータや予測したい要素によって決まると思いますが、隠れ層は任意で決めなければいけません。そしてこれは結構めんどくさいです苦笑
友人がハイパーパラメーターの研究してた気がするけど詳細は知りません

stats.stackexchange.com

 

転移学習

転移学習(Transfer learning )はめっちゃ便利で、ディープラーニングって学習するのにコンピュータリソースも時間もクソ使うけど、Googleとかが頑張ってチューニングしてくれたやつをそのまま使えまっせってものです。便利だね!

cs231n.github.io

 

Batch normalization(バッチ正則化)

バッチ正規化はイマイチなんでうまくいくかわかってないけど、とりあえず正則化すると極端な値とかが出てこないから学習しやすいとかだった気がするけど忘れたので勉強します。

Implementing Batch Normalization in Tensorflow - R2RT

Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift

Word2Vec

こちらは自然言語処理系。Bag of wordsのようにある文章内に単語がいくつ出てきたとかではなくて、もっと高度なもので、女王-女=王みたいな計算もできるらしい

どうなってるかよくわかってないからこれも要復習

Word2Vec Tutorial - The Skip-Gram Model · Chris McCormick

 

最適化関連の手法

最適化でAdam optimizerとか出てくるのでそれなんぞやを解説している

postd.cc

Auto Encoder

これもなぜうまくいくかはよくわからんけどうまくいっている系らしい。

入力と出力を同じようにするよーというもので、ノイズとかがいい感じに減るのかな?なんでうまくいくかは解明されてないのでイメージですが

 

 

感想

 全体的にディープラーニングを概観できたし、実際の実装や実践的な課題があってめっちゃ良かったです。

値段はこの時ちょっと安くて400ドルくらいだったし、三ヶ月くらいでこんなにできて良かったです。あと卒業証書もこんな感じでもらえるのでLinkedinにも書けるし良いよねー的な笑

f:id:kenjioda:20170812065216p:image

けど、当たり前だけどディープラーニングってチューニング大変だし学習データ膨大に必要だったり、画像処理以外は結構実践で使うの大変そうだから、他の初歩的な機械学習アルゴリズムや統計の知識ってやっぱ大事だなと思った次第です。

 

というわけで、今は初心に帰ってこちらの本

 

はじめてのパターン認識

はじめてのパターン認識

 

 そして、Udacityは

Intro to machine learning 

Intro to Machine Learning Course | Udacity

 

Model building and validation

Model Building and Validation | Udacity

の二つをやってます。

 

引き続き頑張ろう!