Coursera Deep Learning専門講座の受講メモ (コース4 - Convolutional Neural Networks - Week 2)

この記事のまとめ:
  • CourseraのDeep Learning専門講座コース4: Convolutional Neural NetworksのWeek 2の受講メモとして、要点とよくわからなかったところを補完のために調べたことなどを備忘録としてまとめています。
  • Week 2では過去CNNでのブレークスルーとなってきた実装例を見ていきます。

コース4: Convolutional Neural Networksについて

このコースでは、基本的な畳み込みニューラルネットワーク (Convolutional Neural Networks)の層の実装と、マルチクラスの画像分類問題を解くためのディープニューラルネットワークの正しい組み上げ方について学びます。

4週間の内容は次の通りです。

Week 2の概要

このコースのWeek 2では、下記のことついて学びます。

  • LeNet-5
  • AlexNet
  • VGG-16
  • ResNet
  • GoogLeNet
  • オープンソースの活用
  • データ拡張 (Data Augumentation)
  • Kerasの使い方
クラシックネットワーク

ディープニューラルネットワークの初期に有名となったニューラルネットワークについていくつか見ていきます。

LeNet-5

近年のCNNと異なる点

  • 平均プーリングを使用
  • パディングは使用しない
  • 出力層にSoftmaxではなく異なる分類器を使用
  • 活性化関数としてReLU関数でなく、Sigmoidやtanh関数を使用
  • 計算機の制約から複雑な実装
  • プーリング層の後に活性化関数としてSigmoid関数を使用

近年のCNNと同じ点

  • 層が深くなるごとに出力の高さと幅は小さくなり、チャネル数は大きくなる
  • 複数の畳み込み層の後にプーリング層という組み合わせを組み合わせて、最後に全結合層を使用
AlexNet

近年のCNNと異なる点

  • 計算機の制約から複雑な実装
  • 局所応答正規化を実装 → あまり効果がないことが他の研究で実証済み

近年のCNNと同じ点

  • 層が深い
  • ReLU関数を使用
VGG-16

シンプルなフィルタールールを採用しており、すべての層において、のフィルター、、プーリングに"same"を使用しています。

ResNet

発表当時の2015年断面においては従来のCNNに比べると層が非常に深く152層もありました(書き表せないので図は省略)。

ニューラルネットワークの層の数を増やすと理想的には訓練誤差は小さくなりますが、現実的にはそうではなく、層の数を増やしすぎると勾配消失や発散によって層を増やしても訓練誤差はむしろ大きくなってしまいます。

ResNetは、スキップコネクション(バイパス、ショートカットとも呼ばれる)という方法によってこの勾配消失問題を解決した手法です。

勾配消失問題とは、もしL2正則化を使う場合、重み とバイアス は学習が進むと減衰していきます。その結果として、活性化関数の入力 に近づいてしまいます。そうすると学習が次第に進まなくなるということが言えます。

スキップコネクションは、 層目の活性化関数の入力として、 層目以前の活性化関数の出力をそのまま入力することです。

これによって、 層目は最悪の場合においても 層目の学習を妨げないように動きます。

式で表すと次のように表現でき、 が勾配損失によって重み やバイアス が0に収束したとしても、 が残るため の学習ができるということです。

なお、 は同じ次元である必要があります。もし、次元が異なる場合には、新たな重み行列 を事前に のかけることで とする必要があります。このとき、 は学習によって更新してもいいですし、定数の行列としてもよいです。

下記に勾配損失問題を含めてもう少し詳しく説明されています。

GoogLeNet
1x1畳み込み

1x1畳み込みは、チャネル方向のみで特徴量を得ようとするフィルターですが、それだけでなく入出力の高さと幅を変えずにチャネル数を減らしたり、増やしたりするために使われます。

Inception network

これまでの畳み込みニューラルネットワークでは、各層では1種類の畳み込みフィルターを使ったり、プーリングを選んで次の層に渡していましたが、GoogLeNetでは次の図のようにさまざまなサイズのフィルター処理や、プーリング処理をすべてを行い、すべての出力を結合します。このようなブロックをInceptionブロックといい、Inceptionブロックで構成されるニューラルネットワークをInception networkと呼びます。

Source: Going deeper with convolutions

このようにInceptionブロックで様々な処理を行うことの課題は計算コストです。そこで、計算コストを削減するために黄色の箱で示される1x1畳み込みです。

畳み込み処理の前処理としての1x1畳み込みと最大プーリングの後処理としての1x1畳み込みの意味合いが違いますのでそれぞれ分けて説明します。

畳み込み処理の計算量は、 です。なお、Inceptionブロック内の畳み込み処理はすべて入出力の高さ、幅が同じになるようにパディングをすることが基本ですので疎の想定です。

これに対して、1x1畳み込みの前処理を行うことで計算量は となります。ここで は1x1畳み込みのチャネル数を示しています。前項の1x1畳み込みのオーダーはフィルター処理よりもはるかに小さいので無視できます。つまり、1x1畳み込みのチャネル数 を 前の層のチャネル数 よりも小さい値を選べば、それらの割合にほぼ等しい割合で計算量を削減できます。

また、最大プーリング処理の後処理の1x1畳み込みは、プーリング処理によってチャネル数は変わらないため、基本的に前の層のチャネル数を減らすために使われます。これはさらに後の層でのチャネル数を圧縮して計算量を減らすために用いられます。

蛇足ですが、Inception Networkの名前の由来は、"The Inception"という映画で、レオナルドディカプリオが次のように発言したことが由来とのようです。

We need to go deeper

分類器の追加

これまでのニューラルネットワークではネットワークの最深部に分類器がありましたが、場合によっては浅い層でのネットワークのパフォーマンスがよいことがあります。GoogLeNetでは、ネットワークで分類器を複数挿入してあります。 そして、それぞれの分類器の結果は最終的な損失関数に足されてひとつの結果としてまとめられます。論文中ではそれぞれ0.3で重みづけをして合算されています。こうすることで過学習を防止し、正則化の効果と同じ黄河が得られます。

オープンソースの活用

最新のディープラーニングの多くの研究成果は、オープンソースとして公開されています。これは、ディープラーニングがうまく働く理由が完全に解明されていなく、証明する方法が他にないためということも一つあります。そのため、Andrew Ng先生はディープラーニングを始めるときは、GitHubからソースコードをダウンロードしてそれを改良いていくところからはじめることをおすすめしています。

転移学習

公開されているのはソースコードだけでなく、学習済みのパラメーターも公開されていて、ダウンロードが可能です。そのような学習済みのパラメーターを活用して新しいユースケースに対応させることを転移学習といいます。

画像認識を例に挙げると、猫を分類するCNNがあったとして、犬を分類する新しいユースケースに対応させたい場合、分類させたい対象物が異なるだけで、猫の分類用に訓練した結果というのはほとんどが流用可能ということです。

具体的には、学習済みのCNNから最後層ののソフトマックス層を取り除き、ユースケースに応じたソフトマックスユニットに入れ替えて、入れ替えた層のみ訓練してやればよいです。

各種ディープラーニングフレームワークにおいては、trainableParameter=0freeze=1といったパラメーターを設定すると各層の訓練の可否を指定できます。

新しいユースケースにおいて、データセットがたくさんある場合は、より精度を上げるために、最新層だけでなく深い層の何層かを訓練してもよいかもしれません。このとき、隠れ層ごと書き換えてもよいです。

さらにデータセットがたくさんある場合は、初期値として学習済みの重みを使って、すべて学習しなおすということもできます。

データ拡張 (Data Augumentation)

ディープラーニングにはデータセットが大量に必要がですが、その収集は容易いものではないことの方がほとんどではないかと思います。そのため、人工的にデータセットを増やす方法について考えます。

なお、ここでは基本的には、コンピュータービジョンを対象として画像データの増やし方について説明します。

一般的に使われるデータ拡張の方法として下記の3つが使われます。

  1. 反転
  2. ランダム切り抜き
  3. 変色(カラー写真の場合)⇒確率分布で変色する(主成分分析アルゴリズム(PCA Color Augumentation)を使う) これだけでデータ数は数十倍に増やすことが可能です。

その他にも、回転、剪断変形、局所変形といったやり方もありますが複雑なためあまり使われません。

Kerasの使い方

KerasとはTensorFlow等のディープラーニングフレームワークを活用した高位概念でニューラルネットワークを実行できるライブラリです。公式には次のように説明しています。

Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです. Kerasは,迅速な実験を可能にすることに重点を置いて開発されました. アイデアから結果に到達するまでのリードタイムをできるだけ小さくすることが,良い研究をするための鍵になります.

次のような場合で深層学習ライブラリが必要なら,Kerasを使用してください:

  • 容易に素早くプロトタイプの作成が可能(ユーザーフレンドリー,モジュール性,および拡張性による)
  • CNNとRNNの両方,およびこれらの2つの組み合わせをサポート
  • CPUとGPU上でシームレスな動作
Kerasの実行の流れ

Kerasでのディープラーニングを行う手順は次の通りです。

  1. ディープニューラルネットワークのモデルを作る
  2. モデルをコンパイルする
  3. モデルをTrainデータセットで訓練する
  4. モデルをTestデータで検証する
  5. 訓練したニューラルネットワークで予測する
1. モデルを作る
  • 2D Convolution
keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

公式説明: https://keras.io/layers/convolutional/#conv2d

  • Batch Normalization
keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

公式説明: https://keras.io/layers/normalization/#batchnormalization

  • Activation Function
keras.layers.Activation(activation)

公式説明: https://keras.io/layers/core/#activation

  • Max Pooling
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

公式説明: https://keras.io/layers/pooling/#maxpooling2d

2. コンパイルする
  • Compile
compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

公式説明: https://keras.io/models/model/#methods

  • Optimizer
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
 

公式説明: https://keras.io/optimizers/#adam

  • 各種損失関数

公式説明: https://keras.io/losses/

3. 訓練する
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

公式説明: https://keras.io/preprocessing/image/#fit

4. 検証する
evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)

公式説明: https://keras.io/models/model/#evaluate

5. 予測する
predict(x, batch_size=None, verbose=0, steps=None)

公式説明: https://keras.io/models/model/#predict


今回は以上です。 最後まで読んでいただき、ありがとうございます。
CourseraのDeep Learning専門講座の他のコースの受講メモ

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法

【レビュー】 格安VPSサービスTime4VPSを1年強使ってみてわかったメリット・デメリット・注意点