Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで実装する単一ニューロンニューラルネットワークの基礎と仕組み

ニューラルネットワークとは

ニューラルネットワークは、ディープラーニングの中核をなす非常に重要な技術です。画像分類、音声認識、物体検出など、幅広い分野で実用化されており、AI技術の発展を支える基盤となっています。

この記事では、ニューラルネットワークの基本構造と動作原理をわかりやすく解説し、最後にPythonで実装できる単一ニューロンのシンプルなサンプルコードを紹介します。

ニューラルネットワークの構成要素

ニューラルネットワークは、主に以下の要素で構成されます。

  • 入力層(x):データを受け取る層
  • 隠れ層:任意の数だけ設置可能な中間層
  • 出力層(ŷ):予測結果を出力する層
  • 重みとバイアス(W・b):各層間の接続の強さを定めるパラメータ
  • 活性化関数(σ):各隠れ層に適用される非線形変換関数

下図は2層のニューラルネットワークを示したものです。なお、層数を数える際には、入力層は通常カウントから除外されます。

Pythonで実装する単一ニューロンニューラルネットワークの基礎と仕組み

図中の円はニューロン、線はシナプス(結合)を表しています。シナプスは入力値と重みを掛け合わせる役割を担い、重みはニューロン間の接続の「強さ」と捉えられます。この重みこそが、ニューラルネットワークの出力を決定づける鍵となります。

フィードフォワード型ネットワークの学習の流れ

シンプルなフィードフォワード型(順伝播型)ニューラルネットワークは、以下の手順で動作・学習します。

  1. 入力を行列(2次元配列)として受け取る
  2. 入力に重みを掛け合わせる
  3. 活性化関数を適用する
  4. 出力を返す
  5. 教師データの正解出力と予測出力との差(誤差)を計算する
  6. 誤差に応じて重みを微調整する
  7. このプロセスを1,000回以上繰り返す。訓練データが多いほど、出力精度は向上する

具体例:テストの点数予測

例として、「勉強時間」と「睡眠時間」を入力し、「テストの点数」を予測するモデルを考えてみます。

勉強時間, 睡眠時間(入力)テストの点数(出力)
2, 992
1, 586
3, 689
4, 8?

このように、未知の入力に対しても、学習済みの重みを使って出力を予測できるのがニューラルネットワークの強みです。

Pythonでの実装例

それでは、NumPyを使った単一ニューロンのニューラルネットワークの実装例を見てみましょう。活性化関数には双曲線正接関数(tanh)を使用し、誤差に基づいて重みを更新することで学習を行います。

from numpy import exp, array, random, dot, tanh

class my_network():
def __init__(self):
random.seed(1)
# 3x1 の重み行列
self.weight_matrix = 2 * random.random((3, 1)) - 1

def my_tanh(self, x):
return tanh(x)

def my_tanh_derivative(self, x):
return 1.0 - tanh(x) ** 2

# 順伝播(フォワードプロパゲーション)
def my_forward_propagation(self, inputs):
return self.my_tanh(dot(inputs, self.weight_matrix))

# ニューラルネットワークの学習
def train(self, train_inputs, train_outputs, num_train_iterations):
for iteration in range(num_train_iterations):
output = self.my_forward_propagation(train_inputs)
# 出力の誤差を計算
error = train_outputs - output
adjustment = dot(train_inputs.T, error * self.my_tanh_derivative(output))
# 重み行列を調整
self.weight_matrix += adjustment

# ドライバーコード
if __name__ == "__main__":
my_neural = my_network()
print('Random weights when training has started')
print(my_neural.weight_matrix)

train_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
train_outputs = array([[0, 1, 1, 0]]).T

my_neural.train(train_inputs, train_outputs, 10000)
print('Displaying new weights after training')
print(my_neural.weight_matrix)

# 新しい入力でネットワークをテスト
print("Testing network on new examples ->")
print(my_neural.my_forward_propagation(array([1, 0, 0])))

実行結果

Random weights when training has started
[[-0.16595599]
[ 0.44064899]
[-0.99977125]]
Displaying new weights after training
[[5.39428067]
[0.19482422]
[0.34317086]]
Testing network on new examples ->
[0.99995873]

コードのポイント

  • 重みの初期化random.seed(1)により乱数を固定し、再現性のある結果を得ています。初期重みは−1〜1の一様乱数で生成されます。
  • 活性化関数:tanh関数は出力を−1〜1の範囲に圧縮する非線形関数で、その導関数は 1 − tanh²(x) と簡潔に表せます。
  • 学習(trainメソッド):順伝播で出力を求め、正解との誤差を計算し、誤差とtanhの微分値を掛け合わせたものを入力の転置行列との内積で重みの補正量として加算します。これは勾配降下法に基づくシンプルな学習手法です。
  • テスト:10,000回の反復学習後、新しい入力 [1, 0, 0] を与えると約0.99996という出力が得られ、正しく学習できていることが確認できます。

まとめ

このように、たった1つのニューロンでも、「重みの初期化 → 順伝播 → 誤差計算 → 重み更新」という一連の流れを実装するだけで、簡単なパターンを学習するニューラルネットワークを作ることができます。まずはこの最小構成のコードを実際に動かしながら、ニューラルネットワークの基本原理を体感してみてください。

  1. Pythonモジュールを単一ファイルにカプセル化することはできる?代替手段を徹底解説

    結論:単一ファイルへのカプセル化は原則として不可能 Pythonでは、一般的にモジュールを単一のファイルにカプセル化(まとめる)することはできません。その理由は、Pythonがモジュールを検索する仕組みが「ファイルとディレクトリ」に基づいているためです。すべてを1つのファイルに統合してしまうと、このモジュール検索の仕組み自体が壊れてしまいます。 しかし、権限不足などの理由でマシンにモジュールをインストールできない場合でも、いくつかの有効な代替手段があります。 代替手段①:sys.pathにディレクトリを追加する インストール権限がない場合は、モジュールファイルを別のディレクトリに保存し、sy

  2. Pythonで文字列がASCIIのみで構成されているかどうかを確認する方法

    Pythonで文字列がすべてASCII文字だけで構成されているかどうかを判定したい場面は少なくありません。ここでは、代表的な2つの方法をわかりやすく解説します。 方法1:all()とord()を使って1文字ずつチェックする 最もシンプルな方法は、文字列内の各文字を順番に調べ、その文字コード(Unicodeコードポイント)が128未満であるかを確認することです。ASCIIは0〜127のコードポイントで定義されているため、すべての文字がこの範囲内であれば、その文字列はASCIIのみで構成されていると判断できます。 def is_ascii(s): return all(ord(c) <