ニューラルネットワークの積分表現理論&積分表現理論改

# はじめに
　こんにちは。そろそろ就職活動継続が辛くなってきた来夏です。正直早くtwitter就活一本に切り替えたい。twitterで送られてくる求人が上質すぎて（給料めっちゃ高いor給料は普通だけどめちゃくちゃ自由な働き方ができる）、正直就活サイトで企業漁るのがバカらしくなってきた。
　この夏はインターン行ってきます。すでにインターン内定取ってるE社、確定しかかってるI社研究所、課題提出したばっかりでまだまだこれからって感じだけど一番行きたいP社、果たしてどうなるのやら。
　それはさておき、今回は私の十八番、ニューラルネットワークの積分表現理論について解説します。昨年10月、機械学習は勉強し始めたばっかりで、なかなか感覚がつかめなかったところにブレイクスルーを起こしてくれた分野で、現在この理論を用いたアルゴリズムの改良について論文を執筆しているところです。
　まあ論文に書くような部分についてはまだ話せませんが、一般的理論やその考察の入り口については話せると思います。

# ニューラルネットの積分表現
## 積分表現
　今回は特に表記がなければ3層パーセプトロン、つまり中間層が1層のものを解説します。
　一般的に、ニューラルネットはどのような計算をしているのか。入力$x\in\mathbb{R}^d$に対する出力$f(x)\in\mathbb{C}$は、次のような計算により導出されています。

>$f(x):=\frac{1}{J}\Sigma^J_{j=1}C_j\eta(a_j\cdot x -b_j)+C_0$

　ただし、各$C_j\in\mathbb{C}$であり、$(a_j,b_j)\in\mathbb{Y}^{d+1}(:=\mathbb{R}^{d+1})$です。この入力層→中間層の重み付けを特別な記号で書くの、数学側の人間ももっと見習っていいと思うの。
　ちなみに、このように関数の値域が複素数である場合、これを複素ニューラルネットといい、二つほどメリットがあります。

>1.極値にハマりにくい
>2.数学的に扱いやすい

　今回重要となるのは2.のほうですね。フーリエ変換とかラドン変換、ウェーブレット変換なんかが絡んでくる以上、値域は複素数のほうが都合がいい。代数閉体だからかな？
　上記のニューラルネットの計算は、適当な関数$T:\mathbb{Y}^{d+1}\rightarrow\mathbb{C}$を用いて$$f(x)=\int_{\mathbb{Y}^{d+1}}T(a,b)\eta(a\cdot x -b)\mu(da,db)$$という積分において、$$\mu(a,b)=\mu_J(a,b):=\frac{1}{J}\Sigma^J_{j=1}\omega_j\delta(a_j-a)\delta(b_j-b)$$と($\mathbb{Y}^{d+1}$上のルベーグ測度に対して)特異な測度を決定した場合であると言えます。
　実際には単関数的に捉えてルベーグ測度と絶対連続にしてしまったほうが、収束定理などを用いた厳密な収束の議論をするには都合がいいのですが、ちょっと単関数を定義するあたりでめんどくさくなるのと、この記事ではそこまで厳密にやらないのでこのままでいきますね。（後日単関数の定義はごまかしつつ書き直すかも）すなわち、$J\rightarrow \infty$で、$\mu_J(da,db)\rightarrow \frac{dadb}{|a|}$になってくれるものとします。別の角度から見ると、ニューラルネットの計算は$$f(x)=\int_{\mathbb{Y}^{d+1}}T(a,b)\eta(a\cdot x -b)\frac{dadb}{|a|}$$という積分の離散近似であるといえるわけです。
　突如現れた$\frac{1}{|a|^s}$については今は気にしないでください。次の項で出てくるリッジレット変換において、積分の中で$|a|^s$を掛けたことに対するつじつま合わせです。

## リッジレット変換
　では、近似したい関数$f(x)$に対して、もしもこの関数$T(a,b)$が解析的に求められたら？　これはかなりいい感じのアルゴリズムが生み出せそうです。そのための数学的概念を説明していきます。
　
>$\bf{定義１}$　リッジレット変換
>$f\in L^1(\mathbb{R}^d\rightarrow \mathbb{C})$に対し、リッジレット関数$\psi\in L^\infty(\mathbb{R}\rightarrow\mathbb{C})$ によるリッジレット変換$\mathcal{R}_\psi f:\mathbb{Y}^{d+1}\rightarrow \mathbb{C}$はこのように定義される。$$(\mathcal{R}\_{\psi}f)(a,b):=\int\_{\mathbb{R}^d}f(x)\psi(a\cdot x-b)|a|^sdx$$

　ヘルダーの不等式より、この積分は$\mathbb{Y}^{d+1}$上任意の点で絶対収束します。
　結論から先に言ってしまうと、このリッジレット変換$(\mathcal{R}\_{\psi}f)(a,b)$こそが、求めたい関数$T(a,b)$そのものになります。
　$s=1$であるとします。これは流派があり、$0$だとユークリッド空間での見通しが良くなります。
　さて、ここで２つの疑問が浮かぶ人が多いと思います。$|a|^s$なんてものをかけるのはなぜかと、そしてなにより$\psi$とかいう突然現れた関数はなにもんだと。
　まず、$|a|$をかける理由についてですが、ぶっちゃけここはなくてもいいです。後の双対リッジレット変換で調整すればいいわけですから（具体的に言うと、上記の積分表現において$\frac{1}{|a|}$が消える）。しかし、これをつけておくことで、後に超関数に対するリッジレット変換を定義するにあたって非常に楽になります。用は数学的に扱いやすくするための都合ですね。
　次にリッジレット関数$\psi$とは何者か。これはざっくり言ってしまうと、特徴量を取り扱うための関数です。下記の再構成公式と呼ばれる定理が成り立つには、後に出てくる汎関数$K$にこのリッジレット関数と活性化関数を代入した値$K(\eta,\psi)$が、ある条件を満たしているような$\psi$を選んでくる必要があります。
$$f(x)=\int_{\mathbb{Y}^{d+1}}(\mathcal{R}\_{\psi}f)(a,b)\eta(a\cdot x -b)d\mu(a,b)\ \ a.e.$$　適切な$\psi$を持ってきてリッジレット変換を離散近似すれば、非常によい初期値が得られます。part.1のゴールは、そのアルゴリズムを導出するところまでです。

## 双対リッジレット変換
　要は逆変換みたいなもんです。

>定義2　双対リッジレット変換
>パラメータ関数$T\in L^1(\mathbb{Y}^{d+1}\rightarrow \mathbb{C},|a|^{-s}dadb)$の、活性化関数$\eta\in L^\infty(\mathbb{R}\rightarrow \mathbb{C})$による双対リッジレット変換は次のように定義される。$$(\mathcal{R}^*\_\eta T)(x):=\int\_{\mathbb{Y}^{d+1}}T(a,b)\eta(a\cdot x-b)|a|^{-s}dadb$$


　ここで$T$は$L^1$ですが、ただのルベーグ測度ではなくリッジレット変換の時にかけた分を割り引いた測度であることに注意しましょう。

## 許容条件
　さて、最後の下ごしらえです。

>定義3　リッジレット関数と活性化関数の集合を定義域とする汎関数
>汎関数$K:L^\infty\times L^\infty\rightarrow\mathbb{C}$を次のように定義する。$$K(\psi,\eta):=(2\pi)^{d-1}\int\_\mathbb{R}\frac{\overline{\hat{\psi}(\zeta)}\hat{\eta}(\zeta)}{|\zeta|^d}d\zeta$$

　ただし、$\hat{f}$で関数$f$のフーリエ変換を表すものとします。
　この積分が0以外に収束するとき、「このリッジレット関数と活性化関数の組は許容条件を満たす」と言います。

## 再構成公式
　さて、いよいよニューラルネットの積分表現理論の核となる定理です。

>定理1　再構成公式
>リッジレット関数$\psi$と活性化関数$\eta$は許容条件を満たすとする。また、$f,\hat{f}\in L^1(\mathbb{R}^d\rightarrow \mathbb{C})$が成り立つとする。このとき$$\mathcal{R}^*\_\eta\mathcal{R}\_\psi f=K(\psi,\eta)f$$が$\mathbb{R}^d$上ほとんど至るところ成立する。

　ちなみにですが、リッジレット変換も再構成公式も$L^2$上に拡張できます。方法は皆さんご存知フーリエ変換の時と全く同じ。まずは$f\in L^1\cap L^2$に対して考察し、あとはルベーグの収束定理とか、$L^1\cap L^2$は$L^2$で稠密であるという事実などを使って証明します。
　再構成公式が成り立つ関数というのは、要するに「3層パーセプトロンで近似可能な関数」ということです。
　ということは、3層パーセプトロンで近似できる関数は

* $f\in L^1$かつ$\hat{f}\in L^1$
* $f\in L^2$

　このどちらかを満たす必要があります。しかし、$f\in L^1$かつ$\hat{f}\in L^1$なら$f\in L^2$です。（関数解析の基礎的な教科書に載ってる定理だけで示せます）つまり、「3層パーセプトロンで近似できる関数のクラスは$L^2$」と言えます。厳密にはバイアス項があるので、「定数を引いたら$L^2$」です。

　※今回は説明していませんが、再構成公式を$L^2$に拡張するにあたって、許容条件に加えて自己許容性という性質をリッジレット関数に課しています。ですので「$f\in L^1$かつ$\hat{f}\in L^1$」という形で考えたほうが、実用上は使いやすいです

# 積分表現理論　改
　あまりにも数学的難易度が高くなるので詳細はお話しません。詳しく知りたい方は[1]の5章を読んでください。

　ここまで説明してきたのは、活性化関数$\eta$が本質的有界性を満たす場合のみです。しかし、近年よく使われている活性化関数のReLu($\eta(x):=max(0,x)$)やSwish($\eta(x):=x\cdot \sigma(x),\sigma$はシグモイド関数)はどう見ても本質的有界ではありません。これらが重宝される理由の一つは「原点から離れても勾配が消失しない」という点であり、それを満たす関数を活性化関数として使おうとすると、どうしても有界性が犠牲になります。
　これを解決するには、「超関数に対するリッジレット解析」というものを作り上げる必要があります。Sonoda&Murata(2015)では、その辺の定式化にめちゃくちゃ苦労した痕跡が見えるので興味がある人は見てみよう！　
　詳しく説明すると長く&難しくなるため結論だけ言うと、ReluやSwishを含む関数のクラスとして用いられるのは緩増加超関数空間$\mathcal{S}^{'}$です。（厳密にはこれを多項式環で割った同値類である「リゾルキン超関数空間」）
　ここで一つ問題が起きます。既存のリッジレット解析と比べ、活性化関数のとれる範囲を拡張した以上、その暴れ馬のような関数が絡む積分を収束させるには、リッジレット関数にはより強い力で上から押さえつけるような関数を使わなければなりません。
　具体的には、活性化関数のとれる範囲を$L^\infty \rightarrow \mathcal{S}^{'}$と大幅に拡張した代償に、リッジレット関数のとれる範囲は$L^\infty\rightarrow \mathcal{S}$とかなり縮小してしまっています。（$\mathcal{S}$は急減少関数空間）
　この場合でも、再構成公式が$f,\hat{f}\in L^1$もしくは$f\in L^2$となる$f$に対して成り立ちます。


# 簡単な考察
　ちょっと積分表現理論を通した「ニューラルネットを深層にする意味」について、私なりの考えを書こうと思います。興味のない方は飛ばして、次の「積分表現理論を用いた事前学習アルゴリズム」の項を見てください。
　ここでは近似可能性についてのみ見るので、3層パーセプトロンで近似できる関数は$L^2$とします。深層学習は中間層の数だけ関数を合成するものとします。（有限個のノード数ならこれは自明ですが、実は積分的ニューラルネットに対してそう見做せるかはけっこう怪しい。けど今回はそれを認めるものとします）
　$f_1,f_2\in L^2$を、$g:=f_1\circ f_2$に対して$g\notin L^2$となるように定義するのは容易です。この時点で「深層にすると表現能力はあがる」という言葉は真であると認めざるを得ないでしょう。
　こうすると何が嬉しいのか。特にこれが発揮されるのは分類問題ではないかなと思われます。
　ニューラルネットを使った分類問題では、ラベルの数だけ出力層にノードを置き、最後にソフトマックス関数を噛ませます。そして入力に対して、離散な値をとる確率変数の予測分布を出力するわけですね。
　ここで、$L^2$関数しか近似できないとすると、ちょっと問題が起きます。まず、各出力層のノードに対して$L^2$となるわけですが（これを認めると全体が$L^2$になるのは、ミンコフスキーの不等式とルベーグ積分の線形性を使えば証明は容易です）、$L^2$関数というのは無限遠点ではすべて0になります。汎化性能を考えると、0に落ちるのは入力$x$が存在しえないようなはるか遠くであってほしいのですが、3層パーセプトロンで近似をするとそれが早い段階で落ちる（$\fallingdotseq$汎化性能が低い）のではないかと考えられます。また、これはが他の出力層ノードとの差異が早い段階で小さくなってしまうということであり、さらにソフトマックス関数を噛ませることで丸め誤差の影響をより受けやすくなってしまいます。
　しかしこれが深層であればどうでしょうか。深層にすると$L^p$性がない関数を近似できます。つまり縛りを破壊できるのです。
　これが深層学習が高い成果を上げている理由の一つなのかなと思ったり。数値的な検証はしてないので雑談として聞いといてください。

　そもそも、$L^p$性と合成自体が相性が悪いということはご理解ください。例えば、$L^2$空間内で同じと見做される$f_1,f_2$を、$L^2$関数$g$に対して$f_1\circ g = f_2 \circ g \ a.e.$が成り立たないようにとることは容易です。


# 積分表現理論を用いた事前学習アルゴリズム
　さて、ここからはいよいよ、具体的に積分表現理論を用いてパラメータの初期値決定する方法についてお話していきます。
　突然ですが、このような$\mathbb{Y}^{d+1}$上の確率測度を見てください。$$d\mu(a,b):=\frac{|\mathcal{R}\_\psi f(a,b)|dadb}{\int\_{\mathbb{Y}^{d+1}}|\mathcal{R}\_\psi f(a,b)|dadb}$$分母はリッジレット変換した関数の、ルベーグ測度に対する$L^1$ノルムですね。要は正規化定数です。ここが有限になるのはリッジレット変換の定義より従います。
　この測度はオラクル測度と呼ばれ、ここで重要になってくる考え方が、**このラドンニコディム導関数の値が大きいノードほど、元の関数の重要な特徴を抽出できている**というものです。
　別の角度から説明しますと、
$$f(x)=\int_{\mathbb{Y}^{d+1}}(\mathcal{R}\_{\psi}f)(a,b)\eta(a\cdot x -b)dadb$$　この積分表現に対して、$(\mathcal{R}\_{\psi}f)(a,b)dadb$が確率測度になってくれれば、そこから$a,b$のサンプリングをして$$f(x)\approx\frac{1}{J}\Sigma^J_{i=1}\eta(a\cdot x-b)$$と計算することができます。$J$はノード数です。
　しかし、このままでは使い勝手が悪いです。$J$をあまりに多く取らなければならないし、なにより$(\mathcal{R}\_{\psi}f)(a,b)dadb$が確率測度になるという仮定が都合よすぎます。この辺のちゃんとした計算を実用的にするのは、今後の我々の課題と言えるでしょう。

　今回は、常識的なサンプル数でこの計算を行うために、リッジレット変換の数値計算を付け加えます。
　つまり、この確率測度から中間層のノード数だけ$(a_j,b_j)$をサンプリングし(これを$\dagger$オラクルサンプリング$\dagger$という)、それを中間層の各ノードの、入力層からの重みづけ及びバイアスの値とするわけです。サンプリングにおいては定数倍は関係ないので、分母の値を具体的に求めなくてもいいのです。（そもそも数値計算困難）
　では、そのノードから出力層への重みづけ$c_j$はどうなるのか。これについては、まずリッジレット変換になるわけですが、まずはその近似式を見てみましょう。$$c_j:=(\mathcal{R}\_\psi f)(a\_j,b\_j)\approx\frac{1}{Z}\Sigma^N\_{i=1}y_i\psi(a_j\cdot x_i-b_j)$$　ただし、$(x_i,y_i)$はサンプルで、$N$はサンプル数です。$Z$は正規化定数で、$Z:=K\_{\psi,\eta}||\mathcal{R}\_\psi f||_{L^1(dadb)}$です。
　さあここで問題が起きました。さっき言った通り、$||\mathcal{R}\_\psi f||\_{L^1(dadb)}$の正確な数値計算は困難です。あらかじめ活性化関数に対してリッジレット関数を決めておけば、$K\_{\psi,\eta}$は地道に手計算できるかもしれませんが。
　ではどうするか。これに対しては4つほど対策が考えられます。

1.線形回帰で近似
2.中間層→出力層は普通にやる
3.Zをフィッティングする
4.定数倍放置

　[1]で使われていたのは1.と2.です。1.は、その中間層で抽出された特徴量から、最小二乗法等で$c_j$の値を計算します。2.は、そもそもこの$\dagger$オラクルサンプリング$\dagger$でいい感じに特徴量を抽出できているのだから、その先は通常の正規分布から始めるやり方でいいだろうという考え方です。ちなみに初期値は1.が圧倒的に優れているものの、最終的にバックプロパゲーションを経た結果は2.が勝ちました。
　3.と4.は私が試したやり方です。3.の1.と違う点は、リッジレット変換によって計算された$c_j$と別の$c_i$の比率がちゃんと保存されるという点ですね。4.はそもそも定数倍を無視します。
　ここで、0.として、通常の正規分布からサンプリングした場合を考えます。これで精度がどうなるかというと

>学習前
>> 1.>3.>>2.>0.>4.

当たり前ですが、初期値は線形回帰が一番強いです。定数倍を放置した4.が最弱

>学習後
>>2.>0.>1.>3.>4.

　なかなか厳しい結果です。特徴量抽出だけを任せたのが一番よく、それ以外は普通の学習方法に負けてしまいました。
　さて、ここでなぜ1と3と4は通常の学習に負けるのか、これは簡単で、1と3は過学習です。初期値がデータ点に対して忠実に近似しすぎているんですね。4.はそもそも初期値からしてぶっ飛んでる。
　じゃあ、ここでドロップアウトをしてみたらどうでしょうか。これは驚くべき結果が出ました。

>学習後(ドロップアウト)
>> 4.>2.>0.>3.>1.

　最も乱暴な4が最強という結果になりました。
　このコード等については、一部githubに掲載しております。https://github.com/Runnrairu/RidgeletCalculus-for-NeuralNetwork
(掲示グラフはドロップアウトありの場合4.>0.となることを示したもの)
<img width="300" alt="oracle.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/238373/6e138b51-41c8-31c1-31f5-d27b29e3738b.jpeg">
　ドロップアウトありの訓練エラーと、ドロップアウトなしのテストエラーを同じグラフに描いてんじゃねえよヴォケという言葉が聞こえてきそうですが、今回だけはご愛嬌ということで。

# サンプリング方法について
　まず、$d$が小さい場合、これは棄却法でサンプリングすればいいです。しかし、ここが大きくなると、どんどん値が不安定になっていきます。
　そこで、変分近似的に単純な測度で近似してサンプリングを行います。具体的な話は参考文献か上記githubを見てください。


# 許容条件を満たすリッジレット関数と考察
　では最後に、有名な活性化関数と、それに対して許容条件を満たすリッジレット関数の例について書いて、最後に少しばかし考察を付け加え、積分表現理論及び積分表現理論改の記事を終わろうと思います。
　$\Lambda$をヒルベルト変換、$g(z):=e^{-z^2/2}$とします。$\psi_i(z):=\Lambda^d\frac{d^ig}{dz^i}(z)$



|活性化関数|許容条件を満たすリッジレット関数の例|
|---------|-----------------------------|
|sigmoid|$\psi_2$|
|step|$\psi_1$|
|ReLu,Swish|$\psi_2$|

　許容条件を満たすリッジレット関数は無数に存在します。線形空間になる。上の表はもっともわかりやすい部分ですね。
　また、実際許容条件を満たさないようなリッジレット関数を採用しニューラルネットを構成すると、関数を近似できないことがよくわかります。
　
　最後に、簡単な考察というか妄言を。
　オラクル分布ってベイズ的に解釈するとニューラルネットのパラメータの事後分布なんですね。今回はこれの近似を事前分布にして学習したわけです。[4]なんかはドロップアウトのベイズ解釈について書いたら論文なんですが、この事前分布をオラクル分布に挿げ替えたらなんかできそう。
　積分的ニューラルネットに対するSGDでの値の動きって、柱状ブラウン運動使って無限次元ヒルベルト空間上の確率過程として書けそう。

# 参考文献
[1]園田翔,深層ニューラルネットの積分表現理論(2017)
[2]吉田伸生,ルベーグ積分入門-使うための理論と応用-(2006)
[3]Taiji Suzuki,Fast learning rate of deep learning via a kernel perspective(2017)
[4]Y Gal,Z Ghahramani,Dropout as a Bayesian approximation(2016)