今回から名前はよくきくディープラーニングに入ります。
まずはイメージをつかむところから。
pythonによる実装には入れませんでしたが、今後、pythonによる実装を行う予定です。
ディープラーニング(深層学習)
ディープラーニング(英: Deep learning)または深層学習(しんそうがくしゅう)とは、(狭義には4層以上[1][注釈 1]の)多層の人工ニューラルネットワーク(ディープニューラルネットワーク、英: deep neural network; DNN)による機械学習手法である。
ディープラーニングは機械学習の手法の一つとなります。
一般的には後述するニューラルネットワークの中間層を深く(多重に)とったものを指し、そのモデルをDNN(ディープニューラルネットワーク)と言われることもあります。
近年の第三次人工知能ブームはディープラーニングの発達による各分野への活用が後押しが大きいといわれています。
機械学習とディープラーニングという分類は正しくはないですが、ディープラーニングとそれ以前の機械学習を比較したときに「ディープラーニングはデータから機械自身が特徴を抽出する」という特徴があります。
ニューロンモデル
ここではニューロンモデルの概要をつかみ、「ここでの(ブログ内での)言葉の定義」を行います。
ここでのというのは似たような言葉がでてきたり調べるとやや言葉が揺れているようなものもあるので、学習していくにあたってこのブログでの言葉の定義と確認を行います。
■ニューロンモデルとは?
人間の脳の神経細胞(ニューロン)を参考にしたモデルのことになります。
本来の神経細胞自体もニューロンモデルと言うことができるため、区別のために特に人工ニューロンモデルと言うそうです。
ここでは機械学習に使用されているモデルのことをニューロンモデルと言います。
基本的には後述するニューラルネットワークモデルと区別するために、ニューロンモデルは最小要素を指すこととします。
人間の神経細胞の図についてはここでは割愛します。ちょっと調べればいろいろでてきます。
■ニューラルネットワークモデルとは?
では、同じような言葉として聞くことがあるニューラルネットワークモデルとはなにか。
ここではニューラルネットワークモデルは人工ニューロンモデルを使用して表現したディープラーニングの学習モデルとします。
つまり以下のような図はニューラルネットワークモデルと呼ぶことにします。
次にニューラルネットワークモデルの構成要素について。
ニューラルネットワークモデルはデータを入力する入力層、最終的なデータを出力する出力層そしてその間に存在する中間層から成ります。
また、それぞれの層に存在する一つ一つの要素(上記図の●)を「ニューロン」と定義します。
ディープラーニングでのモデルは中間層が多層になるため、前述のとおり特にDNN(ディープニューラルネットワーク)と呼びます。
ニューラルネットワークモデルにもいくつかの種類があるようですが、今回は基本的なフィードフォワードニューラルネットワークモデルを扱います。
ニュートラルネットワークモデルをよみとく
さて、ニュートラルネットワークモデルの概要図はディープラーニングについて調べているといくども目にしたことはありました。
しかし、実際のところそれがなにを表現しているのかわかっていませんでした。
なので、ここではニュートラルネットワークモデルが何を表しているのかということを自分なりに読み解いていきたいと思います。
恐らく根底まで理解するのは厳しいと思いますが、層が3層ある以上の理解を目指します。
※学習しながらの記述なのでもしかすると間違いがあるかもしれません。
その前に問題設定
ただただモデルを追っていくと理解が難しい部分もあるので、仮の問題設定を行います。
以前の「分類」で設定した問題と同じです。
がく片の長さとがく片の幅のデータからアヤメの分類を行う問題。
・入力値
0 | sepal length (cm) | がく片の長さ |
---|---|---|
1 | sepal width (cm) | がく片の幅 |
・アヤメの分類
0 | setosa(ヒオウギアヤメ) |
---|---|
1 | versicolor(ブルーフラッグ) |
2 | virginica(バージニカ) |
全体像
ニューラルネットワークモデルの概要図を簡略化して少し詳しくみていきます。
モデルの入力層には入力値となるxをそれぞれ割り当て、そこに重み(W)をかけることにより中間層としてさらにそこに重み(V)をかけることによって結果(出力層)を出力します。
結果はクラスに分類される確率と考えます。
つまり、上記のモデルでは入力値から3つのクラスへの分類を表しており、それぞれの出力値は入力値に対するクラス分類の妥当性を表す確率を表します。
■ニューラルネットワークの層の数え方
ニューラルネットワークでは実際に処理をする層で数えるのが通例となっているようです。
つまり、入力層、中間層(1層)、出力層が存在する上記の図では、中間層で一層、出力層で一層を数えて2層のニューラルネットワークと呼びます。
入力層から中間層への考え方
まずはニューラルネットワーク図の中の入力層部分に着目します。
入力層のxは入力値となる要素を表しているので例では以下のように考えることができます。
ここで気になるのは残った「x2」ですが、これはダミー入力になります。
以前も同じような考え方を適用していますが、計算上の総和を求められるようにするために設定しているので値は必ず「1」になります。
中間層に渡すために入力値に重み(W)をかけます。
重みは以下の形で表します。
ここで「j」は中間層の番号を表し、「i」は入力層の番号を表しています。
以下のようなイメージをしました。
■入力総和(b)
次に中間層の入力総和を求めます。
入力総和は一つのニューロンに対する入力の「総和」なので、入力値と重みをかけた値を合計したものになります。
一つのニューロンに対する例を以下に示します。
これはΣを使用して以下のように記述することができます。
このような重みなどで一見分かりにくい(?)表現がされているようにも見えますが、このような表現は行列と相性がよく入力層から中間層にかけてを以下のような行列表現を行うこともできます。
中間層での処理
中間層には入力層からの入力総和を入力値としましたが、それをそのまま出力値とするわけではありません。
入力値(入力総和)を関数にかけてから出力値とします。
そのときの関数は「h()」で表すのが慣例なようで、活性化関数と呼ばれます。
今回はシグモイド関数を用いているという想定で以下の通り中間層の出力値とします。
中間層から出力層への考え方
基本的な考え方は入力層から中間層への考え方と同様でよいようです。
中間層からの出力値を「z」として重み「v」をかけて合計を求めることで出力層の入力総和「a」とします。
またダミー(バイアス)についても中間層でも存在します。
・入力総和
出力層についても、入力総和から関数を通して出力値とします。
他のパターンもあるかもしれませんが、出力層での関数はソフトマックス関数を適用します。
出力層の出力値は最終的な結果であり、各クラスに分類される確率を表します。
そこでソフトマックス関数を用いることによって結果の合計が「1」になるのでその性質がフル活用できます。
中間の結果イメージがまだついていないので誤魔化しますが、最終的に以下のようなイメージを持ちました。
ーーーーーーーーーーーーーーー
難しくて疲れたからここまで。
Python使うところまでいけなかった。もう少し進めば理解進むかな。