TechFULの中の人

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

グラフで理解するニューラルネットワーク

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

人工知能といえばディープラーニング! 本記事ではその基礎であるニューラルネットワーク(NN)がどのように関数を近似するのか,どうしてディープな方がいいのかについて,その関数を直接見ながら解説していきます. これらを理解するとネットワークのユニット数や層数を決める助けになるかもしれません.

NNの強みは「単純な関数」の構成によって「どのような関数にも」近似できる点です. これはよくある3層NNの図ですが、この隠れ層のユニット数を無限に増やせばどんな関数にもいくらでも近づけられることが知られています.

f:id:techful-444:20210426150301p:plain
よくあるニューラルネットワークの図
でも実際には無限にユニットを増やすなんてことはしませんよね. せいぜい1024とか多くて1万とかです. 小さなネットワークなら64や32といった数もあり得るでしょう. では実際, 有限な数だとどのような限界があるのでしょうか. よくNNはブラックボックスだといわれますが, 実はよく観察するとその実態が(多少)見えてきます.

ユニット数の意味

まずは簡単な例として1入力1出力で隠れ層のユニット数が1の3層NNを構築しましょう.

f:id:techful-444:20210503121133p:plain
隠れ層ユニット数1の3層NNの図
式にするとこんな感じです. $$y = w_2a(w_1x+b_1)+b_2$$ $x$が入力,$y$が出力,$w_1,w_2$が重み,$b_1,b_2$がバイアス,$a$が活性化関数です. 活性化関数$a$としてはReLUを想定しましょう. この程度であれば関数全体を簡単に理解できます.
f:id:techful-444:20210501164524p:plain
隠れ層ユニット数1の3層NNのグラフ
右が傾くか左が傾くかは$w_1$の符号によって変わりますが,とりあえずプラスとすればこんな感じです. $w_1w_2$を変えることで自由に傾きを変えられて,屈折する位置も$-b_1/w_1$で調整できます. とはいえさすがにユニット数1だと使いにくそうです.

ということでユニット数2の場合を考えてみましょう.

f:id:techful-444:20210501165231p:plain
隠れ層ユニット数2の3層NNの図
式にするとこんな感じです. $$ y = w_{21}a(w_{11}x+b_{11}) + w_{22}a(w_{12}x+b_{12}) + b_2 $$ これは$b_2=b_{21}+b_{22}$と考えると実はユニット数1のときのネットワークを2つ足し合わせただけなんですね. グラフは例えばこんな感じになります.
f:id:techful-444:20210501164517p:plain
隠れ層ユニット数2の3層NNのグラフ
やってることは簡単で,ユニット数1の時のグラフをもう一回曲げただけです. ユニット数1のグラフを2個足し合わせているだけなので当然といえば当然ですね. ちなみにユニット数3の場合も3個足し合わせただけなので3回折り曲がったようなグラフになります. つまり,この調子でユニット数を3,4,...と増やしていくと折り曲げる数を増やしていくことができるんです!

ということは3層NN(ReLU)ってただの折れ線グラフだったというわけです. 折り曲げる回数を増やすほど複雑な関数を作れて無限になればどんな関数も表せるのは当然です. ユニット数64程度でも結構デコボコした関数を近似できそうですね.

層を深くする意味

では層を深くするとどうなるんでしょうか.

f:id:techful-444:20210501165233p:plain
隠れ層ユニット数3,1の4層NNの図
これはユニット数3とユニット数1の隠れ層を持つ4層NNです. 2つ目の隠れ層に入る前の出力$z$は先ほどまでの3層NNと同じです. その部分のグラフは次のような感じになると仮定しましょう.
f:id:techful-444:20210501165238p:plain
zの様子
ここで重要なのは最終的な出力の「折り曲げの回数」です. 折り曲げが新たに生じるのはReLUに通した瞬間なので$a(z)$の折り曲げられる点は「$z \leq 0$か$z > 0$かが変わる点」と「もともと折れ曲がっている$z > 0$の点」の2種類です. ということはこのグラフでは4回ですね. 結果としてこのNNの出力$y$の折り曲げ回数は4回ということになります. 前半のユニット数を3から増やすとその分$z = 0$のラインを往復できるので,前半のユニット数に「比例」して折り曲げ回数を増やせるようになることがわかります.

さて,ではユニット数3とユニット数2の4層NNを見てみましょう.

f:id:techful-444:20210501165237p:plain
隠れ層ユニット数3,2の4層NNの図
ユニット数2の3層NNの時と同じように2つの4層NNが足し合わされただけであると考えることができます. そう考えると$z_1$も$z_2$も先ほどの$z$と同じような関数だと言えます. ただし$b_{21}$と$b_{22}$や直前の重みも別なので「$z_1 \leq 0$か$z_1 > 0$かが変わる点」と「$z_2 \leq 0$か$z_2 > 0$かが変わる点」の位置は異なるということがわかります. つまり,最終的に$y = w_{31}a(z_1)+w_{32}a(z_2)+b_3$の折れ曲がる点の数は「$z_i \leq 0$か$z_i > 0$かが変わる点」の2倍くらいにはできるということです. 同様にして考えれば後半のユニット数2を3,4,...と上げていけば「$z_i \leq 0$か$z_i > 0$かが変わる点」の3倍,4倍,...という風に折れ曲がる点を増やすことができます.

つまり,ユニット数$N$とユニット数$ M $の4層NNを考えると,「$z_i \leq 0$か$z_i > 0$かが変わる点」は$N$個以上存在でき,最終的な出力$y$の折れ曲がる回数は$NM$回以上にできるということです. この時点の$y$をまた$z$として同様に5層以上についても考えることができて,結局この折れ曲がる回数は層数に従って「指数関数」的に増やせることがわかります. これがディープなNNを作る最大の利点というわけです.

最後に

本記事ではNNのユニット数と層数の意味についてグラフで解説しました. 1入力1出力の時のみを考えましたが,同様のことが多次元入出力の時にも成り立ちます. とはいえ層数を最大化するためにユニット数2で超深くするのが良いわけではありません. 重みの数は層数に対して比例でしか増えていかないので,ある程度ユニット数の方も大きくないと不器用な関数ができてしまいます. なので結局は良いパラメータを決めるにはある程度経験と実験が必要になります. また,今回は触れませんでしたが,どんな関数にでも近似できるとはいえ,この関数をいつでも上手く最適化できるとは限りません. 多くの場合は局所最適解に陥ってしまうのでユニット数や層数に限らない工夫が必要になります. だからこそ,構造上表現力(折り曲げる回数)が足りない状況にならないよう,本記事で紹介した知識を活用して効率よく良いモデルを構築しましょう.