進化學習的基本循環:
-
初始化一群模型/參數(種群)
-
評估每個個體的適應度(fitness)
-
選擇優秀個體
-
交叉、變異產生下一代
-
重複多代,直到效果滿意
常見方向:
· 遺傳算法 GA:優化超參數、組合問題
· 進化策略 ES:優化連續參數,如神經網絡權重
· 遺傳編程 GP:進化出表達式或程序
· 神經進化 Neuroevolution:進化神經網絡權重/結構
· NEAT:同時進化網絡拓撲結構和權重
Python 常用庫:
· DEAP:通用進化算法
· PyGAD:遺傳算法
· NEAT-Python:神經進化
· EvoTorch:基於 PyTorch 的進化策略
· CMA:CMA-ES 連續優化
一個可運行的簡單例子:進化策略學線性回歸
目標:讓模型學會 y = 2x + 1。
```python
import numpy as np
np.random.seed(42)
數據
X = np.linspace(-1, 1, 100)
y = 2 * X + 1 + 0.1 * np.random.randn(100)
個體是 w, b
def fitness(p):
w, b = p
pred = w * X + b
return -np.mean((pred - y) ** 2) # 負均方誤差,越大越好
pop_size = 50
elite_size = 10
sigma = 0.1
generations = 200
初始化種群
pop = np.random.randn(pop_size, 2)
for gen in range(generations):
scores = np.array(fitness(p) for p in pop)
best_idx = np.argmax(scores)
if gen % 20 == 0:
print(f"Gen {gen:3d} | fitness={scoresbest_idx:.4f} | w,b={popbest_idx}")
選擇精英
elite = popnp.argsort(scores)\[-elite_size:]
變異產生下一代
children = \[\]
for _ in range(pop_size):
parent = elitenp.random.randint(elite_size)
child = parent + sigma * np.random.randn(2)
children.append(child)
pop = np.array(children)
最終結果
best = popnp.argmax(\[fitness(p) for p in pop)]
print("學到的參數:", best)
print("真實參數: 2, 1")
```
運行後會看到 w 接近 2,b 接近 1。
如果你想進化神經網絡
把上面的 w, b 換成神經網絡的所有權重:
· 每個個體 = 一組網絡權重
· fitness = 遊戲得分、準確率、損失的倒數
· 用 EvoTorch 或 NEAT-Python 更方便
注意點
· 適應度函數是關鍵,設計不好進化會跑偏
· 要保留種群多樣性,避免早熟收斂
· 可加入交叉、精英保留、自適應變異
· 計算量大時可並行評估
· 常和梯度下降混合使用:進化調結構/超參數,梯度訓權重
仅供参考用。