C++でパーセプトロンを学ぶ

前回Neural Network Console を使用して、ディープラーニングがどういうものかを学びました。
しかし、いざ何かしら有効に使おうと思っても、根本の原理が分かっていないと話にならないと思いました。
そこで今回は、 C++ による実装を通して、 ニューラルネットワークの基本単位である、
パーセプトロンについて学びます。

はじめに

単純パーセプトロンとは、

  • 神経細胞(ニューロン)をモデル化したもの
  • ニューラルネットワークの基本単位

そして、多層パーセプトロンとは、

  • 単純パーセプトロンを複数の層で配置させたニューラルネットワーク
  • 入力層、隠れ層、出力層で構成されている
  • 入力層:多層パーセプトロンの入力となる層
  • 隠れ層:中間層ともいい、入力層と出力層の間に位置する
  • 出力層:多層パーセプトロンの出力をする層

となります。
今回はこの多層パーセプトロンを C++ で実装します。
そして、実装した多層パーセプトロンには、排他的論理和を学習させます。
こちらのサイトを参考にさせていただきました。
最終的に構築する多層パーセプトロンのイメージはこんな感じです。

実装

単純パーセプトロン

基本単位である単純パーセプトロンは以下のようになります。ヘッダのみ。

重みの更新処理(Backward)だけは載せておきます。
再帰的に計算できるようにしました。
ただ未だに正しい処理になっているか自信がないです。。

多層パーセプトロン

多層パーセプトロンは以下のような実装をしました。ヘッダのみ。
単純パーセプトロンを各層単位で生成、保持してリンクしています。

実行処理

実行処理は以下の通り。

結果

出力結果は以下の通りになりました。

学習回数が10万回の段階ではさっぱり学習の成果が見えていませんが、20万回あたりからは、ちゃんと正解に寄ってきています。
最終学習回数(100万回)になると、ほぼ正解に近いに値になっているのが分かります。
ちゃんと学習できているようです。

まとめ

分かったこと

ニューラルネットワークにおいての学習とは、パーセプトロン間に関連付けられた重みが決まることをいうようです。この重みの決定が重要そうです。
そして、この重みを決定づけるために活性化関数がかかわってくるということが分かりました。今回は参考サイトにあるシグモイド関数をそのまま使用しています。

反省点

今回、多層パーセプトロンを実装してみて、パーセプトロンについての理解はある程度深まったかと思いますが、重みを決めるための活性化関数については正確な知識を得られたわけではないです。
実際、シグモイド関数の微分における 0.1 をかける処理など、なぜそうしているか理解できていません。
また、実装した多層パーセプトロンは入力数/出力数が固定されていたりで、他の学習に流用する設計にはなっていません。

今後やりたいこと

今回実装した多層パーセプトロンを基に、入力数、出力数、隠れ層の数を可変にできるようにしてみたいです。
また、活性化関数のバリエーションを増やし、学習内容に向いている活性化関数を取り扱えるようにしたいです。(たとえば画像処理向けにカスタムしてモノを見分けるような)
ニューラルネットワーク関連のライブラリなども充実しているようなので、この辺りも触ってみたいです。Python の学習もかねて。