gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

人工知能の学習技法を体験する

2017-12-17 05:28:11 | ブログ
 今年11月5日のブログの続きとして、Excelを用いて人工知能の学習技法に関する計算を行ったので、その状況を記す。

 参考文献1に提示される例題のニューラルネットワークは、12ユニットの入力層と、3ユニットの中間層と、2ユニットの出力層から構成される。このネットワークの入力層のユニット群へ一組の学習データを入力して中間層と出力層による所定の計算を行わせ、出力層に計算結果を得るというプロセスを64組の学習データについて繰り返す。

 中間層と出力層が行う計算の計算式は、入力データと出力データに関する変数のほかに多数のパラメータを含んでいる。

 ニューラルネットワークを用いた学習とは、投入した学習データ全体について計算結果と正解との差分が最小となるようにパラメータ群を決定することである。

 結果データaと正解tとの誤差はa-tとなるので、2乗誤差Cは(1/2)(a-t)^2で与えられる。出力層の2つのユニットの結果出力a1,a2に対応する正解をt1,t2とすると、コスト関数Cは次の式で表される。
   C=(1/2){(a1-t1)^2+(a2-t2)^2}

 このCは一組の学習データに関するコスト関数と考えられるので、学習データ全体に関するコスト関数は、各組のコスト関数の総和となる。従って、ニューラルネットワークの学習とは、トータルのコスト関数を最適化するようにパラメータ群を求めることである。

 まず、Excelの表に64組の学習データを入力し、例題のネットワーク構成に必要なパラメータ群の初期設定を行い、各学習データごとに中間層と出力層の各ユニットの入力値、出力値およびコスト関数の計算式を設定し、学習データ全体のコスト関数値を集計するセルを設ける。

 Excelには、「ソルバー」という便利な最適化ツールが用意されているので、トータルのコスト関数を最小にするようなパラメータ群を求めることは容易である。ほとんど数秒のうちに計算結果が表示される。

 正規乱数を用いた初期値を変えて10回ぐらい最適化計算をしてみると、多くの場合、トータルのコスト関数がほぼ0になる。コスト関数を0にするようなパラメータ群のセットは一通りではないことが分かる。

 コスト関数が最小値0に達しているのであるから、各パラメータを変数とするコスト関数という多変数関数は2次関数的ではないかと考える。コスト関数が0になるようなパラメータ・セットが存在するということは、コスト関数を各パラメータ変数で偏微分したものがすべて0になることを意味するから、それは一変数関数の場合に微分値が0になるような2次関数と同等と仮定するのである。しかし、コスト関数がn=3以上のn次関数的である可能性もある。その場合には、コスト関数が極小点をもつ可能性がある。

 例題のコスト関数が最小点をもつことは分かったが、それ以外に極小点が存在するのか否かは分からない。「ソルバー」はブラックボックスとなっているから、極小点を検出できるのか否か不明である。

 そこで、例題のニューラルネットワーク構成に3ユニットをもつ第2の中間層を加えたネットワーク構成とし、上記の学習データを用いた最適化計算を行い、コスト関数の最小値がどうなるのかと、極小点が現れるのか否かをみることにした。例題のネットワーク構成と学習データが2次関数的であるとすれば、中間層をもう一層加えることによってコスト関数がnが3以上のn次関数的になることを期待するためである。

 この増強したネットワーク構成について、初期値を変えて20回程度の最適化計算をしてみた。エラー値になって停止した3回の試行を除いた計算結果は、17回のケースでトータルのコスト関数がほぼ0になったが、3回のケースで1.94,0.97,0.98のような値になった。

 この3回のケースが極小点の存在を示唆するものか、それとも別の原因によって生じたものか分からない。

 そこで、この中間層を2層もつネットワーク構成について、勾配降下法という最小値を探すための技法を適用してみることにした。これは、トータルのコスト関数の値が減る方向に各パラメータの値を少しずつ変えていき、コスト(誤差)が最低になるところに到達することを目指すものである。

 あるパラメータwの微小の変化量をdelta(w)と表すとすれば、これは
   delta(w)=-c(dC/dw)
という式で与えられる。dC/dwはトータルのコスト関数Cをパラメータ変数wで偏微分した値とする。dC/dwは、勾配と呼ばれる。cは、学習係数と呼ばれる定数である。

 delta(w)が求められたとき、wの現在値+delta(w)を計算すれば、新しいwの値を得るので、この操作を繰り返せばよい。このプロセスによって、wの現在値が次第に降下することが期待される。

 各パラメータwについてその勾配成分dC/dwを求めるために、誤差逆伝播法という技法を用いる。この技法の詳細については、参考文献1参照としたい。ここで誤差とは、dC/dw自体を指す。wの最小値を求めるとは、この誤差を0に近づけることに他ならないからである。

 Excelの表に入力した64組の学習データはそのまま使うことにする。正規乱数を用いてパラメータ・テーブルの初期値設定を行い、計算途中で初期値が変動しないようにその数値のみを元の場所に貼り付ける。

 各学習データごとに、dC/dwを計算するために必要な値とコスト関数Cを設定するテーブルを設け、dC/dwを設定するテーブルを設ける。ここで、CとdC/dwは一組の学習データに関するものである。一組の学習データに関するテーブルができたら、これらテーブルに含まれる計算式を各学習データ対応に設定するためにコピーする。

 また、トータルのコスト関数を計算するセルと、トータルの勾配dC/dwを集計するテーブルを設ける。次に、この集計テーブルを用いて古いパラメータ・テーブルの値を更新して、新しいパラメータ・テーブルをつくる。この新しいパラメータ・テーブルの値に基づいて各学習データごとの新しいテーブルをつくり、各学習データ対応にコピーする。

 以上の操作を何回も繰り返す。参考文献1では、トータル・コスト関数の算出を50回行っている。コピー回数は64×50+50=3250回にもなり、労力の負担が大きい。

 Excelによる数式のコピー方法、行と列の記号に付ける$記号の使い方、行列の加算方法などに悪戦苦闘し、単調なテーブルのコピーを繰り返した後、ようやく、勾配降下法の原理通り、コスト関数が順次降下していくのを確認できた。

 しかし、参考文献1の模範例に比べて、最小点への収束の速度が遅すぎる。

 まだ改良すべき不具合点がありそうである。今後も改良を続ければ、その収束速度から、最小点へ収束するケースと、極小点へ収束するケースとを各々確認できるのではないかと考える。

 参考文献
 1.涌井良幸など著「ディープラーニングがわかる数学入門」(技術評論社)
 2.甘利俊一著「脳・心・人工知能」(ブルーバックス)