vmin style

DL4US落ちたので、書籍『ゼロから作るDeeplearning』をやるしかない

【スポンサーリンク】

はじめに:「ゼロから作るDeep Learning」とは

10万部も売れているディープラーニング界隈では大人気本。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。 最近、待望の続編である自然言語処理編も満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)CS224d(自然言語処理のためのディープラーニング)である。

 

利点:ベストセラー本なので先達のまとめブログが多い

ベストセラー本だけあってやはり、ネットを検索するとQiitaやはてなブログ等で多数の実践ブログが上がってくる。 今回は、こうした先人の知恵をパク...『転移学習』することで、自分の知見を深めることを目的とした。

qiita.com yusuke-ujitoko.hatenablog.com

今回は上記の2エントリを参考にさせて頂きました。感謝!

 

第1章 Python入門(P1~P20 : 10分)

まずはpython入門みたいな感じ。流し読み。

本章で学んだこと

 

第2章 パーセプトロン(P21~P37 : 15分)

シグモイド関数のような__非線形関数__で変換すれば、任意の関数を表現できると。 これも導入でよくある内容で流し読み。

f:id:stillalive0304:20180728125106p:plain https://qiita.com/ruka38/items/2f2f958c1d45728ea577 パーセプトロンからはじめる分類問題より引用

本章で学んだこと

 

第3章 ニューラルネットワーク(P39~p82 : 31分)

まずは順伝搬の説明。よく見るMNISTデータセットを用いた画像認識の例。 aidemyや石川氏の本で読んだ気がするので流し読み。

人工知能プログラミングのための数学がわかる本

人工知能プログラミングのための数学がわかる本

本章で学んだこと

  • ニューラルネットワークでは,活性化関数としてシグモイド関数ReLU関数のような滑らかに変化する関数を利用する
  • NumPyの多次元配列をうまく使うことで,ニューラルネットワークを効率よく実装することができる
  • 機械学習の問題は,回帰問題分類問題に大別できる
  • 出力層で使用する活性化関数は,回帰問題では恒等関数分類問題ではソフトマックス関数を一般的に利用する
  • 分類問題では,出力層のニューロンの数分類するクラス数に設定する
  • 入力データのまとまりをバッチと言い,バッチ単位で推論処理を行うことで計算を高速に行うことができる.

  

第4章 ニューラルネットワークの学習(P83~P122 : 30分) 

ここら辺も導入でよくある概念の説明で流し読み。pythonコードの説明が詳しい。

ニューラルネットワークの学習アルゴリズム

  • 前提
    • ニューラルネットワークには適応可能な重みとバイアスがあり,この重みとバイアスを訓練データに適応するように調整することを学習と呼ぶ.
  • ①ミニバッチ
    • 訓練データの中からランダムに一部のデータを選び出す
  • ②勾配の算出
    • ミニバッチの損失関数を減らすために,各重みパラメータの勾配を求める
  • ③パラメータの算出
    • 重みパラメータを勾配方向に微小量だけ更新する
  • ①~③を繰り返す

    確率的勾配降下法(stochastic gradient descent)

    • 確率的に無作為に選びだしたデータ(ミニバッチ)を使って,パラメータを更新する
    • SGDと略される

本章で学んだこと

  • 機械学習で使用するデータセットは,訓練データテストデータに分けて使用する
  • 訓練データ学習を行い,学習したモデルの汎化能力テストデータで評価する
  • ニューラルネットワークの学習は,損失関数を指標として,損失関数の値が小さくなるように,重みパラメータを更新する
  • 重みパラメータを更新する際には,重みパラメータの勾配を利用して,勾配方向に重みの値を更新する作業を繰り返す
  • 微小な値を与えたときの差分によって微分を求めることを数値微分という
  • 数値微分によって,重みパラメータの勾配を求めることができる
  • 数値微分による計算には時間がかかるが,その実装は簡単である.一方,次章で実装するやや複雑な誤差逆伝播は,高速に勾配を求めることができる.

  

第5章 誤差逆伝播法(P123~P164 : 40分)

この章の内容は、p.123に言及があるスタンフォードのCS231n授業や、また本シリーズ②の第1章でも再度説明がある。

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

本章で学んだこと

  • 計算グラフを用いれば,計算過程を視覚的に把握することができる
  • 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
  • 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
  • ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
  • 数値微分誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.

 

第6章 学習に関するテクニック(P165~P203 : 121分)

f:id:stillalive0304:20180728171803p:plain

冒頭で、冒険家のたとえ話から。

目隠しをした冒険家が最も『深き場所』へたどり着くための手段=最適化手法について。 今いる場所で一番傾斜がきつい方向へ進もうとする、前章の確率的勾配法(SGD)には欠点があった。

  • SGDの欠点
    • ジグザグな動きで、問題によっては非効率
    • 関数の形状が等方的でないと,勾配が最小値を指さない.

そこで、SGDの欠点を改善する手法として,_Momentum, AdaGrad, RMSProp, Adam_といった手法が開発されていると。

f:id:stillalive0304:20180728170204p:plain:w400

パラメータ更新手法の選択

f:id:stillalive0304:20180728195203p:plain

Momentum

  • Momentum : 運動量のこと
  • 前の更新を保存し,慣性力が働くようにする
  • ボールがお椀を転がるような動きでなめらか

AdaGrad

  • Adaptive(適応的)のAda、つまり『適応的』勾配
  • パラメータの要素ごとに、学習係数を過去のすべての勾配の2乗和で割って減衰させていく
  • 無限の学習を行うと更新量が0になってしまう欠点がある
    • そこで開発されたのがRMSProp
      • AdaGradにおいて,過去の更新における勾配を徐々に忘れるようにするもの

Adam

  • MomentumAdaGrad融合(フュージョン
    • Momentum -ボールがお椀を転がるように物理法則に準じる動きを再現
    • AdaGrad
      • パラメータの要素ごとに,『適応的』に更新ステップを調整

AdamW

ドラゴンボール世代がフュージョンと聞くと_最強_のイメージですが、 やはり更なる上(スーパーAdam的なAdamW)があるようですね...

f:id:stillalive0304:20180728171640j:plain:w200

ドラゴンボール より

  

初期パラメータの選択

Weight decay

  • 重みの値を小さくすることで、過学習を抑え、汎化性能を高めるテクニック
  • 重みを小さくしたいのであれば、初期値もできるだけ小さい値でスタートしたいと思うのが当然

とはいえ、重みの初期値を0にしてはいけない

  • 重みが均一になってしまうと,重みを持つ意味がなくなるため

重みの初期値のベストプラクティス

  • 活性化関数にReLUを使う場合は「Heの初期値」
    • 前層のノード数がnのとき,sqrt(1/n)の標準偏差を持つ分布を使用する
  • sigmoidtanhなどのS字カーブの時は「Xavierの初期値」
    • 前奏のノード数がnのとき,sqrt(2/n)の標準偏差を持つ分布を使用する

f:id:stillalive0304:20180728200652p:plain:w400

  • std=0.01の場合は全く学習が進んでいおらず、He、Xavierの際にスムーズに学習が進んでいる
    • 重みの初期値はとても重要

  

Batch Normalization

各層のアクティベーションの分布が適度な広がりを持つように”強制的”アクティベーションの調整を行う

Batch Normalizationの利点
  • 学習を早く進行させることができる(学習係数大きくすることができる)
  • 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくて良い)
  • 過学習を抑制する(Dropoutなどの必要性を減らす)

f:id:stillalive0304:20180728201912p:plain

  • データ分布の正規化(平均が0、分散が1の分布)を行うレイヤ(Batch Normalizationレイヤ) をニューラルネットワークに挿入し、各ミニバッチごとに正規化する

  

正則化

過学習が起きる原因

  • パラメータ大量に持ち,表現力の高いモデルであること
  • 訓練データ少ないこと

Weight decay

  • 大きな重みを持つことにペナルティを課す

dropout

  • ニューロンをランダムに消去ながら学習する
    • 訓練時
      • データが流れるたびに,消去するニューロンをランダムに選択する
    • テスト時
      • すべてのニューロンの信号を伝達するが,ニューロンの出力に対して,訓練時に消去した割合を乗算して出力する

f:id:stillalive0304:20180728203952p:plain:w300

  

ハイパーパラメータの検証

  • ハイパーパラメータの例

    • ニューロンの数
    • バッチサイズ
    • パラメータ更新の学習係数
    • Weight decay
  • ハイパーパラメータの性能をテストデータを使って評価してはいけない

    • テストデータに対して過学習してしまう
    • ハイパーパラメータ専用の検証データ(validation data)が必要
  • ハイパーパラメータの最適化のステップ

    1. ハイパーパラメータの範囲を設定する
    2. 設定されたハイパーパラメータの範囲から,ランダムにサンプリングする
    3. ハイパーパラメータの値を使用して学習を行い,検証データで認識精度を評価する
    4. 2と3を繰り返し,認識精度の結果からハイパーパラメータの範囲を狭める

6章からが本番だと前述のQiitaの記事に書いてありました。

6章~7章が本書の核のようで、内容が濃く充実していますね!

本章で学んだこと

  • パラメータの更新方法には,SGDの他に有名なものとして,MomentumやAdaGrad,Adamなどの手法がある.
  • 重みの初期値の与え方は,正しい学習を行う上で非常に重要である.
  • 重みの初期値として,「Xavierの初期値」「Heの初期値」などが重要である.
  • Batch Normalizationを用いることで,学習を速く進めることができ,また,初期値に対してロバストになる.
  • 過学習を抑制するための正則化の技術として,Weight decayDropoutがある.
  • ハイパーパラメータの探索は,良い値が存在する範囲を徐々に絞りながら進めるのが効率の良い方法である.

  

第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)

この章は下エントリに、図解ありで非常に詳しくまとまっていました。以下抜粋。

qiita.com

全体の構造

f:id:stillalive0304:20180728232550p:plain

  • これまでの全結合層
    • [Affine, ReLU]を繰り返し,最後に[Affine,Softmax]

f:id:stillalive0304:20180728232625p:plain

  • CNN
    • [Conv, ReLU, (Pooling)]を繰り返し,最後の方で[Affine, ReLU], 最後に[Affine, Softmax]

全結合層の問題点

  • 入力データの形状無視されてしまう点

    • たとえば画像の場合,縦・横・チャンネルの3方向を盛っているが,全結合相に入力するときは3次元を1次元にする必要がある.形状には大切な空間情報が含まれているはず.
    • すべての入力データを同等のニューロンとして扱う.
  • 畳み込み層(convolutionレイヤ)では形状を維持する.

    • 畳み込み層の入出力データを特徴マップ(feature map)
    • 入力データを入力特徴マップ(input feature map)
    • 出力データを出力特徴マップ(output feature map)

畳み込み演算

f:id:stillalive0304:20180728234000p:plain

  • 画像処理でいうところ「フィルター処理」に相当
  • 「フィルター」はカーネルとも言う
  • フィルターのパラメータは全結合のニューラルネットワークにおける「重み」に対応 f:id:stillalive0304:20180728234327p:plain
  • 上図はフィルター処理にバイアスを加えたもの

パディング(padding)

  • 入力データの周囲に固定のデータを埋める
    • 出力サイズを調整するため f:id:stillalive0304:20180728234553p:plain

ストライド(stride)

  • フィルターを適用する位置の間隔のこと f:id:stillalive0304:20180728234639p:plain

プーリング層

  • プーリングは縦・横方向の空間を小さくする演算
    • プーリングの種類は色々ある
      • Maxプーリング : 領域内の最大値を取る

f:id:stillalive0304:20180728234932p:plain

   - Averageプーリング : 領域内の平均値をとる
  • プーリング演算によってチャネル数は変化しない
  • 微小な位置変化に対してロバスト

f:id:stillalive0304:20180729212029p:plain

 

重みの可視化

f:id:stillalive0304:20180729214253p:plain

  • AlexNetでは、最初の層は単純なエッジに反応し、続いてテクスチャに反応し、そしてより複雑な物体のパーツへと反応

    • Cov1:エッジ、ブロブ(Edge+Blob)
    • Cov3:テキスチャ(Texture)
    • Cov5:物体のパーツ(Object Parts)
    • Fc8:犬や猫などの物体のクラス(Object Classes)
  • 層が深くなるに連れて、ニューロン単純な形状から"高度"な情報へと変化

  • モノの「意味」を理解するように、反応する対象が変化していく

  

代表的なCNN

  • LeNet(1998)

    • 約20年前に提案された初めてのCNN
    • 活性化関数は_シグモイド関数
    • Pooling層はサブサンプリング
  • AlexNet(2012) : ディープラーニングブームの火付け役

    • LeNetと大きな構造は変わらないが、
      • LeNetにおける活性化関数をReLUとした
      • LRN(Local Response Normalization)層という局所的正規化を用いた
      • Dropoutを使用した

  

本章で学んだこと

  • CNNは、これまでの全結合層のネットワークに対して、畳み込み層プーリング層が新たに加わる
  • 畳み込み層とプーリング層は、im2col(画像を行列に展開する関数)を用いるとシンプルで効率の良い実装ができる
  • CNNの可視化によって、層が深くなるにつれて高度な情報が抽出されていく様子が分かる
  • CNNの代表的なネットワークには、LeNetAlexNetがある
  • ディープラーニングの発展に、ビッグデータGPUが大きく貢献している

  

第8章 ディープラーニング(P241~P273 : 61分)

こちらのエントリが詳しいです。以下抜粋。

qiita.com

認識精度を高めるには

Data Augumentation(データ拡張)

  • 回転縦横移動をさせて画像データを増幅する

層を深くする

  • フィルタを小さくでき、パラメータが減る
    • 階層的に情報を抽出することで学習が効率化する
  • ReLUなどの活性化関数を畳み込み層の間に挟めるので、非線形化できるため、複雑な表現が可能となる

有名なCNNアーキテクチャ

VGG (2014年2位)

f:id:stillalive0304:20180729224525p:plain

  • CNNのネットワークを深くしたものをVGGという
  • 重みの初期値にHeの初期値、重みパラメーターの更新にAdamを使う
  • 後段の全結合層では、Dropoutレイヤを使う
  • 画像認識度は高く、誤認識率も低いネットワークを構成できる

GoogLeNet(2014年1位)

f:id:stillalive0304:20180729230709p:plain - ネットワークが縦方向の深さだけでなく、横方向にも深さを持っている(インセプション構造)

ResNet (ついにエラー率で人を超える)

f:id:stillalive0304:20180729230229p:plain 畳み込みニューラルネットワークの研究動向より引用

f:id:stillalive0304:20180729230849p:plain

  • 層を深くできるような仕掛けとして「スキップ構造」をもつ
  • スキップ構造
    • 入力データの畳み込み層をまたいで出力に合算する構造
    • 逆伝播の際に、スキップ構造によって信号が減衰せずに伝わり、学習が効率的に進む

  

ディープラーニングの高速化

  • GPUによる高速化
  • 分散学習
  • 演算精度のビット削減
    • 通常の64ビットや32ビットの浮動小数点数ではなく、16ビットの半浮動小数点数を使う
      • Google TPU8ビットの計算ユニットで計算を行う
      • 最近では重みや中間データを1ビットで表現する手法も提案されている

  

ディープラーニングの実用例

物体検出

f:id:stillalive0304:20180729232032p:plain

  • 画像から物体の種類と位置を特定するクラス分類問題
  • CNNをベースとした手法が多く,R-CNN,さらにはFaster R-CNNが有名

セグメンテーション

f:id:stillalive0304:20180729232158p:plain

  • 画像に対するピクセルレベルでのクラス分類問題
  • FCN(Fully Convolutional Network)というすべてがConvolution層からなるネットワークが使われる

画像キャプション生成

f:id:stillalive0304:20180729232338p:plain

  • 画像を入力すると,その説明文を出力する問題
  • 代表的な方法はNIC(Neural Image Caption)を呼ばれ,画像を理解するでディープなCNNと自然言語を扱うRNNから構成される.
  • CNNが画像から特徴を抽出し,RNNに初期値としてそれを渡す.そこからRNNは再帰的に文章を生成する

画像スタイル変換

f:id:stillalive0304:20180729232516p:plain

  • スタイル画像とコンテンツ画像の2つの画像を入力することで,新しい画像を生成する.
  • ネットワークの中間データがコンテンツ画像の中間データに近くなるように,かつスタイル画像から抽出したスタイル行列のズレも小さくなるように学習を行う

画像生成

f:id:stillalive0304:20180729232719p:plain

  • DCGAN(Deep Convolutional Generative Adversarial Network)
  • GeneratorとDiscriminatorという2つのニューラルネットワークを用い,前者が本物そっくりの偽物を作り,後者がそれが本物か否かを判定することを競争的に繰り返し,お互いに学習を進める

自動運転

f:id:stillalive0304:20180729232906p:plain

  • CNNベースのSegNetは走路環境のセグメンテーションを高精度で行う

Deep Q-Network

f:id:stillalive0304:20180729233517p:plain www.youtube.com

  • DQNは、動作に対する価値観数をCNNで近似することで、画像に対しての動作を最適化する学習を行う

本章で学んだこと

画像認識はfast.aiでもやっていたので駆け足で学習しました。引き続き、自然言語処理編の②へ!