ニューラルネットワークの実装3 単一ニューロンの実装

ニューラルネットワークの実装3 単一ニューロンの実装

前回は、単一ニューロンの実装を完成させる前段階で終わってしまいましたね。練習みたいな感じになっていたかと思います。

今回の記事で重みバイアスを導入したいと思います(^^)。重みとバイアスについて忘れた方はこちらも読んでみてください。

今回の記事で単一ニューロンの実装を完成させようと思います。

単一ニューロンの実装って、もはや大学院生が研究室で行うレベルのことなのかなって気がします。学部生でもなかなかここまでやらないと思うのですがどうですか?もし大学生の方、この記事を読んでいたらコメントしてくれると嬉しいです。

この手の分野に携わっている人って圧倒的に少数なので、真剣に勉強したら相当すごい技術者になれるのではないかなとも思います。近い将来、AI が大きなトレンドになると思うので、大きく稼ぐチャンスなのではないかと考えています。

そう思うと、非常に面白いです。

機械学習のことを理解するために重要なことは、ちゃんとコードのアルゴリズム(処理手順)を理解することです。PC にどんな指示を出しているのかを理解することが重要になってきます。ここをきちんと理解するのは疲れます。でも頑張りましょう。

今日も張り切っていきましょう^o^。

重みの導入

単一のニューロンを実装するときはこの図を常に意識してください。この図の意味するところを理解していないと、↓このコードのやっていることが理解できません。このコードは練習用のコードなので、バイアスが 0 と仮定したものになっています。

import numpy as np

def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))

# ニューロン
class Neuron:
    def __init__(self):  
        self.input_sum = 0.0
        self.output = 0.0

    def set_input(self, inp):
        self.input_sum += inp

    def get_output(self):
        self.output = sigmoid(self.input_sum)
        return self.output

# ニューラルネットワーク
class NeuralNetwork:
    def __init__(self):  
        self.neuron = Neuron()  
        self.w = [1.5, 0.75, -1.0]

    def commit(self, input_data):  
        self.neuron.set_input(input_data[0] * self.w[0])
        self.neuron.set_input(input_data[1] * self.w[1])
        self.neuron.set_input(input_data[2] * self.w[2])
        return self.neuron.get_output()

neural_network = NeuralNetwork()

input_data = [1.0, 2.0, 3.0]
print(neural_network.commit(input_data))

実行結果

まず貼り付け用コードを載せておきました。このコードをエディタにそのまま貼り付けても構いません。貼り付けた状態にして自分でアルゴリズムの流れを目で追ってみてもいいと思います。コードを読む練習になるかと思います。

大まかな流れは私の Google Colaboratory 上での画像をみながら解説して行こうかと思います。こちらの図は色のついた枠で、なるべくわかりやすくなるように解説をします。コードは上の図のものと一緒です。

コードを読むときはどうするかを思い出してください。一番上から順番にコードが実行されていきます。処理が始まるのは黄枠の部分からです。前回の記事でもやったように、黄枠で初めてインスタンスを生成しているのでしたね。黄枠よりも上のクラスやメソッドは定義に過ぎません。

黄枠でインスタンスを生成した時点で __init__ メソッドにより、初期化が始まります(赤枠と青枠)。青枠の中で self.w = [1.5, 0.75, -1.0] と定義してありますね。ここで重み関数を生成しています。今回はデータ数が3つだけですが、実際は 1000 ほどあったりします。

重み関数とは入力データがどんな風にニューロンに取り込まれるかを指定するものでしたね。

黒枠で入力データを生成して newral_network インスタンスの commit メソッドを実行しています。メソッドは print 文の中に入れてしまっても構いません。

commit メソッドが実行されるとオレンジ枠の処理が始まります。

オレンジ枠の中で入力データと重み関数が計算されていますね。この掛け算の結果が緑枠の set_input メソッドの引数になっています。緑枠の中で input_sum に足し合わされてますね。

計算が終わったらオレンジ枠の return文 の中で Neuron クラスの get_output メソッドが呼び出されます。

get_output メソッドは水枠になります。水枠の中でさらにシグモイド関数を呼び出しています。シグモイド関数を呼び出したら灰枠の処理が始まります。灰枠の中で、オレンジ枠で計算されたデータを出力している格好になります。

シグモイド関数の出力が return によって水枠に返され、さらに水枠の中で return によってオレンジ枠にかえされ、さらに黒枠に返されます。

そして黒枠の中の print 文によって表示されます。

どうですか?流れが理解できましたか?ここまで理解できたなら、バイアスの導入なんてほんと楽勝ですよ^_^。

バイアスの導入

import numpy as np

def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))

# ニューロン
class Neuron:
    def __init__(self):  
        self.input_sum = 0.0
        self.output = 0.0

    def set_input(self, inp):
        self.input_sum += inp

    def get_output(self):
        self.output = sigmoid(self.input_sum)
        return self.output

# ニューラルネットワーク
class NeuralNetwork:
    def __init__(self):  
        self.neuron = Neuron()  
        self.w = [1.5, 0.75, -1.0]
        self.bias = 1.0

    def commit(self, input_data):  
        self.neuron.set_input(input_data[0] * self.w[0])
        self.neuron.set_input(input_data[1] * self.w[1])
        self.neuron.set_input(input_data[2] * self.w[2])
        self.neuron.set_input(self.bias)
        return self.neuron.get_output()

neural_network = NeuralNetwork()

input_data = [1.0, 2.0, 3.0]
print(neural_network.commit(input_data))

実行結果

バイアスを導入した場合のコードを書いてみました。と言っても、先ほどのコードとどこが違っているのかわかりますか?オレンジ枠の中に1行、self.neuron.set_input(self.bias) この1行が追加されただけです。

あとは先ほどのコードと全く一緒です。アルゴリズムはほとんど変わりません。

なので、ここの解説はする必要はないですよね^_^;。バイアスの導入なんて、ただの足し算なので、全然複雑ではありません。

お疲れ様でした。ここまでよく頑張りましたね。


お疲れ様でしたね、ここまで記事を読んでどうでしたか?

アルゴリズムを順を追って理解するのは大変ですが、一回やってしまえばそんなに辛くもないのではないでしょうか?

初心者の方は大抵こういったところで嫌になってしまいます。でもじっくり時間をかけて、確実に理解するようにしましょう。はっきり言って、単一のニューロンの実装なんて楽勝です。Python のおかげでこれだけシンプルに計算ができます。

ちなみに同じことを C や Basic で行うと、作業効率が異常に悪く、コードもぐちゃぐちゃになります。エラーも半端なく出ます。

Python ってやっぱりすごいですね(^^)。

次回は外部データの導入をやってみたいと思います。外部からデータを取得して、それを処理するという流れをやってみたいと思います。

お楽しみに!

関連記事

コメント

この記事へのコメントはありません。

TOP