汎用関数
普遍性定理
「Deep Learning概論」でお話したとおり、理論的に多次元ベクトル関数 があれば自動運転の自動車は完成するのですが、これを少し抽象的に捉えると、「任意のデータサンプルからそのような出力(近似値)を得る多次元ベクトル関数を作り出すことは可能か」という命題に帰着することができます。
ニューラルネットワークによる比較的単純な関数を利用することで、それが可能であることが数学的に証明されています。 これはある種の普遍性をもっており(任意の入力に対して任意の出力を返せる関数を作り出せるという点で)、普遍性定理と呼ばれています。
- ハーン・バナッハの定理(関数解析学)
- リースの表現定理(関数解析学)
- フーリエ解析(解析学)
を使って証明するのですが、DeepLearningを理解するまたは使いこなすという立場からは、この厳密な証明の必然性は弱いので、ここでは直感的な理解のための説明をしたいと思います。(それでも多少の数学の知識は必要となります。)
まずは、一次元でこのこと(任意の関数を作り出せること)を確認します。一次元でこの普遍関数を理解できれば、線形代数の知識を使うことで多次元関数もその延長にあるということをイメージできるかと思います。
例えば、関数
を作りたいとします。
どうやってこの関数を作り出すのでしょうか。 わかりやすく結論からいえば、
ステップ関数を重ねて作り出す
といことになります。
ステップ関数とは特定の定義域でのみ一つの値をとって、それ以外の定義域では0を返す関数のことです。
関数 をステップ関数の和で表現するには
として
と定義すると はかなりラフでありますが、-5 <= x < 5でそれなり(最大誤差 )に に近い値をとる関数になります。
もっと一般的な関数について考えてみましょう。
仮に
が具体的にどんな関数かをしらずに
を満たす
の組を10000個与えられたとします。
これを以下のとおり表現します。
与えられた10000個のデータを
として
とする(すなわち を昇順に並び替える)。
この時 関数 を |
と定義し
とすると、 が への近似関数になることはわかってもらえると思います。
このように、サンプリングデータから関数を作るプログラムは、比較的に簡単に実装可能ですが、この作り方によってできる関数 には重大な欠点があります。
それは それは、関数の実行速度です。単純に考えて、サンプリングデータが増えれば増えるほど、 関数はその内部処理において条件分岐が比例して増えていきます。
この関数は1次元の関数でサンプリング数も1万程度なので、実際にこのようなやり方で関数を作ったとしても、それなりの速度で動くかもしれませんが、例えば画像データをサンプリングデータとして使う場合、入力データは100pixel*100pixelの比較的小さい画像でも、1万次元のベクトル値になり、10万枚の画像データを入力値で場合分けした場合、区分の場合分けは、 という天文学的数となり、その関数は実用的な速度で動作するとは思えません。
関数を作り出す時の時間がそれなりにかかったとしても、 を使う時には高速に動作してほしいのです。
さらにこの手法は1次元の入力値の場合は比較的簡単に定義域を上記の手法で分割、well-definedな形で定義可能ですが、n次元になった場合には、サンプリングデータが存在しない定義域が発生してしまうため、この定義域に対する結果をどのように設定すべきかは簡単には決められません。
この問題を解決するのが、ニューラルネットワークをヒントに生まれた関数ということになります。
それは次のようなものです
これはいわゆる隠れ層が1層で、 個のニューロンを持つニューラルネットワークが作り出す関数です。 この と と を調整することで任意の関数の近似関数が得られるということになります。
「なぜこの関数により任意の関数の近似関数が得られるのか」、「近似関数を得るための はどのように求めることができるのか」、を次回以降の記事で解説していきたいと思います。