読者です 読者をやめる 読者になる 読者になる

竹林のゆとりブログ

山奥で生活し、日々の思いをつらつらと書くブログ。 IT、数学、アニメなど。

数学屋さんが深層学習についてまとめてみた①

深層学習の本を読み終わりました。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

今まで読んだ本の中で一番わかりやすかったので、Deep Learningの知識をこの本をベースにまとめてみます。

ただ、数式は出てくる割には、数学的な理解がしづらい内容で、こんなんだと、『数学、わからんorz』となると思ったので、可能な限り数学的に厳密に書いてみます。 ちょっとでも数学的な話が伝わればいいかなと思います

今回は教科書の2章『順伝播型ネットワーク』について説明します。 (1章は歴史なので、省略します。)

順伝播型ネットワークの定義

最初に、順伝播型(ニューラル)ネットワーク(feedforward neural network)を定義します。 この本やWebで定義と書かれている箇所を読むと、なんとなくはわかります。 例えばWikipediaを引用すると、以下になります。

最初に考案された、単純な構造の人工ニューラルネットワークモデル。ネットワークにループする結合を持たず、入力ノード→中間ノード→出力ノードというように単一方向へのみ信号が伝播するものを指す。

各層を  X_i と置くと、下記漸化式で表現される。3層の場合は、 X_1 が入力層、 X_2 が中間層、 X_3が出力層。

{ \displaystyle
X_{i+1} = f(A_i X_i + B_i)
}

これの何が問題か?

数学的に定義になっていません。例えば…

この教科書でも全文通して、同じ問題があるので、工学系ではどこにあるのかは適当なんでしょうね。 なので、読める範囲を使って、暫定で、数学的に定義してみましょう。

f:id:fatal-t-h-f-flydream-bamboo:20160508195120p:plain

定義だけみても、(数学に慣れていない限り)すぐわからないと思いますので、説明します。

  •  F:\mathbb{R}^n \to \mathbb{R}^m。これはFが定義域 \mathbb{R}^n 、終域 \mathbb{R}^m 写像(関数)です。また、  x \mapsto y  F(x)=y を意味します。数学で写像を定義する時に、よくこう書きます。
  • kは層の個数を表します。つまり、今回、k層のニューラルネットワークを考えています。
  •  n_iはi層目のユニットの数です。 W_iはi層目からi+1層目への重みによって定められる行列、 b_iバイアスです。
  •  f_iは活性化関数と言われているものです。

Remark

 f_iから誘導される方法で、 \tilde{f}_iを定義していますが、もっと複雑な関数を \tilde{f}_iに定義した方が、Fとして、様々な関数が表現できます。 この本に書いてる活性化関数が \mathbb{R}から \mathbb{R}への関数となっていたので、上の定義としました。

活性化関数の例

活性化関数には、単調増加する非線形関数がよく用いられます。 それが妥当な理由は特に本に記載がありませんでした。 私の予想ですが、複雑さを出すために、非線形関数を使います。しかし、その関数を複雑すぎると難しいことになります。 そのため、単射性により、逆写像が定義できるようにしたかったのではないでしょうか。 単純に計算のしやすい関数が持ってる性質の一つとして、単調増加があるだけな気もしましたが…。

ひとまず、よく使われるものを例として書きます。

f:id:fatal-t-h-f-flydream-bamboo:20160508195745p:plain

出力層の設計と誤差関数

ニューラルネットワークの定義をしたので、実際にどういう問題を解きたいのかについて説明をします。

f:id:fatal-t-h-f-flydream-bamboo:20160508200651p:plain

最も近いを""でくくったのは数学的に定義していないためです。 最も近いが何かを考えてみましょう。 例えば、 \mathrm{max}_{x \in \mathbb{R}^n}|F(x)-\tilde{F}(x)|が最小な時に最も近いと考えるのはどうでしょう。 y座標の差が一番小さい時≒関数同士の"距離"が一番小さい時という発想です。 数学的には自然なものの一つですが、プログラミングでは無限を扱えないという問題があるので、簡単には計算できません。

そのため、ニューラルネットワークではN個の訓練データ (x_i,F(x_i)),(i=1, \dots, N)から使います。 つまり、"最も近い"を F(x_i)-\tilde{F}(x_i)が"最も近い"とみなします。 これによって有限の問題に還元されました。 また、"最も近い”は"誤差関数"が最小という形で定式化します。 具体的な誤差関数は問題の例と一緒に説明します。 誤差関数は自分が解きたい問題の状況に応じて変更することだけ注意しておいてください。

回帰

回帰と呼ばれる問題について考えましょう。

回帰とは、主に出力に連続値をとる関数を対象に、訓練データをよく再現するような関数を求めることをいいます。 この場合、ネットワークの出力層の活性化関数にその値域が目標とする関数のそれと一致するようなものを選ぶ必要があります。

今回は教科書より定義(と思われるところ)を引用しました。 これ読んで、みなさんわかったってなるんですかね。定義に主にが使われるのは理解しかねるんですが・・・。 統計では使われるみたいですが、連続値も違和感があります。 連続は"あるもの"と"あるもの"の関係の上に定義される言葉だと思っています。 なので、値に対して定義されるのは気持ち悪い。 実際、数学では連続は位相空間から位相空間への写像で、ある性質を満たすものとして、定義されます。 ひとまず、 \tilde{F}が連続関数の時に回帰と呼ぶと考えます。

厳密に問題を定式化しましょう。

f:id:fatal-t-h-f-flydream-bamboo:20160508200333p:plain

これはFを構成する W_iを求めることに等しいです。

ただ、問題をみて、まずいくつか考えてもらいたいことを補足します。

  • 最小となるFは存在するのか。
    上の問題からすぐに最小となるFが存在するかわからないですよね。数学的には存在がすぐいえるものではないでしょう。ただプログラムは有限の世界で扱うので、必ず最小となるものが存在します。
  • 初期値はどうするのか
    数学的に問題を解く時に初期値なんてありませんが、プログラムで問題を説く場合、初期値を与えて、それから計算を繰り返して、最小値を導出します。  W_iは最初にどの値をいれるのがいいでしょうか。これも明確な答えがあるわけではありません。最近は自己符号加器などがうまれ、それから、初期値を定めるのが適切と言われていますが、経験則だそうです。

実際にプログラム的にどうやって解くのがいいかは次の章で記述します。

他にも例はありましたが、ひとまずこの辺で。 3章以降についてもまとめたいと思います。

では。