書籍「ゼロから作るDeepLearning」で紹介されている3層ニューラルネットワークをRubyで実装してみました。www.oreilly.co.jpサンプルコード全体まずは実装したコード全体を掲載します。重みとバイアスのデータの用意まずは各層の重みとバイアスのデータを用意します。今回のニューロン数の構成としては下記のようになります。第0層(入力層):2第1層(隠れ層1):3第2層(隠れ層2):2第3層(出力層):2init_newtorkメソッドで上記構成の第1層〜第3層の各層への処理に使うデータを作成しています。バイアスの値になります。Numo::DFloatの配列として用意します。networkend入力層のデータ入力層(第0層)のニューロン数は2なので、Numo::DFloatの配列を下記のように用意します。単純パーセプトロンでは活性化関数としてステップ関数(ある閾値を界に出力が切り替わる関数)が使われますが、ニューラルネットワーク(多層パーセプトロン)では活性化関数としては入力に対して連続的に出力が変化する(グラフにすると滑らかな曲線になる)関数が使われるということで、今回はシグモイド関数を用いています。Numo::DFloat::Math.exp(-x))endRuby標準のMathモジュールのexpメソッドは引数に配列を渡すことができませんが、Numo::DFloatのMathモジュールのexpメソッドは配列に対応しているので、そちらを使用しています。出力層の活性化関数は解く問題の性質によって選択するようですが、今回はひとまずのサンプル実装ということで恒等関数を使用しています。入力値をそのまま返しています。各層の伝達処理では、前の層のニューロンからの入力値に重みを掛け合わせ、バイアスを加算したものをシグモイド関数で処理します。第0層(入力層)から第1層(隠れ層1)への伝達処理は下記のようになっています。それをシグモイド関数で処理し、第1層の値としてz1を得ています。これを後続の層でも繰り返しますが、出力層の場合だけシグモイド関数の代わりに恒等関数を用います。上記のスクリプトを実行すると下記のような出力になります。出力層のニューロンの値として、2つの要素を持つNumo::DFloatの配列が出力されます。0.696279]コードは下記にも公開しました。