畳み込みネットワーク(CNN)へのモデルの拡張|高校数学の演習を通して理解するニューラルネットワーク #6
当連載は、高校数学の演習を通して機械学習のアルゴリズムの一つであるニューラルネットワークを理解しようというものです。連載の経緯につきましては#1にまとめましたので下記をご覧ください。
簡単な6題の例題をもとにニューラルネットワークの仕組みに現れる基礎的な数学についてフォーカスします。
#1~#3では6題の例題に関して取り扱いました。
関数・微分の演習と解説|高校数学の演習を通して理解するニューラルネットワーク #1 - lib-arts’s diary
最小値問題と最適化|高校数学の演習を通して理解するニューラルネットワーク #2 - lib-arts’s diary
行列の計算とMLPの推論|高校数学の演習を通して理解するニューラルネットワーク #3 - lib-arts’s diary
#4、#5ではこれまで行った例題の解説の内容を踏まえて、回帰分析の学習の流れの理解からニューラルネットワークへの理解へと繋げました。
簡単な数式で理解する回帰分析の学習の流れ|高校数学の演習を通して理解するニューラルネットワーク #4 - lib-arts’s diary
単回帰分析からニューラルネットワークへの拡張|高校数学の演習を通して理解するニューラルネットワーク #5 - lib-arts’s diary
#6では近年猛威を振るっているCNNへのモデル拡張について取り扱えればと思います。
以下、目次になります。
1. 回帰分析の学習の流れの復習&話の導入
2. CNNへのモデルの拡張
2.1 古典的画像処理とフィルタ処理
2.2 フィルタの自動学習とCNN
2.3 CNNを中心とする近年のDeepLearning
3. DeepLearningにおける誤差関数や最適化
3.1 誤差関数に関して
3.2 最適化に関して
4. まとめ
1. 回帰分析の学習の流れの復習&話の導入
モデルの学習にあたって、(1)数式の定義、(2)誤差関数の定義、(3)最適化を踏みました。詳細については#4、まとめの内容としては#5の1節にまとめた通りなのでそちらをご確認ください。
#5の際と同じく、基本的にはモデルの拡張の話だけわかればあとはこれまでの話の流れで全体像はつかめるかと思います。2節でモデルの拡張について取り扱います。また、3節ではDeepLearningへの拡張にあたって誤差関数や最適化についても軽くだけトレンドに触れたいと思います。
2. CNNへのモデルの拡張
2節ではCNNへのモデル拡張について取り扱います。畳み込みニューラルネットワーク(CNN; Convolutional Neural Network)は畳み込み層(以後Conv層)と全結合層(以後FC層)の二つで基本的には構成されており、FC層については#5で取り扱ったMLPそのものなので、Conv層について2節で主に取り扱っていきます。
畳み込みの処理については難しそうに聞こえますが、考え方自体は昔から画像処理において用いられていたフィルタ処理をベースにしているに過ぎません。フィルタ処理については2.1節で取り扱っていきます。
2.1 古典的画像処理とフィルタ処理
2.1では昔から画像処理において用いられてきたフィルタ処理について取り扱っていきます。フィルタ処理について理解するには下記の二つの問題を先に把握すると良いです。
① 画像から輪郭を抜き出す方法を考えよ(エッジ検出)
② 画像をぼかす方法を考えよ
上記二点について考えていきます。
具体的な例について考えるにあたって、上記のPythonのロゴを用います。
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('file_path',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
kernel = np.ones((9,9),np.float32)/81
dst = cv2.filter2D(img,-1,kernel)plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks(), plt.yticks()
plt.subplot(132),plt.imshow(laplacian,cmap = 'gray')
plt.title('Edge Image'), plt.xticks(), plt.yticks()
plt.subplot(133),plt.imshow(dst,cmap = 'gray')
plt.title('Averaging Image'), plt.xticks(), plt.yticks()plt.show()
結論から言うと上記のコードを実行すると輪郭の検出と画像のぼかしを行うことができます。
簡易化のため画像はグレースケールとしましたが、RGBの3値をグレースケールの一つの値に変更しただけなので本質的にはあまり変わらないです。さて、上記はそれぞれどのような処理を行っているのでしょうか。
まず、輪郭の検出については微分フィルタを用いています。
詳しくは『Image Gradients — OpenCV-Python Tutorials 1 documentation』をご確認いただければと思いますが、上記のフィルタを用いることで変化のあるポイントにおいて値が検出されるようなフィルタを用いています。
次に、画像のぼかし(Smoothing)に関してはAveragingフィルタを用いています。
詳しくは『Smoothing Images — OpenCV-Python Tutorials 1 documentation』をご確認いただければと思いますが、上記のフィルタを用いることで画像をぼかすことが可能になります。
2.2 フィルタの自動学習とCNN
2.1節ではフィルタ処理について取り扱いました。どちらも画像処理において非常に便利な処理ですが、欠点があるとしたらフィルタがヒューリスティック(発見的)であるがゆえに、フィルタ自体の種類がさほどないということです。
ヒューリスティックにフィルタを設定していては種類の数に限界がありますが、ここで2.1で触れた微分フィルタやAveragingフィルタのようなフィルタを自動的に作成できるとしたらどうでしょう。前述の2つの処理だけでかなりの画像の特徴が抜けていましたので、画像認識にさぞ役に立つのではと思われます。
これを踏まえてフィルタをニューラルネットワークで自動学習してしまおうと考えたのがCNNです。前述のConv層ではフィルタをパラメータとみなした上でフィルタ処理と同様の処理を行い、最適化によってフィルタをデータから自動的に学習させます。このことによって、古典的な画像処理においてヒューリスティックだったフィルタの作成をデータから自動的に行うことができることができ、これがCNNが表現力が高い理由となっています。
2.3 CNNを中心とする近年のDeepLearning
前述のようにCNNではConv層とFC層を組み合わせます。DeepLearningブームの火付け役となったAlexNet[2012]はConv層5層、FC層3層のCNNです。それを受けて層の深化を行ったVGGNet[2014]の一つであるVGG16はConv層13層、FC層3層です。
ここまでがオーソドックスなCNNの考え方に基づいたDeepLearningで、Inceptionモジュールを用いたGoogLeNet[2014]やショートカットを用いたResNet[2015]などがそれに続きます。精度を追い求めるネットワークの構造についてはここで一段落し、その後はモデルの軽量化や物体検出や画像生成などの応用タスクへの研究が盛んになっています。
トレンドは色々と変わっていますが、今回触れたCNNの考え方自体は必ずベースになっているので、しっかりベースをおさえていればキャッチアップは容易だと思います。
3. DeepLearningにおける誤差関数や最適化
3.1 誤差関数に関して
DeepLearningを含むニューラルネットワークの誤差関数は最小二乗誤差ではなく、交差エントロピー誤差がよく用いられています。理論的な裏付けとしてはPRMLの(5.20)、(5.21)式あたりで最尤法から交差エントロピー誤差を導出しているのでそちらをご確認いただけたらと思います。誤差関数の持ち方は問題に応じて色々と変わるので、例えば物体検出や画像生成などの応用タスクの場合にはそれぞれ問題に応じた誤差関数を設定します。
ここでは最初から詳細を追うとしんどいので、一旦交差エントロピー誤差というのを用いていてそれは最小二乗誤差と同様の目的で似たような働きをする、とだけ理解しておけば十分だと思います。
3.2 最適化に関して
最適化についても単なる勾配降下法(GD; Gradient Descent)の説明にとどめていましたが、SGD(Stochastic Gradient Descent)、ミニバッチ法、Momentum、Adamなど様々な最適化手法が考案されています。
とはいえこちらも目的は勾配降下法と変わらないので、一旦似たような働きをする手法が色々とあるとだけおさえておけば十分だと思います。
4. まとめ
今回はCNNについて簡単に解説しました。
#7以降は何回かに渡って例題をベースに理解を深めるにあたってこれまで説明してきた内容に関して問題演習とそれぞれ解説を行えればと思います。
問題演習を通して実際にしっくりくるまで試してみていただけたらと思います。