NEAT-Pythonの公式ドキュメントを見ながら少しずつ読んでいく（2）

NEAT-Python の公式ドキュメントを見ながら少しずつ読んでいく（1）の続きです。

https://qiita.com/fromItoI/items/dbe8f420711aaf74b620

今回は, NEAT-Python の [Config](https://neat-python.readthedocs.io/en/latest/config_file.html) ファイルを見ていきます。

> Most settings must be explicitly enumerated in the configuration file. 
> ほとんどの設定は設定ファイルで明示的に列挙する必要があります。
>
> Note that the `Config` constructor also requires you to explicitly specify the types that will be used for the NEAT simulation. 
> なお、`Config`コンストラクタは、NEATシミュレーションに使用される型を明示的に指定する必要があります。

これにより、ライブラリコードがアップデートされて変更が加えられたとしても、個々人の作成ソースコードに影響を与える可能性が低くなります。

この [Config](https://neat-python.readthedocs.io/en/latest/config_file.html) ファイルには、複数のセクションがあります。

## [NEAT] セクション
> The `NEAT` section specifies parameters particular to the generic NEAT algorithm or the experiment itself.
>
> NEATセクションは、一般的なNEATアルゴリズムまたは実験そのものに特有のパラメータを指定します。

このNEATセクションはNEAT-Pythonの中核をなす部分で、必須の部分です。ここで、NEATの実行に必要なパラメータを設定していきます。
必要なパラメータは以下の5つです。

<dl>
  <dt>fitness_criterion : フィットネス基準</dt>
  <dd>遺伝子適応度の終了基準を計算する際に用いられる関数です。min, max, meanを指定します。</dd>
  <dt>fitness_threshold : フィットネス閾値</dt>
  <dd>適応度がこの閾値以上になるとfitness_criterionが呼び出され、進化が終了します。この閾値を超える前に進化が最大世代数に達した場合は、fitness_criterionは呼び出されません。</dd>
  <dt>no_fitness_termination : フィットネス終了なし</dt>
  <dd>これがTrueの場合は、もし適応度がフィットネス閾値を超えたとしても、fitness_criterionは呼び出されません。デフォルトは<strong>False</strong>となっています。</dd>
  <dt>pop_size : 集団サイズ</dt>
  <dd>各世代の個体数を示します。</dd>
  <dt>reset_on_extinction : 消滅時リセット</dt>
  <dd>これがTrueの場合、仮に進化が停滞して種が全滅したとしても、新しい集団が生成されるようになります。</dd>
</dl>

## [DefaultStagnation] セクション
このセクションで設定するパラメータは次の3つです。

<dl>
  <dt>species_fitness_func : 種のフィットネス機能</dt>
  <dd>種の適応度を計算するために使用される関数です。max, min, mean, medianを指定することができ、デフォルトは<strong>mean</strong>です。</dd>
  <dt>max_stagnation : 最大停滞数</dt>
  <dd>もしこの世代数を超えても改善が見られないような種は停滞しているとして、削除されます。デフォルトは<strong>15</strong>です。</dd>
  <dt>species_elitism : 種のエリート主義</dt>
  <dd>停滞から保護される種の数を示します。例えば3と設定すると、種の適応度の最も高い3つの種が、たとえ改善が示されなかったとしても、停滞により削除されなくなります。デフォルトは<strong>0</strong>です。</dd>
</dl>

## [DefaultReproduction] セクション
このセクションで設定するパラメータは次の3つです。
<dl>
  <dt>elitism : エリート主義</dt>
  <dd>ある世代iから次の世代i+1までそのまま保存されるような、各種内の最も適応した個体の数を示します。デフォルトは<strong>0</strong></dd>
  <dt>survival_threshold : 生存閾値</dt>
  <dd>各世代で再生産することのできる各種の割合です。デフォルトは<strong>0.2</strong>です。</dd>
  <dt>min_species_size : 最小の種のサイズ</dt>
  <dd>交叉などの後の種ごとの最小遺伝子数です。デフォルトは<strong>2</strong>です。</dd>
</dl>

## [DefaultSpeciesSet] セクション
このセクションで設定するパラメータは次の1つです。個体を種ごとに分ける際に設定すべきパラメータです。

<dl>
  <dt>compatibility_threshold : 互換性閾値</dt>
  <dd>遺伝的距離がこの閾値を下回るような個体同士は、同じ種であると見なされます。</dd>
</dl>

## [DefaultGenome] セクション
このセクションで設定するパラメータは47個あります。遺伝子の実装の際に設定すべきパラメータ達です。


<dl>
  <dt>activation_default : 活性化関数の選択</dt>
  <dd>新しいノードに割り当てられる活性化関数の種類を表します。指定がないか、または <strong>random</strong> を指定している場合、<strong>activation_options</strong> からランダムに1つ選ばれます。</dd>
  <dt>activation_mutate_rate : 活性化関数の突然変異率</dt>
  <dd>突然変異によりノードの活性化関数が、<strong>activation_options</strong>の中からランダムに1つ選択され、置き換えるような確率です。</dd>
  <dt>activation_options : 活性化関数の種類</dt>
  <dd>ノードで使用できるような活性化関数の種類を表します。デフォルトは<strong>sigmoid</strong>（シグモイド関数）です。</dd>
  <dt>aggregation_default : 集約関数の選択</dt>
  <dd>新しいノードに割り当てられる集約関数の種類を表します。指定がないか、または <strong>random</strong> を指定している場合、<strong>aggregation_options</strong> からランダムに1つ選ばれます。</dd>
  <dt>aggregation_mutate_rate : 集約関数の突然変異率</dt>
  <dd>突然変異によりノードの集約関数が、<strong>aggregation_options</strong>の中からランダムに1つ選択され、置き換えるような確率です。</dd>
  <dt>aggregation_options : 集約関数の種類</dt>
  <dd>ノードで使用できるような集約関数の種類を表します。デフォルトは<strong>sum</strong>です。他にも、product, min, max, mean, median, maxabsを選択することができます。</dd>
  <dt>bias_init_mean : バイアスの初期平均値</dt>
  <dd>新しいノードにバイアスを加える際に使用する正規分布の平均値を表します。</dd>
  <dt>bias_init_stdev : バイアスの初期標準偏差</dt>
  <dd>新しいノードにバイアスを加える際に使用する正規分布の標準偏差を表します。</dd>
  <dt>bias_init_type : バイアスの初期の型</dt>
  <dd>新しいノードにバイアスを加える際に使用する分布の種類を表します。gaussianまたはnormalに設定すると正規分布となり、uniformに設定すると一様分布となります。デフォルトは<strong>gaussian</strong>です。</dd>
  <dt>bias_max_value : バイアスの最大値</dt>
  <dd>バイアスとして許容される最大値です。</dd>
  <dt>bias_min_value : バイアスの最小値</dt>
  <dd>バイアスとして許容される最小値です。</dd>
  <dt>bias_mutate_power : バイアスの突然変異の強さ</dt>
  <dd>バイアスの突然変異により引かれるゼロ中心正規分布の標準偏差です。</dd>
  <dt>bias_mutate_rate : バイアスの突然変異率</dt>
  <dd>突然変異がノードのバイアスを変更するような確率です。</dd>
  <dt>bias_replace_rate : バイアスの代替率</dt>
  <dd>ノードのバイアスが突然変異により新しいランダムな値に置き換わるような確率を表します。</dd>
  <dt>compatibility_disjoint_coefficient : 互換性の分離係数</dt>
  <dd>分離および余剰遺伝子が遺伝子距離に貢献する度合いの係数です。</dd>
  <dt>compatibility_weight_coefficient : 互換性の重み係数</dt>
  <dd>遺伝子距離への、各重み、バイアス、または応答の乗数差分の寄与に対する係数</dd>
  <dt>conn_add_prob : 接続の追加の確率</dt>
  <dd>突然変異が既存のノード間に新たな接続を追加するような確率です。</dd>
  <dt>conn_delete_prob : 接続の削除の確率</dt>
  <dd>突然変異が既存接続を削除するような確率です。</dd>
  <dt>enabled_default : デフォルトの有効な属性</dt>
  <dd>新しく作成された接続のデフォルトの有効な属性です。有効な値はTrueとFalseです。</dd>
  <dt>enabled_mutate_rate : 利用可能な突然変異率</dt>
  <dd>突然変異が接続の有効状態を置き換えるような確率です。</dd>
  <dt>enabled_rate_to_false_add : 接続を無効にする確率</dt>
  <dd>接続が現在有効である場合、enabled_mutate_rate に加算されます。</dd>
  <dt>enabled_rate_to_true_add : 接続を有効にする確率</dt>
  <dd>接続が現在無効である場合、enabled_mutate_rate に加算されます。</dd>
  <dt>feed_forward : フィードフォワード</dt>
  <dd>これがTrueの場合、生成されるネットワークはフィードフォワードネットワークとなり、再帰的な接続を持たないようになります。</dd>
  <dt>initial_connection : 初期接続</dt>
  <dd>
  新たに生成される遺伝子の初期接続性を指定します。デフォルトでは、初期状態では接続は存在しません。以下の7つの許可された値があります：
    <ul>
        <li>fs_neat_nohidden - ランダムに選択された1つの入力ノードが各出力ノードに1つの接続を持ちます。</li>
        <li>fs_neat_hidden - ランダムに選択された1つの入力ノードが各中間ノードおよび出力ノードに1つの接続を持ちます。</li>
        <li>full_nodirect - 各入力ノードは、中間ノードが存在する場合はすべての中間ノードに、および各中間ノードはすべての出力ノードに接続されます。それ以外の場合、各入力ノードはすべての出力ノードに接続されます。</li>
        <li>full_direct - 各入力ノードは、すべての中間ノードおよび出力ノードに接続され、各中間ノードはすべての出力ノードに接続されます。</li>
        <li>partial_nodirect # - full_nodirectと同様ですが、各接続の存在確率は数値によって決定されます。</li>
        <li>partial_direct # - full_directと同様ですが、各接続の存在確率は数値によって決定されます。</li>
    </ul>
  </dd>
  <dt>node_add_prob : ノードの追加</dt>
  <dd>突然変異が新しいノードを追加する確率です。基本的には、既存の接続の有効状態をFalseにして、置き換えるようになっています。</dd>
  <dt>node_delete_prob : ノードの削除</dt>
  <dd>突然変異が既存のノードを削除する確率です。</dd>
  <dt>num_hidden : 中間ノード数</dt>
  <dd>初期集団内で、それぞれの遺伝子を追加するような中間ノードの数を示します。</dd>
  <dt>num_inputs : 入力数</dt>
  <dd>ネットワークが受け取るような入力ノードの数を示します。</dd>
  <dt>num_outputs : 出力数</dt>
  <dd>ネットワークが出力するような出力ノードの数を示します。</dd>
  <dt>response_init_mean : 応答の初期平均値</dt>
  <dd>新しいノードの応答乗数属性の値を選択するために使用する正規分布の平均値です。</dd>
  <dt>response_init_stdev : 応答の初期標準偏差</dt>
  <dd>新しいノードの応答乗数属性の値を選択するために使用する正規分布の標準偏差です。</dd>
  <dt>response_init_type : 応答の初期の型</dt>
  <dd>gaussianまたはnormalに設定すると正規分布となり、uniformに設定すると一様分布となります。デフォルトは<strong>gaussian</strong>です。</dd>
  <dt>response_max_value : 応答の最大値</dt>
  <dd>許容される最大応答乗数です。</dd>
  <dt>response_min_value : 応答の最小値</dt>
  <dd>許容される最小応答乗数です。</dd>
  <dt>response_mutate_power : 応答の突然変異の強さ</dt>
  <dd>応答乗数の突然変異が選択されるゼロ中心の正規分布の標準偏差です。</dd>
  <dt>response_mutate_rate : 応答の突然変異率</dt>
  <dd>突然変異がノードの応答乗数を変更する確率です。</dd>
  <dt>response_replace_rate : 応答の代替率</dt>
  <dd>突然変異がノードの応答乗数を新たに選択したランダムな値で置き換える確率です。</dd>
  <dt>single_structural_mutation : 単一構造の突然変異</dt>
  <dd>これがTrueの場合、世代ごとの遺伝子ごとに構造的な変異（ノードまたは接続の追加または削除）が1つだけ許可されます。これはデフォルトで<strong>False</strong>です。</dd>
  <dt>structural_mutation_surer : 構造的な突然変異の共有</dt>
  <dd>これがTrueの場合、接続のないゲノムにノードを追加しようとすると、代わりに接続が追加されます。さらに、既在の接続を追加しようとする場合、その接続は有効になります。これはデフォルトで<strong>default</strong>です。</dd>
  <dt>weight_init_mean : 重みの初期平均値</dt>
  <dd>新しい接続の重みを選択する際に使用される正規分布の平均値です。</dd>
  <dt>weight_init_stdev : 重みの初期標準偏差</dt>
  <dd>新しい接続の重みを選択する際に使用される正規分布の標準偏差です。</dd>
  <dt>weight_init_type : 重みの初期の型</dt>
  <dd>gaussianまたはnormalに設定すると正規分布となり、uniformに設定すると一様分布となります。デフォルトは<strong>gaussian</strong>です。</dd>
  <dt>weight_max_value : 重みの最大値</dt>
  <dd>許容される重みの最大値です。</dd>
  <dt>weight_min_value : 重みの最小値</dt>
  <dd>許容される重みの最小値です。</dd>
  <dt>weight_mutate_power : 重みの突然変異の強さ</dt>
  <dd>重みの突然変異が選択されるゼロ中心の正規分布の標準偏差です。</dd>
  <dt>weight_mutate_rate : 重みの突然変異率</dt>
  <dd>突然変異が接続の重みを変更するような確率です。</dd>
  <dt>weight_replace_rate : 重みの代替率</dt>
  <dd>突然変異が接続の重みを新たに選択したランダムな値で置き換える確率です。</dd>
</dl>

## まとめ
以上5つのセクションの内容を、簡単に日本語化しました。次は、基本的なXORの例を見ていきます。