Veri Toplama


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>

Tek Taraflı RL


Ç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.

Kendi Başına Oynama


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>