9. 雑記

K030 機械学習


機械学習についての覚書です。

ニューロン

ニューロンとは、神経細胞のことで、私たちの脳や神経系を構成する基本的な単位です。

機械学習におけるニューロンは、人間の脳の神経細胞を模倣した計算モデルです。複雑なデータのパターンを認識し、学習する能力を持つ人工知能の基盤となっています。

ニューロンの役割と構造

  • 情報伝達: ニューロンは、他のニューロンから入力を受け取り、それを処理して出力します。この処理は、入力値に重みをかけ、それらの総和に活性化関数を適用することで行われます。
  • 学習: ニューロンは、与えられたデータと正解ラベルとの間の誤差を最小化するように、重みを調整することで学習します。この学習過程は、バックプロパゲーションと呼ばれるアルゴリズムによって効率的に行われます。
  • ネットワーク形成: 多くのニューロンが互いに接続され、ニューラルネットワークを形成します。ニューラルネットワークの層の深さやニューロンの数によって、表現できる機能の複雑さが変わります。
Gemini生成

ニューロンの数学的な表現

ニューロンの出力yは、以下の式で表されます。

y = f(Σ(w_i * x_i) + b)
  • y: ニューロンの出力
  • f: 活性化関数(例:シグモイド関数、ReLU関数)
  • w_i: 入力x_iに対する重み
  • x_i: 入力
  • b: バイアス
gemini生成

発火の式(入力の線形和)

y = u(ω1x1 + ω2x2 + ω3x3 - θ) 入力の線形和

活性化関数(伝達関数)

シグモイドニューロン

出力にシグモイド関数を用いたもの。

ステップ関数を用いたものパーセプトロンモデル。

関数は発火の条件を表現します。連続関数であれば何でもよいです。

活性化関数と入力線形和でニューロンを構成します。

コード

人口ニューロン

入力は2つでx1,x2とします。それぞれの重みはw1,w2とします。閾値はθとします。
活性化関数はシグモイド関数とします。

import math

# 入力とパラメータ
x1 = 1  # 入力1
x2 = 1  # 入力2
w1 = 2  # 重み1
w2 = 3  # 重み2
theta = 4  # 閾値

# 活性化関数: シグモイド関数
def sigmoid(x):
    return 1 / (1 + math.exp(-x))

# ニューロンの出力計算
# 総和 (重み付き和 - 閾値)
weighted_sum = (w1 * x1) + (w2 * x2) - theta

# 出力
output = sigmoid(weighted_sum)

# 結果表示
print("ニューロンの出力:", output)

他の活性化関数

以下は、numpyを用いて、活性化関数としてtanh関数、ランプ関数を追加して、選択できるようにしたもの

import numpy as np

# 入力とパラメータ
x = np.array([1, 1])  # 入力ベクトル (x1, x2)
w = np.array([2, 3])  # 重みベクトル (w1, w2)
theta = 4  # 閾値

# 活性化関数の定義
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    return np.tanh(x)

def relu(x):
    return np.maximum(0, x)

# 活性化関数を選択するフラグ
# options: "sigmoid", "tanh", "relu"
activation_function = "tanh"  # ここを変更して切り替え

# 活性化関数の選択
if activation_function == "sigmoid":
    activation = sigmoid
elif activation_function == "tanh":
    activation = tanh
elif activation_function == "relu":
    activation = relu
else:
    raise ValueError("無効な活性化関数名です。'sigmoid', 'tanh', 'relu' のいずれかを指定してください。")

# ニューロンの出力計算
# 総和 (重み付き和 - 閾値)
weighted_sum = np.dot(w, x) - theta

# 出力
output = activation(weighted_sum)

# 結果表示
print(f"活性化関数: {activation_function}")
print("ニューロンの出力:", output)
シグモイド関数
双曲線正接関数
ランプ関数

入力の線形和の内積表現

以下のように、入力ベクトルにバイアス(-1)を追加し、重みベクトルに閾値(θ\thetaθ)を追加することで、総和を内積で表現できます。これにより、式が簡潔になり、処理も統一されます。

import numpy as np

# 入力とパラメータ
x = np.array([1, 1, -1])  # 入力ベクトル (x1, x2, バイアス)
w = np.array([2, 3, 4])   # 重みベクトル (w1, w2, 閾値)

# 活性化関数の定義
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    return np.tanh(x)

def relu(x):
    return np.maximum(0, x)

# 活性化関数を選択するフラグ
# options: "sigmoid", "tanh", "relu"
activation_function = "sigmoid"  # ここを変更して切り替え

# 活性化関数の選択
if activation_function == "sigmoid":
    activation = sigmoid
elif activation_function == "tanh":
    activation = tanh
elif activation_function == "relu":
    activation = relu
else:
    raise ValueError("無効な活性化関数名です。'sigmoid', 'tanh', 'relu' のいずれかを指定してください。")

# ニューロンの出力計算
# 総和 (内積)
weighted_sum = np.dot(w, x)

# 出力
output = activation(weighted_sum)

# 結果表示
print(f"活性化関数: {activation_function}")
print("ニューロンの出力:", output)

この修正により、総和をすべて内積 (dot product\text{dot product}dot product) で計算できるようになりました。これにより、計算式が一貫し、スケーラブルな構造になります。たとえば、より多くの入力やニューロンがある場合でも、この形式を簡単に拡張できます。

コメント