機械学習

ニューラルネットワークのフォワードプロパゲーションを実装してみた

ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。

今回は、ニューラルネットワークのフォワードプロパゲーション(ニューラルネットワークにおいてネットワークを入力層から出力層にデータを流す手法)を実装してみたので、そのサンプルプログラムを共有する。

なお、フォワードプロパゲーションについては、以下のサイトを参照のこと。
https://hossuii.com/?p=1803

前提条件

以下の記事の実装が完了していること。

ニューラルネットワーク内の単一ニューロンを実装してみた ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラー...

今回実装するニューラルネットワークの全体構成は、以下のようになる。
ニューラルネットワーク

このうち、単一ニューロンを実装した内容は以下の通りで、前提条件の単一ニューロンの実装と同じ内容になっている。

import numpy as np

# 単一ニューロン
class OrigNeuron:
    
    # 変数の初期化
    def __init__(self):
        # 入力データ(変数x)
        self.x = np.array([])
        # 入力データ(重みw)
        self.w = np.array([])
        # 出力データ(シグモイド関数の変換前)
        self.u = 0
        # 出力データ
        self.y = 0
    
    # 入力データ(変数x、重みw:いずれもNumpy配列)の設定
    def set_input_data(self, x, w):
        if self.__input_check(x, 2) and self.__input_check(w, 3):
            self.x = x
            self.w = w           
        else:
            print("OrigNeuron set_input_data : 引数の指定方法が誤っています")
    
    # フォワードプロパゲーションで出力変数を設定 
    def forward(self):
        if self.__input_check(self.x, 2) and self.__input_check(self.w, 3):
            self.u = self.x[0] * self.w[0] + self.x[1] * self.w[1] + self.w[2]
            self.y = self.__sigmoid(self.u)
    
    # 出力データyを返却
    def get_y(self):
        return self.y
    
    # 入力データの型・長さをチェック
    def __input_check(self, data, size):
        if isinstance(data, np.ndarray) and len(data) == size: 
            if np.issubdtype(data.dtype, float) or np.issubdtype(data.dtype, int):
                return True
            return False
        return False
    
    # シグモイド関数による変換
    def __sigmoid(self, data):
        return 1.0 / (1.0 + np.exp(-data))



「CODE×CODE」は、需要の高い技術(AWS, Python等)を習得できるプログラミングスクールスクールだった近年、さまざまな会社でクラウド(特にIaaSやPaaSのパブリッククラウド)の需要が非常に高まっていて、クラウドサービスによるシステム開...

また、「ニューラルネットワークの全体構成」に相当するニューラルネットワークを実装した内容は以下の通りで、forwardメソッドでニューラルネットワークを構成している。

なお、__init__メソッドの重み\(\boldsymbol w\)は、出力結果\(y\)が、入力値\(x_0=x_1=0\)または\(x_0=x_1=1\)の場合に\(0\)に近く、そうでない場合は\(1\)に近い値になるよう、設定している。

import numpy as np

# ニューラルネットワーク
class OrigNeuralNetwork:
    
    # 変数の初期化(変数x、重みw:いずれもNumpy配列)の設定
    def __init__(self, x):
        if self.__input_check(x, 2):
            self.x = x
            self.w = np.array([[6.2, 6.2, -2.7], [4.1, 4.1, -6.3], [8.5, -9.2, -3.8]])
        else:
            self.x = np.array([])
            self.w = np.array([[],[],[]])
            print("OrigNeuralNetwork set_input_data : 引数の指定方法が誤っています")

    # フォワードプロパゲーションで出力変数を設定
    def forward(self):
        if self.__input_check(self.x, 2):
            self.on11 = OrigNeuron()
            self.on11.set_input_data(self.x, self.w[0])
            self.on11.forward()
        
            self.on12 = OrigNeuron()
            self.on12.set_input_data(self.x, self.w[1])
            self.on12.forward()
        
            self.on21 = OrigNeuron()
            # 単一ニューロンon11, on12の出力値を、次の単一ニューロンon21の入力値に利用
            self.on21.set_input_data(np.array([self.on11.get_y(), self.on12.get_y()])
                                   , self.w[2])
            self.on21.forward()
    
    # 出力データを返却
    def get_y(self):
        return self.on21.get_y()
    
    # 入力データの型・長さをチェック
    def __input_check(self, data, size):
        if isinstance(data, np.ndarray) and len(data) == size: 
            if np.issubdtype(data.dtype, float) or np.issubdtype(data.dtype, int):
                return True
            return False
        return False

さらに、先ほどのニューラルネットワークを呼び出した結果は以下の通りで、出力結果\(y\)は想定通り、入力値\(x_0=x_1=0\)または\(x_0=x_1=1\)の場合に\(0\)に近く、そうでない場合は\(1\)に近い値となることが確認できる。

import numpy as np

# 作成した入力データのフォワードプロパゲーションを実行
input_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
for data in input_data:
    onn = OrigNeuralNetwork(data)
    print("*** 入力データ ***")
    print(data)
    print("*** 出力結果 ***")
    onn.forward()
    print(onn.get_y())
    print()
ニューラルネットワークの呼び出し

要点まとめ

  • ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。
  • 単一ニューロンを組み合わせることで、ニューラルネットワークが実装できる。