くじら公園

プログラミングなど学んだことについて書きます

Deep Learning Specialization(Coursera) - Course 1のメモ

CourseraDeep Learning Specializationの受講メモです。Deep Learning SpecializationはMachine Learningコースを提供するAndrew Ng氏、および氏が創設したdeeplearning.aiが提供する深層学習に関する一連の講義です。以下の5つのコースから構成されています。

  • COURSE 1: Neural Networks and Deep Learning
  • COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
  • COURSE 3: Structuring Machine Learning Projects
  • COURSE 4: Convolutional Neural Networks
  • COURSE 5: Sequence Models

今回はCOURSE 1、Neural Networks and Deep Learningを受講した際の備忘録的なメモです。Deep Learning Specialization全体を受講したうえでのまとめは別途記載する予定です。


COURSE 1: Neural Networks and Deep Learning

COURSE 1はニューラルネットワークと深層学習の導入という位置づけの内容でした。ロジスティクス回帰を順伝播・逆伝播アルゴリズムで理解・実装し(Week 2)、続いて浅い-2層ニューラルネットワークロジスティクス回帰を拡張する形で理解・実装し(Week 3)、さらに任意の数の隠れ層を持ったニューラルネットワークを実装してロジスティクス回帰とのパフォーマンスを比較する(Week 4)のが大まかな流れとなります。

受講期間の公式の見積もりは"4 weeks of study, 3-6 hours a week"となっており、実際に要した時間は凡そ13時間でした。

COURSE 1を通した感想としては、本コースは深層学習の初心者向けに入念に練られたビデオ講義とProgramming Assignmentsから構成されていて、多少のプログラミング経験があれば誰でも深層学習を体験できるようになっていました。

ビデオ抗議ではロジスティクス回帰及び浅いニューラルネットワーク、任意の隠れ層を持ったニューラルネットワークの順伝播、逆伝播のアルゴリズムが数式、および図式を用いて繰り返し提示されて、講義を終えるころには受講者がこれらを自然と理解できているようになっていました。逆伝播における微分計算については深い微分に関する知識は前提とされておらず、高校数学を忘れてしまっていても取り組めるように意識されているようでした。

Programming Assignmentsではビデオ講義の内容-ロジスティクス回帰~任意の数の隠れ層を持ったニューラルネットワークの順伝播と逆伝播の実装が課題でした。jupyter notebookを用いていて、問題の提示とそれに対するこちらの回答を自然に読むことができるようになっているのはとても好感を持ちました。(Machine Learningのときは、問題の提示がPDF、回答はoctaveスクリプトだったので、これらと比べるととてもスムーズに問題に取り組むことができました。)実装時はnumpyのみを用いており、特定の深層学習向けフレームワークは登場しません。またヒントが多く提示されているため、ビデオ講義を受けたうえでヒントを読み漏らさなければほぼ躓くことはありませんでした。

個人的には「なぜ深層学習が非線形関数を必要とするのか」や「どの活性化関数を選択すべきか」についての説明が直感的で面白かったです。

逆に平時、深層学習を用いている人にとっては少し退屈な内容になるかもしれません。COURSE 2以降でより発展的な講義となるようで、来週から取り組んでまた感想を記載するつもりです。

以下メモです(ただメモを張り付けているだけなので、体裁が崩れていたらすみません…):

Week 1

2017/10/02

最後に10問のクイズに正解するまでに1時間40分要した。Geoffrey Hinton氏のインタビュービデオ(40分)はこれから。

内容

  • Waht is a neural network?
  • Supervised Learning with Neural Networks
    • 教師あり学習のニューラルネットワークとは何か
    • Standard Neural Networks、CNNs、RNNsの紹介、各々はどういった領域で用いられるかについて
  • Why is Deep Learning taking off?
    • ニューラルネットワーク自体は何十年も前から存在するが、なぜ今になってこれほどまでに用いられるようになってきたのか?
    • 横軸データサイズ、縦軸パフォーマンスの図
      • SVMやロジスティック回帰など従来の手法は、データサイズが大きくなったときにパフォーマンスが頭打ちされる」
      • ニューラルネットワークはそのネットワークを大きくすればするほど、またデータサイズを大きくすればするほどパフォーマンスが向上する
      • 近年コンピューターの発展で大量のデータが得られるようになった
      • 上記点から近年ニューラルネットワークが多く用いられるようになってきた
    • ディープラーニングをスケールする要素、Data、Computation、Algorithms
      • AlgorithmsもComputationを促進するようなものがインパクトが大きかった
        • 活性化関数ReLUはsigmoidと比較して勾配計算が高速になり結果として学習時間を短くするもので大きなインパクトを与えた
      • 結局計算時間の短縮が鍵となる
        • ニューラルネットワークを適用する作業は直感に基づいた作業となることが多い
          • Ideaに対してCodeを書いてExperimentして、そこから得られた新しいIdeaで再度このサイクルを回していく作業
          • 一回のイテレーションに要する時間が短ければ短いほど成功に近づける
  • About this Course

所感

  • 日本語の字幕は個人的に苦手なので、英語の字幕でビデオを見た
  • 字幕の表示タイミングがビデオによって違った
    • 「Why is Deep Learning taking off?」では、より自然に字幕が表示されるように鳴っていたけど、ビデオ下部に表示される字幕全文が逆に読みにくくて(文章の切れ間がどこだか分かりにくい)少し困った

Week 2

2017/10/03

まだ途中多分100分くらい

2017/10/04

Python and Vectorizationから、150分

Explanation of logistic regression cost functionとHeros of Deep Learningはまだ

内容

Logistic Regression as a neural network(Video)
  • 二値分類を解くアルゴリズムとしてロジスティック回帰の紹介
  • ロジスティック回帰のCost function
    • 学習データの一つのexampleの誤差を計算するのがLoss function
    • パラメーターを引数にとり全ての学習データの誤差の平均を算出するのがCost function
  • 勾配降下法の紹介
  • 微分について簡単におさらい
  • 計算グラフの紹介
    • f = 3(z + bc)という簡単な数式を例に順伝播と逆伝播を説明
  • ロジスティック回帰の計算グラフ
    • 後のことを考えてあえて計算グラフでロジスティック回帰を表現する
Python and Vectorization(Video)
  • numpyを利用したvectorizationについて
  • vectorizationでロジスティック回帰の順伝播を実装してfor文をなくし効率的な処理とする
  • vectorizationでロジスティック回帰の逆伝播を実装してfor文をなくし効率的な処理とする
  • numpyのbroadcastingについて
  • jupyterについて

Programming Assignments

  • numpyの基礎、reshapeとかbroadcastingについて
  • ロジスティック回帰を順伝播と逆伝播のアルゴリズムで実装する
  • 今回はnumpyで実装
  • タスクは、32 x 32の画像がネコの画像か(1)ネコ以外の画像か(0)の二値分類

所感

  • ビデオが長い
  • 計算グラフとその逆伝播の説明(Derivatives with a Computation Graph)は分かりやすかった
  • Derivatives with a Computation Graphは途中から字幕のズレが酷く字幕は無視した
  • Programming Assignmentsは初回故か簡単だった
  • ロジスティック回帰を順伝播と逆伝播のアルゴリズムで実装するのは導入としてとても分かり易い
  • jupyterさまさま、前のmachine learning(テキストはPDF)と比べてjupyterだとexerciseとテキストが一緒に読めてやりやすい

Week 3

2017/10/05

ビデオ8つ、2時間半

後半ビデオ3つで1時間、クイズとassignmentでたぶん1時間半、上と合わせて5時間

内容

  • Week 2のロジスティック回帰を拡張する形でニューラルネットワークの紹介
    • 例えば入力が3次元、4ユニットの隠れ層を1層持つ2層ニューラルネットワークの場合、隠れ層はそれぞれ別のパラメーターを持った4つのロジスティック回帰ユニットと考えることができる
  • ニューラルネットワークのvectorization
    • W^[1]は各ユニットのwを転置したものを水平方向にスタックしたもの; [1]は1層目を表す、(j, n_x); jは隠れ層のユニット数
    • Xは各training exampleのベクトルを垂直方向にスタックしたもの、(n_x, m)
    • Z^[1] = W^[1]X、A^[1] = G(Z^[1])、いずれも(j, m)
    • W^[2]、(1, j)
    • Z^[2] = W^[2]A^[1]、A^[2] = G(Z^[2])、いずれも(1, m)
  • 活性化関数について
    • sigmoidは基本的には二値分類の出力層以外では使わない
    • tanhは平均が0であるという点でsigmoidより優れている、但し入力が大きく/小さくなったときにその勾配が0に近づくため勾配降下法が遅くなるという欠点がある
    • ReLUは多くの場合最も良い選択肢、入力が0より大きい場合に勾配が1となるため学習が早い
    • ReLUの亜種としてLeaky ReLU、使っている人を見るのは稀
  • ニューラルネットワークに活性化関数が必要となる理由
    • 以下の2層ネットワークについて
      • z^[1] = W^[1]x + b^[1]
      • a^[1] = g^1 = z^[1]
      • z^[2] = W^[2]a^[1] + b^[2]
      • a^[2] = g^2 = z^[2]
    • もし活性化関数Gを取り除く/活性化関数Gとしてlinear活性化関数(identity)を使った場合:
      • a^[1] = z^[1] = W^[1]x + b^[1]
      • a^[2] = z^[2] = W^[2]a^[1] + b^[2] = W^2 + b^[2] = (W^[2]W^[1])x + (W^[2]b^[1] + b^[2]) = W'x + b'
      • 入力に対する単なる線形関数となる
      • どんなに層を深くしても結局この最後の線形関数を計算しているだけ→いかなる隠れ層ももっていないネットワークになってしまう
    • 回帰問題を扱う時の出力層に対しては活性化関数としてlinear活性化関数を用いることがある
  • 活性化関数の微分について
  • ニューラルネットワークの逆伝播について

Programming Assignments

所感

  • 日本語の字幕がここらへんからなくなっていた
  • Machin learningのときもそうだけど、基本的に受講者に数学の知識は求めないスタイルで、微分の計算式も初めから答えが紹介される
  • なんだかんだ言って深層学習を網羅的に扱った教科書は青本しか読んでいないので、なぜ活性化関数が必要なのかなどは勉強になった
    • 現時点ではすごく初心者向けと感じる部分もあるが、Andrew先生の観点で大事なところは詳しく教えてくれるので現時点でも得るものは結構ある
  • Programming Assignments、Week 2もそうだけど、forward、compute_cost、backword、update_parametersの4つにプログラムを分類するスタイルはわかりやすい
    • モデル(forward、backword)とコストの計算(compute_cost)、パラメータ-の更新(update_parameters)は明確に分離しやすい
  • やはりnumpyでforward、backword書くのは楽しい、assignmentsだとヒントが多すぎるので、scratchで書きたくなってきた

Week 4

2017/10/07

ビデオ1時間20分、programming assignments1時間30分

内容

  • これまでのまとめ
  • このコースでの記法の整理
  • なぜ深い表現(deep representation)なのか?

    • 例えば人の顔の検知器の場合、頭のほうの層は特徴検知器/edge検知器、お尻の方の層はより複雑な関数を表している
    • Circuit theory
    • But when I'm starting out a new problem, I'll often really start out with neuro-logistic regression then try something with one or two hidden layers and use that as hyper parameters.

  • ForwardとBackward整理
  • ハイパーパラメーターについて
  • 深層学習と人の脳のアナロジーについて   深層学習のforwardとbackwardの仕組みについてよく"It's like a brain."と言及されることがある     これは実際には単純化しすぎた説明だ
    • So when I think of deep learning, I think of it as being very good and learning very flexible functions, very complex functions to learn X to y mappings.

Programming Assignments

所感

  • ForwardとBackwardの図がわかりやすかった
  • Programming exersice、猫分類器の作成において、2層より5層のほうが制度が良かった、隠れ層を増やすと過学習しやすいわけでもない