TechFULの中の人

TechFULスタッフ・エンジニアによる技術ブログ。IT関連のことやTechFULコーディングバトルの超難問の深掘り・解説などを毎週更新

ニューラルネットワークの限界を観察してみる

こんにちは.TechFUL PROのアルバイトをしているzekiです. TechFUL PROでは人工知能に関する問題を提供しています.

今回はニューラルネットワーク(NN)の限界について観察してみます. NNはそのパラメータ数を無限に大きくするとどのような関数にも限りなく近似できる「万能近似関数」です. が,パラメータを無限に用意することは不可能ですし,そのようなパラメータは存在はしますが求め方はわかりません. では,現実的に考えて,有限のパラメータと勾配降下法による最適化にはどのような限界があるのでしょうか.

NNの構成

今回のNNは1入力1出力で,128次元3層の隠れ層とReLUで構成し,heの初期化を用います. 初期バイアスはすべて0.01とし,バッチサイズ128,学習率0.01で収束するまで最適化します. (大体5万イテレーションくらい学習させています.)

正弦波

まずは簡単な関数として正弦波について見てみましょう.

f:id:techful-444:20210927152633p:plain
sin(xπ)の場合
青の破線が真の関数で,ちょうど見えている範囲から一様に抽出したxからf(x)を求めて訓練データとしています. が,オレンジの実線が重なってほとんど見えませんね. オレンジの実線はNNの出力で,かなりの精度で近似できていそうなことが見て取れます.

ではもっと周波数を高めるとどうなるでしょうか.

f:id:techful-444:20210927140957p:plain
sin(8xπ)の場合
さっきよりも結構ズレます. パラメータ数は十分なのに,カーブするところでの頂点の数が少ないような感じになっていますね. 特に,原点から離れた位置には頂点が少ない感じがします. 3層の隠れ層があるので繰り返し同じ形を使うような計算も可能なはずですが,そうはなっていなさそうです.

Weierstrass関数

では,すごく複雑な関数だとどうなるのでしょうか. より複雑な関数として以下の式を考えてみます.

 \displaystyle
f(x) = \sum^{\infty}_{n=0}a^n\cos (b^n \pi x)

これはWeierstrass関数といって,いくらズームしても形が変わらないというフラクタル構造を持った関数として知られています. 今回はプログラムで扱う都合上,$a=0.5$, $b=5$, ∞の部分は100として計算します. 実際の形を見てみましょう.

f:id:techful-444:20210927142005p:plain
Weierstrass関数
[-1,1]と[-0.2,0.2]が同じ形をしていることがわかります. 今回は∞の部分を有限で扱っているので何処かで限界が来ますが,実際は無限に同じようにズームできるので,究極の階層構造と言えるでしょう. さらに,いたるところで複雑な動きをしています. 原点に近いところでも綺麗に表現することはできませんが,NNはどのような関数を作るのでしょうか.
f:id:techful-444:20210927142442p:plain
Weierstrass関数の場合
...全然近似できていないですね. なんとなくなぞった感じにはなっていますが,階層構造な感じとかジグザグした感じとかは全然表現できていません. 今回のNNは少なくとも128点の折れ線グラフを描けるはずですが,パッと見た頂点の数は30個以下です.

考察

さて,3つの関数をNNで近似してみましたが,2個目と3個目がなかなか綺麗に学習できませんでしたね. パラメータ数は十分にあるはずなので,原因は勾配降下法にあります. 勾配降下法ではNNの大量の頂点を少しずつずらしていく操作をしています. この「ずらす操作」は,常により精度が高くなるようにしかすることができません. 2層目までで1つの波を描いて,3層目でそれを使いまわして次の波を作る操作を実現するには,それに繋がるなめらかな途中経過が必要で,その間ずっと精度がよくなるようにしないといけないのです. コピー&ペーストをするために図形を平行移動させるようなことは,途中で非常に精度の悪い状態が生まれるので勾配降下法では実現不可能なんですね. 3つ目のWeierstrass関数でも同様で,NNは階層構造をある程度実現することができるはずですが,それを勾配降下法で実現するような経路が見つかりにくい(or 存在しない)のだと思われます.

また,3つ目のWeierstrass関数で頂点がパラメータ数の割に少ない問題は,そう見えるだけというのが実際だと思われます. というのも,ReLUのNNではパラメータを1つ操作しようとするとその頂点よりも右か左かのどちらか全体に影響してしまうため,一部分を変化させるという学習が結構難しいのです. それに対して,今回の関数はジグザグしすぎており,局所的な変化が多く要求されたために,結局それぞれのパラメータが変化を打ち消し合ってしまってうまく頂点を曲げられなかったのだと考えられます.

最後に

例えば画像認識のような状況でも小さなパーツが大きな物体を構成したりする階層構造が観察できます. こういった状況に対して,ただただ何も工夫をせずに万能近似関数だからとNNを過信してしまうと,NNの中身では今回の実験のように全然うまく近似できないみたいなことが起こります. そういったことを回避し,本質的なデータ特徴を学習させて精度を上げるためには,CNNやTransformerといったモデル選択や,実際の問題を解く実践経験が必要不可欠です. TechFUL PROでは画像分類や自然言語処理などの問題を,実際のデータを使って出題しています. 実践経験を得る良い環境だと思うので,是非解いてみてください!