4.ニューラルネットワーク ~完結~

はじめに

パーセプトロンから始まり、ADALINEロジスティック回帰と経てついに本題のニューラルネットワーク。発展できた大きな理由の1つであるバックプロパゲーションの説明と、ニューラルネットワークに付きまとう問題点とその解決策の説明を行っていく。

これにより、ベーシックなニューラルネットワークの仕組みやキーポイントが理解でき、更なる発展的な手法の理解への足掛かりとなるだろう。

ニューラルネットワーク

まずニューラルネットワークとディープラーニング、さらにはAIと機械学習の包含関係を見てみよう。

このようにディープラーニングは層が多い(多層化された)ニューラルネットワークのことをを指す。

そのため、ニューラルネットワークを学び、それを多層化していけばディープラーニングを作ることができる。

しかしこの多層化によって生じるいくつかの問題がある。これについても触れていく。

ニューラルネットワークの復活

1960年頃にロジスティック回帰が考えられてから、ネットワークのトレーニング方法が提案されず、ニューラルネットワークは下火になっていった。この時期のことをAI Winterと呼ばれる。

しかし、1986年にバックプロパゲーション(誤差逆伝搬法)の再評価によりニューラルネットワークは再注目を集め、そしてビックデータやハイスペックPCの時代でニューラルネットワークは大ブレークした。

つまりこのバックプロパゲーションのおかげで今日のブームがあると言える。

ニューラルネットワークの特徴

ニューラルネットワークの特徴として、全ての問題を同じ流れで解くことができる点が挙げられる。

数字を認識する問題でも犬を認識する問題でも人の顔でも、全て生データから自分でパラメータを学習し問題を解こうとする。特徴量すら与える必要はなく、自分で見つける。

そういった意味でニューラルネットワークは、

end-to-end machine learningと呼ばれる。

では

  • ニューラルネットワークの予測の仕組み→フォワードプロパゲーション
  • 学習の仕組み→バックプロパゲーション

を見ていこう!

フォワードプロパゲーション

日本語では順伝搬法と呼ばれる。これは多層ニューラルネットワークの入力データから出力結果を計算するプロセスである。 

この図のようにニューラルネットワーク(多層パーセプトロン)は入力層、隠れ層、出力層からなる。隠れ層は全ての入力層と結合していて、出力層は全ての隠れ層と結合している。

隠れ層

ではまず隠れ層での処理を見ていく。ます、入力層からの信号の総入力\(z^h\)を求める。

$$z^{h}_1=a_0^{in}w_{0,1}^{h}+a_1^{in}w_{1,1}^{h}+\cdots+a_m^{in}w_{m,1}^{h}$$

そしておなじみ活性化関数\(h()\)を用いて活性化ユニット\(a^h_1\)を算出

$$a^h_1=h(z^h_1)$$

この時、活性化関数\(h()\)にシグモイド関数\(h(z^h)=\frac{1}{1+exp(-z^h)}\)を用いるメリットはロジスティック回帰で学んだ。

全隠れ層\(d\)に関して、そして学習データ\(n\)に関してこれを表記するならば行列表記で、

$$Z^h=A^{in}W^h$$

$$A^h=h(Z^h)$$

となる。

出力層

隠れ層からの活性化ユニット\(a^h\)を受け取るのだが、出力層の設計は2つのパターンがある。

ニューラルネットワークは回帰問題と分類問題の両方に用いることができる。この時、どちらの問題を扱うかによって出力層の設計が変わってくる。

(回帰問題は数値予測、分類問題は○×)

回帰問題ならば恒等関数を、

分類問題ならばソフトマックス関数を出力層では用いる。

回帰問題

恒等関数を用いると、出力\(y^1\)では

$$y^1=z^{out}_1$$

$$z^{out}_1=a_0^{h}w_{0,1}^{o}+a_1^{h}w_{1,1}^{o}+\cdots+a_t^{h}w_{h,t}^{o}$$

となり、結果はその予測値として得られる。

分類問題

ソフトマックス関数とは以下の式で表される。

$$y_k=\frac{exp(a_k)}{\sum^n_{i=1}exp(a_i)}$$

分子は\(k\)番目に関する値で、分母はそれら全ての総和を表している。つまり、全体の中の比率を表しており、\(y_k\)の総和は1になる。

\(y_1=0.02(2\%),~y_2=0.13(13\%),~y_3=0.85(85\%)\)のような結果を得ることができ、分類問題に対する確率的な答えを出力するのである。

先ほどと同様に、\(t\)個の全出力層、全学習データ\(n\)に関して

$$Z^{out}=A^h W^{out}$$

$$A^{out}=h(Z^{out})$$

と行列表記ができる。

なお、行列による計算を用いる理由は計算時間でもある。PCはfor文での計算よりも早く計算ができるからだ。

以上でニューラルネットワークの出力値の算出方法はわかった。それではニューラルネットワークの学習方法について見ていこう。バックプロパゲーションを用いる。

バックプロパゲーション

日本語は逆伝搬法。これはニューラルネットワークの重み学習法で今なおよく用いられている。

その理由は効率よく目的関数の勾配計算を行うことができるため。

そしてこの手法のポイントは

この重みをどれだけ変えたら結果が変わる?
その度合いを結果から逆算してみよう!

先程のフォワードプロパゲーションは入力から出力を求めていた。このバックプロパゲーションはその逆。

出力(の誤差)から入力(や隠れ層の重み変化分)を求めている。だから逆伝搬。より正確に言えば、

出力層から隠れ層への誤差の伝わり具合、つまり伝搬係数を求めることで、結果から見た各重みに関する勾配が得られるということ。

比較的時間のかからない計算だけで最適化ができるという大きな利点がある。

これは多層化した時、より一層計算時間を考慮しないといけない時に効果を発揮する。

具体的な計算方法を述べていくが、行っていることは上図の様に、結果から誤差を求め、それがどのように伝わっているか(伝播)を求めている。出力から入力の方向に。

具体的な説明

具体的な学習法を見ていこう。

学習=重み最適化

ということで最適化のためのコスト関数から定義しよう。\(n\)個の学習データに関するコスト関数\(J(w)\)は

$$J(w)=-\sum_{i=1}^n y^i log(a^i)+(1-y^i) log(1-a^i)+\frac{\lambda}{2}\sum^m_{j=1} w_j^2$$

$$a^i=h(z^i)$$

ロジスティック回帰のコスト関数とほぼ同じであるが、最後に1つ項が追加されている。これは後に説明する正則化の項であり今はスルーしておこう。

これを\(t\)個の出力、\(L\)個の層に関して全て足し合わせると、

$$J(W)=-[\sum_{i=1}^n\sum_{j=1}^t y^i_j log(a_j^i)+(1-y_j^i) log(1-a_j^i)] +\frac{\lambda}{2}\sum_{l=1}^{L-1} \sum_{i=1}^{u_l} \sum^{u_l+1}_{j=1} \left( w_{i,j}^l \right)^2$$

と書ける。(\(u_l\)は層\(l\)のニューロン数、\(L\)は全層数)

このコスト関数\(J(W)\)を最小化したい。

それでどの重みをいじればどれだけ減少するか、つまり\(\frac{\partial}{\partial w_{j,i}^l} J(W)\)を求めたいところだ。

これを以下のバックプロパゲーションで求めていく。

まず、出力層における誤差\(\delta^{out}\)を正解ラベル\(y\)から求める。

$$\delta^{out}=a^{out}-y$$

この誤差は隠れ層にはこのように伝搬する。隠れ層の誤差項\(\delta^h\)は

$$\delta^h=\delta^{out}(W^{out})^T\odot\frac{\partial h(z^h)}{\partial z^h}$$

このシグモイド関数\(h\)の偏微分はこのように計算される。

$$\frac{\partial h(z^h)}{\partial z^h}=\left(a^h\odot(1-a^h)\right)$$

よって

$$\delta^h=\delta^{out}(W^{out})^T\odot\left(a^h\odot(1-a^h)\right)$$

そして欲しかった各重みに関するコスト関数の勾配は

$$\frac{\partial}{\partial w_{i,j}^{out}} J(W) = \frac{\partial z^{out}_i}{w^{out}_{i,j}} \frac{\partial J(W)}{\partial z^{out}_i} = a_j^h \delta^{out}_i$$

$$\frac{\partial}{\partial w_{i,j}^h}J(W)=\frac{\partial z^{h}_i}{w^{h}_{i,j}} \frac{\partial J(W)}{\partial z^h_i}=a_j^{in} \delta^{h}_i$$

\(\delta^{out}\)と\(\delta^h\)は先程求めたので、各重みに関するコスト関数の勾配が求めることができた。

トレーニングサンプルごとにこの偏微分係数を\(\Delta^{out},\Delta^h\)として累積させ、

$$\Delta^{out}:=\Delta^{out}+(A^h)^T\delta^{out}$$

$$\Delta^{h}:=\Delta^{h}+(A^{in})^T\delta^{h}$$

このように行列で表せる。以上より重みの更新は

$$W^{out}:=W^{out}-\eta \Delta^{out}$$

$$W^{h}:=W^{h}-\eta \Delta^{h}$$

となる。

よって今までのアルゴリズムと同様に重みの更新方法が求められたのでこれにて学習を行うことが出来る。

それではニューラルネットワークに取り付く問題点について触れる。これらを解消するために今日までも様々な改良が重ねられているのである。

解消すべき問題

勾配損失問題

勾配損失層が深くなるにつれ、重みの学習に用いる勾配が徐々になくなっていき、結果的に学習に時間がかかったり、学習がうまくいかなくなる現象

例えば、あるニューロンで総入力が\(z_1=15\)から\(z_2=20\)に変化したとする。この時、シグモイド関数を用いると\(h(z_1)\simeq 1,h(z_2)\simeq 1\)とほとんど変化しない。よって活性化関数の微分値は\(z\)が大きくなるとほとんど0、つまり消失してしまう。微分の消失→勾配損失である。それ故、学習が非常に遅くなってしまうのだ。

この問題の解消のため、近年こちらの活性化関数が用いられることが増えている。

ReLU

Rectified Linear Unitという関数で、入力が0未満であれは0を出力し、入力が0を超えていれば恒等関数の働きをするもの。

$$h(z)=z~~(z > 0)$$

$$h(z)=0~~(z \le 0)$$

これは純粋な恒等関数とは違い、ちゃんと非線形関数(\(y=ax+b\)で表せない)である。そしてこの関数のなによりの利点、それは正の入力に対して導関数は常に1であるため、微分値が0にならない→勾配損失しない。よって複雑な層の深いネットワークにおいて勾配損失問題を起こしにくいという利点がある。

それ故、最近ではこちらがよく用いられている。覚えておこう。

極小問題

多層ニューラルネットワークでは数百から時には億単位までの数の重みを学習させる必要がある。そのため、今までのアルゴリズムよりもコスト関数は複雑で下図のようにギザギザな関数となり、極小値に陥りやすい。

極小値に陥ってしまうといくら学習してもその結果は最適な学習結果とはならず、精度の悪いネットワークが出来てしまう。

そこで確率的勾配法というものが用いられている。

確率的勾配法とそのメリット

今までの学習のさせ方は全てのデータを使ってコスト関数を計算し重みを更新してきた。これはバッチ勾配降下法と呼ばれる。

全データ数が大量である時、計算負荷が高いのは言うまでもない。

そこでサンプルを毎回ランダムに並び変え、いくつかのグループ毎でコスト関数を計算して重みを更新する。これを確率的勾配降下法((stochastic gradient descent;SGD)と呼ぶ。

結果、学習時間の短縮はもちろん達成される。

さらに、バッチ勾配降下法と比べて重みをより頻繁に更新することから、ノイズだらけである。このノイジーな性質も実は浅い極小値をより簡単に抜け出せるという利点なのだ。

そしてさらに、今までは全部の学習データを揃えてから学習を行っていたが、確率的勾配降下法ではある程度の数のサンプルで学習を行うことが出来る。そこで新しいトレーニングデータが届いたときに、その場でそのサンプルでネットワークを更新することが出来る。これをオンライン学習といい、リアルタイムでデータが蓄積しているものに役立つ。確率的勾配降下法のメリット

  • 計算時間の削減
  • 極小回避
  • オンライン学習

過学習問題

過学習とは学習データ用にカスタマイズされすぎて、いざ実用段階での予測したいデータに対しては性能が落ちることである。これはバリアンスが高いとも呼ばれる。

逆に、学習不足ゆえに性能が悪いことをバイアスが高いと呼ばれる。

この過学習-学習不足(バリアンス-バイアス)の関係はトレードオフの関係であり、このバランスが大切である。

具体的にはモデルの複雑さが対象にとって複雑すぎると過学習に、簡単すぎると学習不足になりやすい。

下の図が過学習と学習不足の例である。

この問題に対する効果的な手法が正則化である。先ほどコスト関数の設計で説明をパスした項の話だ。

正則化の導入

正則化とは極端な重みに対しペナルティを置くことで複雑さを調整し、過学習を防ぐものである。

過学習を防ぐと言ったが、正確には過学習と学習不足のトレードオフをこちらが調整することが出来るようになるための手法である。

防ぐにはこの正則化項を上手く調節する必要があるということ。

そして正則化にもいくつか種類がある。よく使われるのはこのL2正則化。

$$\frac{\lambda}{2}||w||^2=\frac{\lambda}{2}\sum_{j=1}^m w_j^2$$

の項をコスト関数に加える。すると重みが大きくなろうとした時、\(||w||^2\)が大きくなるためコスト関数が増加してしまう。コスト関数を減少させるような重みの更新を行うので、結果的に重みは極端に大きくなることはできなくなる。

そしてこの時重要なのが正則化パラメータ\(\lambda\)

これを調整することでネットワークがどのくらい複雑になることを許すか、これをデザインする。そういう意味でこういった人が決めるデザインパラメータのことを重みなどの機械が決めるパラメータとの対比でハイパーパラメータと呼ばれる。

まとめ

ニューラルネットワークの構築と学習に重要なのはフォワードプロパゲーションとバックプロパゲーションであると考え、その説明に重きを置いた。

また、ニューラルネットワークと切り離せないいくつかの問題を取り上げ、これに対する解決策を紹介した。

今回紹介した手法以外にも多くの方法があるが、大抵は上記の問題に対する解決策と考えてよいだろう。

このニューラルネットワークをベースに画像処理を得意とする畳み込みニューラルネットワークや時系列データを得意とするリカレントニューラルネットワーク、強化学習と組み合わせたDeep Q-Learningへと発展していく。

その基礎となる話であった。

これにてニューラルネットワークシリーズは完結。

大きな全体の流れと小さな1つ1つの考え方を知ることが大切です!

0.ニューラルネットワークの歴史

1.パーセプトロン

2.ADALINE

3.ロジスティック回帰

4.ニューラルネットワーク