Spor salonumuzda bir modeli eğitmek için, önce eğitim verilerini toplamak için basit bir savaş döngüsü yazmamız gerekiyor. Bir sonraki adıma geçmek için env.step(action) çağırmanız gereken OpenAI’ın spor salonu ortamına benzer bir mekanı kullanıyoruz.
def run_battle(env, randomize_attributes = False, random_policy = False):
done = False
data_collection = {"s": [], "a": [], "r": []}
your_state, opponent_state = env.reset(randomize_attributes, random_policy)
your_attributes = env.your_fighter["battle_attributes"]
opponent_attributes = env.opponent_fighter["battle_attributes"]
state = get_state(your_state, opponent_state, your_attributes, opponent_attributes)
while not done:
action = env.fighters[0]["model"].select_action(state)
your_new_state, opponent_new_state, done, winner = env.step(action)
reward = get_reward(your_state, your_new_state, opponent_state, opponent_new_state, winner)
new_state = get_state(your_new_state, opponent_new_state, your_attributes, opponent_attributes)
data_collection["s"].append(state[0])
data_collection["a"].append(action)
data_collection["r"].append(reward)
your_state = your_new_state.copy()
opponent_state = opponent_new_state.copy()
state = new_state.copy()
return winner, data_collection
Bu döngüde eğitim verileri olarak durumları, eylemleri ve ödülleri topluyoruz. Fakat get_reward işlevini henüz tanımlamadık. Aşağıda, başlamanız için basit bir ödül fonksiyonu tanımlıyoruz. Ancak, araştırmacıların bundan daha yaratıcı ödül sistemi bulmalarını bekliyoruz:
def get_reward(your_state, your_new_state, opponent_state, opponent_new_state, winner):
opponent_health_delta = opponent_new_state["health"]- opponent_state["health"]
your_health_delta = your_new_state["health"] - your_state["health"]
hit_reward = (opponent_health_delta < 0) * 0.3
get_hit_reward = (your_health_delta < 0) * -0.3
result_reward = 0
if winner == "You":
result_reward = 2
elif winner == "Opponent":
result_reward = -2
return result_reward + hit_reward + get_hit_reward
Artık veri toplama için temel savaş döngümüze sahip olduğumuza göre, eğitimi uygulayabileceğimiz birkaç yol var. Aşağıda, oluşturduğumuz şablonda ikisini tanımlıyoruz. Her iki şablon da aynı eğitim döngüsünü paylaşır:
GAMMA = 0.95
def training_loop(env, episodes = 100):
for e in range(episodes):
winner, gameplay_data = run_battle(env)
states = np.array(gameplay_data["s"])
actions = np.array(gameplay_data["a"])
discounted_return = get_discounted_return(gameplay_data["r"], GAMMA)
env.fighters[0]["model"].train(states, actions, discounted_return)
get_discounted_return nasıl tanımladığımızı görmek için Başlangıç Modelleri ‘ne tekrar bakkın.
<aside> ♻️ Çekirdek eğitim döngüsü, tekrarlanan bu ilerlemeyi takip eder:
Run Battle → Collect Data → Train
</aside>
Çoğu araştırmacı, bu temsilci eğitim yöntemine aşina olacaktır. Araştırmacılar yalnızca bir etmeni geliştirmeye odaklanır ve bu etmenin ortamdaki eylemlerini simüle eder. AI Arena için, bu tür bir eğitim ortamı, oyundan ve öğrenmeyen bir rakip temsilciden oluşacaktır. Başlangıç şablonumuzda rakip olarak kurallara dayalı bir temsilciyi kullanıyoruz.
Bu eğitim yönteminde araştırmacı, birbirinin kopyası olan iki modelin eğitiminden sorumludur. Modeller periyodik olarak uyumsuz olarak eğitilir ve sürekli olarak güncellenir. Bu, modelin sürekli olarak önceki halinin daha iyi bir versiyonuyla karşı karşıya olduğu anlamına gelir. Bunu uygulamak için, antrenman yaptığınız modeli rakiple değiştireceğiniz bir aralık belirlemeniz yeterlidir. Daha fazla bilgi için bkz: Kendi Başına Oynama.
SWAP_INTERVAL = 50
if (e + 1) % SWAP_INTERVAL == 0:
env.swap_fighters()
<aside> ⬅️ Önceki
</aside>
<aside> ↩️ Geri Dön
</aside>