粒子群最適化 (PSO) は、関数の大域的な最適解を見つけるための母集団ベースの大域的最適化アルゴリズムです。これは、餌を探す鳥や魚の群れの行動をシミュレートするという考えに基づいています。母集団内の各粒子は候補解を表し、自身の経験とその近傍の経験に基づいて探索空間内のその位置を更新します。最もパフォーマンスの高いパーティクル、つまりグローバルで最も優れたパーティクルは、母集団全体の検索のガイドとして使用されます。
バックプロパゲーション (BP) は、人工ニューラル ネットワークをトレーニングするための教師あり学習アルゴリズムです。これは、ネットワークの重みを調整して、予測出力と実際のターゲットの間の誤差を最小限に抑えるために使用される勾配ベースの最適化手法です。誤差が計算され、ネットワークを通じて逆伝播されるため、次の反復で重みを更新して誤差を減らすことができます。BP は、画像認識、自然言語処理、制御システムなどのさまざまなアプリケーションで使用されます。
以下では、sk パッケージの PSO を使用して BP ニューラル ネットワークを最適化します。
1.ライブラリをロードする
import numpy as np
from sko.PSO import PSO
import matplotlib.pyplot as plt
2.活性化関数とその導関数を定義する
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
3.BPニューラルネットワークを定義する
class BP_Neural_Network:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
# Initialize the weight matrices
self.W1 = np.random.randn(self.input_size, self.hidden_size)
self.W2 = np.random.randn(self.hidden_size, self.output_size)
def forward(self, X):
self.z = np.dot(X, self.W1)
self.z2 = sigmoid(self.z)
self.z3 = np.dot(self.z2, self.W2)
o = sigmoid(self.z3)
return o
def backward(self, X, y, o):
self.o_error = y - o
self.o_delta = self.o_error * sigmoid_derivative(o)
self.z2_error = self.o_delta.dot(self.W2.T)
self.z2_delta = self.z2_error * sigmoid_derivative(self.z2)
self.W1 += X.T.dot(self.z2_delta)
self.W2 += self.z2.T.dot(self.o_delta)
def train(self, X, y):
o = self.forward(X)
self.backward(X, y, o)
def predict(self, X):
return self.forward(X)
4. 目的関数を定義する
def obj_func(weights):
nn.W1 = weights[0:3 * 2].reshape((3, 2))
nn.W2 = weights[3 * 2:].reshape((2, 1))
y_pred = nn.predict(X_train)
return np.mean(np.power(y_train - y_pred, 2))
5. BP ニューラル ネットワークを初期化する
nn = BP_Neural_Network(input_size=3, hidden_size=2, output_size=1)
6. 入出力データの初期化
X_train = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
y_train = np.array([[0], [1], [1], [0]])
7. PSO アルゴリズムを初期化する
pso = PSO(func=obj_func, n_dim=3 * 2 + 2, lb=[-10, -10, -10, -10, -10, -10, -10, -10], ub=[10, 10, 10, 10, 10, 10, 10, 10], pop=30, max_iter=100)
8. PSO は BP 重量を最適化します
pso.run()
nn.W1 = pso.gbest_x[0:3 * 2].reshape((3, 2))
nn.W2 = pso.gbest_x[3 * 2:].reshape((2, 1))
9. 最適化された BP を予測に使用する
y_pred = nn.predict(X_train)
print('Predicted outputs:', y_pred)
予測される出力: [[5.19002550e-05]
[9.99948100e-01]
[9.99948101e-01]
[5.19000440e-05]]
plt.plot(pso.gbest_y_hist)
plt.xlabel('Iteration')
plt.ylabel('Mean Squared Error')
plt.show()
Zhihuでの初公開: https://www.zhihu.com/people/quan-fu-wu-zhuang-de-da-shi-xiong-73/posts