数値微分による勾配下降法 - ニューラルネットワークの学習とPythonによる実装

先日はニューラルネットワーク学習方法の一つ勾配下降法について調べました。

今回は先日の内容を元に、勾配下降法による学習をPythonによって実装してみました。

 

 

 

勾配下降法

ニューラルネットワークの学習法として勾配下降法があります。

勾配下降法では 損失関数L の重みパラメータwによる微分値を計算し、 損失関数L の値が最小になるように重みwをを更新していきます。

今回は損失関数として、交差エントロピー誤差関数を使用します。

損失関数の勾配下降法

 

 

 

ニューラルネットワークモデル

今回使用するニューラルネットワークのモデルを示します。

二層ニューラルネットワーク

 

 

  • 今回使用するニューラルネットワークは「入力 – 中間」・「中間 – 出力(ソフトマック)」の二層ニューラルネットワークです。
  • 使用する活性化関数には シグモイド関数 を使用しました。
  • 今回学習する関数は二値入力の「AND」・「XOR」関数を学習します。
  • ニューラルネットワークの出力として、入力が「1に分類される確率」と「0に分類される確率」を出力します。

 

またニューラルネットワークのパラメータを次のように設定しました。

  • 入力層 :  2
  • 中間層 : 4
  • 出力層 : 2
  • 学習率 : 0.1
  • 学習回数 : 30000回

コード

今回使用するコードを示します。実装にはPython 3.xを用いました。またコードの実装には下記参考文献を参考にさせていただきました。

 

 

学習の実行

AND関数の学習

関数の学習として、初めにAND関数を学習させました。今回学習するAND関数の入力と教師データを次に示します。

 

Table.1 AND
入力 教師
x1 x2 t1 t2
0 0 0 1
1 0 0 1
0 1 0 1
1 1 1 0

 

 

上記のプログラムを実行した結果を次に示します。

 

 

学習前はどの入力でも正しい結果を出力することができませんでしたが、学習によって正しく分類できるようになりました。

次に学習回数と損失関数の値の関係を示します。

AND関数の損失

 

グラフと横軸が学習回数、縦軸が損失関数の値を示しています。

AND関数の学習では、損失関数の値は学習を重ねることで順調に減少していきました。

 

XOR関数の学習

続いてXOR関数の学習を行いました。学習するXOR関数の入力と教師データを次に示します。

 

Table.1 XOR
入力 教師
x1 x2 t1 t2
0 0 0 1
1 0 1 0
0 1 1 0
1 1 0 1

 

上記のプログラムを実行した結果を次に示します。

AND関数の学習と同様、学習前はも正しい結果を出力することができませんでしたが、学習によって正しく分類できるようになりました。

一方で損失関数の値はAND関数の場合とは異なりました。次に学習回数と損失関数の値の関係を示します。

 

 

XOR関数の損失

 

グラフと横軸が学習回数、縦軸が損失関数の値を示しています。

AND関数の場合とは異なり、学習回数15000回までは損失関数の値は減少せず、20000回ほど学習しないと正しく分類することができませんでした。

OR関数、NAND関数も同様に学習させたとこと、損失関数の値はAND関数の場合と同様になりました。

この原因はわかりませんが、線形分離可能な関数のほうが線形分離不可能なXOR関数よりも学習回数が少なかかったことから、線形分離可能かどうかが学習回数に影響するようです。

 

まとめ

  • 勾配下降法によってニューラルネットワークの学習を行った。
  • ニューラルネットワークの層は二層に固定し、中間層を4層とした。
  • ニューラルネットワークの出力部にソフトマックス関数を使用した。
  • AND・XOR関数の学習を行い、線形分離可能な関数のほうが学習回数が少なかった。

 

参考文献

  1. 馬場則夫, 小島史男, 小澤誠一 : ニューラルネットワークの基礎と応用, p. 10, 1995, 共立出版
  2. 麻生英樹 : ニューラルネットワーク情報処理, 1989, 産業図書
  3. 麻生英樹ほか:深層学習 Deep Learning, 2016, 近代科学社
  4. 斎藤康毅 : ゼロから作るDeep Learning, 2018, オライリージャパン

 

関連記事

ニューラルネットワーク・ディープラーニングのまとめ

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA