はじめに
本記事では、遺伝的アルゴリズム(GA)を用いて、特定の関数を近似するニューラルネットワーク(NN)の重みとバイアスを学習させるプロセスを解説します。GAは、生物の進化を模倣した最適化手法であり、勾配法が適用しにくい複雑な問題に対しても有効な場合があります。
学習対象の関数は以下の通りです。 $$ f(x,y) = \frac{\sin(x^2) / \cos(y) + x^2 - 5y + 30}{80} $$
遺伝的アルゴリズム (GA: Genetic Algorithm)
GAは、生物の進化のメカニズム、特に「適者生存」の原則を模倣した探索アルゴリズムです。解の候補を「個体(遺伝子)」の集団として表現し、以下の遺伝的操作を繰り返すことで、より良い解へと進化させていきます。
GAの基本アルゴリズム
- 初期集団の生成: 解の候補となる個体(本記事ではNNの重みとバイアス)の集団をランダムに生成します。
- 適応度の計算: 各個体がどの程度問題に適しているかを評価する「適応度」を計算します。今回は、NNの出力と教師データとの誤差が小さいほど適応度が高くなります。
- 選択(再生): 適応度が高い個体ほど、次世代に遺伝子を残す機会が多くなるように個体を選択します。
- 交叉: 選択された個体のペアから、遺伝子の一部を交換することで新しい個体(子)を生成します。これにより、有望な解の要素が組み合わさることが期待されます。
- 突然変異: 一定の確率で、個体の遺伝子の一部をランダムに変化させます。これにより、局所解からの脱出や多様性の維持を促します。
- 世代交代: 新しく生成された個体群で、既存の個体群を置き換えます。
- 終了条件の判定: 設定した世代数に達するか、満足のいく解が得られたら終了します。そうでなければ、ステップ2に戻ります。
GAの性質
- 利点: 勾配情報が不要なため、関数の微分可能性や連続性を問わず、広範な問題に適用できます。大域的な探索能力があり、局所解に陥りにくいとされています。
- 課題: 最良の個体の情報が遺伝的操作(特に交叉)によって失われることがあります。また、多くのパラメータ(集団サイズ、交叉率、突然変異率など)の調整が必要であり、収束が保証されない点も課題です。
Pythonによる実装
NNの重みとバイアスのセットを一つの「遺伝子」とみなし、GAを用いてこの遺伝子を最適化します。
主要なパラメータ
| |
ニューラルネットワークのクラス
各個体に対応するNNをクラスとして定義します。
| |
GAのクラス
GAの操作(選択、交叉、突然変異)を実装します。
| |
main関数
| |
実験結果
各世代で最も適応度の高かった個体(エリート)をテストデータで評価し、その平均二乗誤差の推移をプロットしました。世代が進むにつれて誤差が減少し、NNが関数を学習している様子が確認できます。
