自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

(その1) Pythonでニューラルネットワークを構築しながらディープラーニングを勉強してみる

Python
Python

最近ディープラーニングを使う機会が多くなってきています。

TensorFlowやPyTorchなど優秀なライブラリを使えばすぐに試すことができますし、GitHubでYOLOやMaskRCNNなどのアルゴリズムを実装して公開してくれている方もいるのでただ利用するだけであれば業務適用するのにも時間がかかることも少なくなりました。

しかし利用することに一生懸命になっているので、そもそもディープラーニングの理論や概念の理解が疎かになっていると感じるようになってきました。

また、年々新規のより複雑なアルゴリズムが発明されてはキャッチアップしていくことが求められます。

せっかくデータ分析のブログを運営しているので、勉強していることをまとめることによって知識の整理をしたいと思います。

流れとしては下記のような感じで勉強していこうと思います。

  1. ディープラーニング関連の用語の整理
  2. ニューラルネットワークの実装(Multi-Layer Perceptron)
  3. 畳み込みニューラルネットワークの実装(CNN)

ディープラーニングなのになぜニューラルネットワークの理解をする必要があるのかという疑問を持たれた方もいるかと思いますが、ディープラーニングはニューラルネットワークを多層化したもののようなので、まずはベースになる知識から勉強した方が良いかなという理由からです。

ディープラーニングの技術は、人間の神経細胞(ニューロン)の仕組みを模したシステムであるニューラルネットワークがベースになっています。ニューラルネットワークを多層にして用いることで、データに含まれる特徴を段階的により深く学習することが可能になります。
引用: https://jp.mathworks.com/discovery/deep-learning.html

またこれは実体験になりますが、私はまずディープラーニングの本を読みました。(仕事ではディープラーニングでモデルを学習するといったことは並行してやっていた。)

主に「ディープラーニングを支える技術」と「ディープラーニングを支える技術2」を2周ほど読んでみたのですが、雰囲気を掴むところや重要な用語を把握することまでは出来たのですが、それでも内容を自分の中で納得するほど理解するところまでは至りませんでした。

本の内容はかなり丁寧に説明してくれているので、単純に私がそもそもベースになるニューラルネットワークというものを理解しなさすぎていることが原因だと思います。

そこで「ニューラルネットワーク自作入門」という本を購入し読んでみたら、今まで点と点だった分が線になったような気がしました。例えば学習率勾配投下法がどういうものなのかが理論やPythonコードでの実装と共に説明されており、なるほどそうだったのかと理解度が深まったと感じています。

説明が長くなってしまいましたが、結論まずは単純な構成のニューラルネットワークの理解から進めた方が遠回りせずに学習が進むと個人的には感じています。

スポンサーリンク

そもそもニューラルネットワーク(Neural Networks)とは何か? 言葉の意味を調べた

ニューラルネットワークとは実際の生物学的なヒトの脳内の神経細胞のネットワーク(回路)のことか、AI問題を解決するために構築される人工的な神経細胞(Artificial Neural Networks)のことを指すようです。本記事で出てくるニューラルネットワークという言葉はもちろん「人工ニューラルネットワーク」を意味しています。

A neural network is a network or circuit of biological neurons, or, in a modern sense, an artificial neural network, composed of artificial neurons or nodes. ... Thus, a neural network is either a biological neural network, made up of biological neurons, or an artificial neural network, used for solving artificial intelligence (AI) problems.
引用: https://en.wikipedia.org/wiki/Neural_network

よく出てくる単純な構成の人工ニューラルネットワークはインプットレイヤー x 1つの隠れ層 x アウトプット層の3層で表現されることが多いです。(vanilla neural networksと参照されることもある)

順伝播型(Feedforward)のニューラルネットワークになっており、ニューロンが循環したり逆戻りすることがなく同じ方向へデータが伝達されていきます。

Fig. 3層(1 hidden layer)のニューラルネットワークの例

順伝播型のニューラルネットワークを一括りに「多層パーセプトロン」と呼ぶことが多いですが、情報伝達するときに利用する活性化関数によっては別の名称を使うこともあるようです。(RBF networksなど)

似たような構成なのに名称が異なることや特定の名称のニューラルネットワークを曖昧に利用することがあることが理解を難しくしている要因の一つではないかと思います。(曖昧な部分があるからこそ様々な解釈が生まれてしまう)

scikit-learnでは多層パーセプトロン(Multi-Layler Perceptron)が実装されており、以前本ブログでも「(その4-4) エイムズの住宅価格をニューラルネットワークで予測してみた」の記事で住宅価格を多層パーセプトロンを使って予測しました。

スポンサーリンク

ディープラーニング(深層学習)とは何か

「ディープラーニング」は人工ニューラルネットワーク(ANNs)と表現学習(システムによって自動的に生データの特徴を捉えさせる方法)をベースにした広い定義での機械学習の手法の一つになるようです。

近年、多層の人工ニューラルネットワークであるディープニューラルネットワークや畳み込みニューラルネットワークなどが広く認知されていますが、ディープラーニングはあくまで階層化構造を持たせて学習させる手法であるようなので、ニューラルネットワーク以外の機械学習フレームワークにも適用可能な概念のようです。(日本語版のwikipediaには Deep Learning (Adaptive Computation and Machine Learning series)を参照し、「ニューラルネットワークよりも抽象的な深層学習の数学的概念が模索されている最中にある」と説明されている。)

Deep learning (also known as deep structured learning) is part of a broader family of machine learning methods based on artificial neural networks with representation learning. Learning can be supervised, semi-supervised or unsupervised.
引用: https://en.wikipedia.org/wiki/Deep_learning

「ディープラーニング=ニューラルネットワーク」などと解釈される事が多いが、学界ではニューラルネットワーク以外の手法も含めた抽象的な概念として説明される
引用: https://ja.wikipedia.org/wiki/ディープラーニング

"deep learning" ... can be applied in machine learning frameworks that are not necessarily neurally inspired
引用: https://www.deeplearningbook.org/contents/intro.html (p14)

ちなみに順伝播型のニューラルネットワークが複数の隠れ層を持った場合、ディープニューラルネットワークと呼ばれるようになるようですが、どのくらいの深さからそう呼ばれるのかは明確の基準はないようです。

しかし、基準として2つ以上の隠れ層が存在する場合にディープニューラルネットワーク(DNNs)と呼ばれることが多いようです。

Fig. ディープニューラルネットワーク(DNNs) [隠れ層が3つある例]
スポンサーリンク

畳み込みニューラルネットワーク(CNN)とは何か

よくディープラーニングについて調べたりすると畳み込みニューラルネットワークの情報が出てくるかと思います。Wikipediaの説明を確認すると下記のように定義されています。

『畳み込みニューラルネットワークとは、通常の行列乗算の代わりに少なくとも1つ以上の層で「畳み込み」という数学的手段を用いて構築された特殊な人工ニューラルネットワークのことを指すようです。特にピクセルデータを処理するために設計され、画像認識や画像処理に利用されています。』

Convolutional neural networks are a specialized type of artificial neural networks that use a mathematical operation called convolution in place of general matrix multiplication in at least one of their layers.They are specifically designed to process pixel data and are used in image recognition and processing.
引用: https://en.wikipedia.org/wiki/Convolutional_neural_network

難しいですね。。畳み込みって何だってなりますね 笑 なので時間かけて色々調べて自分なりにCNNを解釈してみました。(CNNのアーキテクチャによる違いはあるかも知れません)

Fig. 畳み込みニューラルネットワーク(CNN)

畳み込み層についての説明

写真などを保存するのに使われているのはラスター画像形式と呼ばれていてピクセルデータの集まりになっているようです。

CNNは「畳み込み」処理の中でカーネルと呼ばれるフィルタを使い、ピクセル全体を移動しながら元画像の特徴を表現した特徴マップと呼ばれる新しいピクセルデータを作成します。

カーネル自体は任意の値で初期化されますが、学習する時に勾配降下法によってカーネルの値を最適化していくようです。(これはCNNを実際に構築する時に確認してみようと思います。)

ちなみに、カーネルの数や大きさはハイパーパラメータになっており自分で任意の値を決定することも出来るようです。なので特徴マップを100個以上作成することもカーネルの数を設定すれば出来るようです。

The kernels are usually initialized at a seemingly arbitrary value, and then you would use a gradient descent optimizer to optimize the values, so that the kernels solve your problem.
引用: https://ai.stackexchange.com/questions/5092/how-are-the-kernels-initialized-in-a-convolutional-neural-network

活性化関数についての説明

「畳み込み」処理で特徴マップを作った後は「活性化関数(主にReLuなど)」を使い非線形性をモデルに追加します。

なぜモデルに非線形性が必要なのかは「ニューラルネットワークに活性化関数が必要な理由」の記事が簡潔に数式を含めて説明してくれていますが、非線形の活性化関数を追加しないと層を深くしても結局は1層の畳み込みレイヤーの効果しか得られないからのようです。

ReLU applies much-needed non-linearity into the model. Non-linearity is necessary to produce non-linear decision boundaries, so that the output cannot be written as a linear combination of the inputs. If a non-linear activation function was not present, deep CNN architectures would devolve into a single, equivalent convolutional layer, which would not perform nearly as well.
引用: https://poloclub.github.io/cnn-explainer/

プーリング層についての説明

「畳み込み」、「活性化関数」と来たら次は「プーリング」です。(もしかしたら、畳み込みのすぐ後に来る場合もあるかも知れません)

「プーリング」はCNNのアーキテクチャによってMax PoolingやAverage Poolingなど様々な種類がありますが、どれも目的はピクセル群を特定の単位で集約し、次元を削減することにあります。

次元を削減するとは言い換えれば特徴マップのサイズを小さくするという意味になります。そのためダウンサンプリングとも呼ばれるようです。

サイズが小さくなることで、例えば計算量が減り学習時間が早くなる恩恵があります。

また、複数のピクセルをまとめてしまうのでデータのノイズが除去されオーバーフィットを防ぎやすくなるというメリットも生まれます。

There are many types of pooling layers in different CNN architectures, but they all have the purpose of gradually decreasing the spatial extent of the network, which reduces the parameters and overall computation of the network.
引用: https://poloclub.github.io/cnn-explainer/

平滑化・全結合・ソフトマックス変換

プーリングまで終わったら次は平滑化です。平滑化はシンプルに特徴マップを1次元配列に変換することです。

その後、変換した1次元配列を全結合層にインプットとして投入し、クラス分類をする流れになります。

最終的に出てきたアウトプットにソフトマックス関数を適用することで、ネットワークの出力を確率分布化することが可能になります。

確率分布化するとCNNのサンプル図にまとめたように、バスの確率0%・てんとう虫の確率99%・カブトムシの確率1%などという結果を取得することが可能になります。

CNNについてのまとめ

「畳み込み」、「活性化関数」、「プーリング」についてどういうものか調べてみました。

今回は簡単なCNNの例をまとめてみましたが、実際は色々なCNNのアーキテクチャが発表されており、種類によっては畳み込み層とプーリング層が複数回繰り返されるものなどが存在します。

ここまで複雑になると実際に動作確認しながら学習したいところですね 笑

今後のステップでCNNをPythonで実装してみようと思うのでより理解が深まることを期待しようと思います。

スポンサーリンク

まとめ

この記事を書くのに結構時間がかかってしまいました 笑

最初はディープラーニングについてまとめる予定でしたが、根本的にはニューラルネットワークことについて学習していくことになりそうです。

改めてニューラルネットワークというものに真摯に向き合ってみましたがとても奥深いものだと感じました。

まだ多層パーセプトロン畳み込みニューラルネットワークのことしか書いてないのですが、領域ベースの畳み込みニューラルネットワーク(RCNN)についても調べていかないといけないですね。

CNNが理解できればRCNNも理解出来るかも知れない淡い期待を抱きながら、まずは簡単な3層の多層パーセプトロンをPythonで実装してみようと思います。

スポンサーリンク

参照

https://en.wikipedia.org/wiki/Deep_learning
https://ja.wikipedia.org/wiki/ディープラーニング
https://en.wikipedia.org/wiki/Feedforward_neural_network
https://www.baeldung.com/cs/mlp-vs-dnn
https://www.quora.com/How-is-deep-learning-different-from-multilayer-perceptron
https://stats.stackexchange.com/questions/182734/what-is-the-difference-between-a-neural-network-and-a-deep-neural-network-and-w
https://medium.com/towards-data-science/5-most-well-known-cnn-architectures-visualized-af76f1f0065e
https://pixabay.com/photos/ladybug-beetle-coccinellidae-insect-1480102/
https://poloclub.github.io/cnn-explainer/

タイトルとURLをコピーしました