機械学習についての覚書です。
ニューロン
ニューロンとは、神経細胞のことで、私たちの脳や神経系を構成する基本的な単位です。
機械学習におけるニューロンは、人間の脳の神経細胞を模倣した計算モデルです。複雑なデータのパターンを認識し、学習する能力を持つ人工知能の基盤となっています。
ニューロンの役割と構造
Gemini生成
- 情報伝達: ニューロンは、他のニューロンから入力を受け取り、それを処理して出力します。この処理は、入力値に重みをかけ、それらの総和に活性化関数を適用することで行われます。
- 学習: ニューロンは、与えられたデータと正解ラベルとの間の誤差を最小化するように、重みを調整することで学習します。この学習過程は、バックプロパゲーションと呼ばれるアルゴリズムによって効率的に行われます。
- ネットワーク形成: 多くのニューロンが互いに接続され、ニューラルネットワークを形成します。ニューラルネットワークの層の深さやニューロンの数によって、表現できる機能の複雑さが変わります。
ニューロンの数学的な表現
ニューロンの出力yは、以下の式で表されます。
y = f(Σ(w_i * x_i) + b)
gemini生成
- y: ニューロンの出力
- f: 活性化関数(例:シグモイド関数、ReLU関数)
- w_i: 入力x_iに対する重み
- x_i: 入力
- b: バイアス
発火の式(入力の線形和)
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) で計算できるようになりました。これにより、計算式が一貫し、スケーラブルな構造になります。たとえば、より多くの入力やニューロンがある場合でも、この形式を簡単に拡張できます。
コメント