🐸

遺伝的アルゴリズムによるNeuralNetworkのパラメータ変化 -オセロAI-

2024/11/17に公開

2年程前に、遺伝的アルゴリズムを用いてパラメータ調整を行ったオセロAIを、標準ライブラリのみで作成しました。実際のオセロはこちらで対戦できます

https://zenn.dev/takoyaki3/articles/6e5ff86ae36039

このオセロAIの学習過程で生成された重みデータをすべて保持していたので、その学習の様子を簡単に可視化してみました。重みデータはJSON形式では約2.58TBに達し、HDDの容量を圧迫していました。データを削除する前に、パラメータの変化を可視化して確認しました。

※ 一部の世代では、容量不足や書き込みエラー、コピーの失敗などによりデータが欠損しています。そのため、すべての世代で完全なデータを保持していた場合は、さらに大きなサイズになっていたと考えられます。

ニューラルネットワークおよび遺伝的アルゴリズムの設定

今回使用したオセロAIのニューラルネットワークと遺伝的アルゴリズムの概要は以下の通りです。

ニューラルネットワークの設定概要

ニューラルネットワークは、入力層・隠れ層・出力層の3層から構成されています。

次元数 設定理由
入力層 65 オセロのマス数(8×8=64)に加え、次の手番(先攻または後攻)の情報を加えた65次元の入力情報
隠れ層 200 表現力と演算コストのバランスから適当に200次元に設定
出力層 64 オセロ盤の64マスの中で、次に置くべきマスを決定するための出力

遺伝的アルゴリズムの設定概要

ニューラルネットワークのパラメータ調整は、以下の設定で遺伝的アルゴリズムを適用しました。

パラメータ 設定値
世代数 64206
親の1世代あたりの数 10
子供1世代あたりの生成数 100
突然変異率 0.002

特定のパラメータに着目した重み値の移り変わり

このニューラルネットワークには以下のようなパラメータ数が存在します:

  • 入力層と隠れ層の間に 65×200=13,000 個のパラメータ
  • 隠れ層と出力層の間に 200×64=12,800 個のパラメータ
  • 合計 25,800 個のパラメータ

これらのパラメータは遺伝的アルゴリズムにより強化されます。今回は特定の一か所に注目し、そのパラメータ値の推移を可視化しました。

0世代目から10世代目の可視化

次の画像は、0世代目から10世代目のパラメータ値の推移を示しています。

可視化の説明

  • 横軸: 重みのインデックス(0から99)。値の小さい順に並べています。
  • 縦軸: 世代(上から下に進む)。
  • 色: 重みの値を表現
    • 赤: 正の値(正の相関)
    • 青: 負の値(負の相関)
    • 黒や紫: 値が0付近(影響が小さい重み)

学習の進行状況

この画像から、以下が読み取れます:

  1. 0世代目: 乱数で初期化されたため、すべての個体に多様性があり、グラデーションが均一。
  2. 1世代目: 強い個体の遺伝子が引き継がれ、グラデーションが粗くなる。
  3. 2世代目以降: 特定の遺伝子が選択され、最終的に赤一色に収束。

0世代目から1000世代目の可視化

次に、範囲を広げて0世代目から1000世代目のパラメータ値を可視化しました。

詳細な解析

  • 赤色から赤紫色への変化が見られる。これは突然変異で新しい遺伝子が登場し、次第に全個体に広がる過程を示します。
  • 以下の画像のように、数世代にわたり拮抗した後、新しい遺伝子が完全に置き換わる様子が観察されます。

遺伝子の広がり方のパターン

  • 一部の遺伝子は即座に全個体に広がる。
  • 一方で、途中で広がりきらず消滅する遺伝子も確認されます。

学習過程でのパラメータ推移

これまでに特定のパラメータに着目してその値の推移を可視化しましたが、今回はニューラルネットワーク全体の重み(Input-Hidden Weights および Hidden-Output Weights)の変化を複数の世代にわたって可視化してみました。これにより、個々のパラメータではなく、より広範な視点で学習過程の挙動を見てみます。

以下の図は、Chart.jsを用いて生成したインタラクティブな折れ線グラフで、1000世代目から64000世代目までの各世代における1個体目の重み値の変化を視覚化したものです。

長い期間に渡って重みの推移を見ていくと今回可視化したパラメータはすべて定期的に入れ替わっており、初期状態からのパラメータは一つもないことが読み取れます。

重みの推移

入力層と隠れ層の間の重み(wi)及び隠れ層と出力層の間の重み(wo)の中からランダムに選択したいくつかの重み値の推移を示しています。

  • 横軸: 学習世代。
  • 縦軸: 各重み値の数値。
  • 折れ線: 個々の重みを表し、色はランダムに割り当てられています。

学習過程のパラメータの推移をグラフ化するコードはこちら

終わりに

今回のようなニューラルネットワークのパラメータ設定は学習アルゴリズムによって大きく異なるはずなので、遺伝的アルゴリズムの他の次世代生成アルゴリズムや別の学習方法によるニューラルネットワークのパラメータ学習における変化も比べてみたると面白そうです。

Discussion