Sinir Ağı'na kart oyunu oynamayı öğretin
Şu anda kart oyunu oynamak için bir motor yazıyorum, çünkü bu oyun için henüz motor yok.
Daha sonra oyuna nöral bir ağ getirebilmeyi ve oyunu oynamayı öğrenmesini umuyorum.
Motoru AI oynatıcı için faydalı olacak şekilde yazıyorum. Seçim noktaları vardır ve bu noktalarda geçerli seçeneklerin bir listesi sunulur. Rastgele seçim oyunu oynayabilir (iyi olmasa da).
Sinir ağları (çoğunlukla NEAT ve HyperNEAT) hakkında çok şey öğrendim ve hatta kendi uygulamamı oluşturdum. Bu tür oyunlardan birindeki tüm değişkenleri dikkate alabilecek en iyi AI nasıl oluşturulacağından hala emin değilim. Ortak bir yaklaşım var mı? Keldon'un iyi bir karmaşıklığa sahip olan RftG için iyi bir AI yazdığını biliyorum, nasıl böyle bir AI oluşturmayı başardığından emin değilim.
Herhangi bir tavsiye? Mümkün mü? Bunun güzel örnekleri var mı? Girdiler nasıl haritalandı?
EDIT: Çevrimiçi baktım ve sinir ağlarının nasıl çalıştığını ve genellikle görüntü tanıma veya basit bir ajanı yönetme ile ilgili olduklarını öğrendim. Karmaşık bir sinerjiye sahip kartlarla seçim yapmak için nasıl ya da nasıl uygulayacağımdan emin değilim. Neye bakmam gerektiğine dair herhangi bir yön çok takdir edilecektir.
Oyun hakkında: Oyun Magic: The Gathering benzer. Sağlık ve yetenekleri olan bir komutan var. Oyuncular, tahtaya köleler ve büyüler koymak için kullandıkları bir enerji havuzuna sahiptir. Minyonların sağlık, saldırı değerleri, maliyetleri vb. Vardır. Kartların da yetenekleri vardır, bunlar kolayca numaralandırılmaz. Kartlar elden oynanır, desteden yeni kartlar çekilir. Bunların hepsi sinir ağının dikkate almasının faydalı olacağı yönlerdir.
Hey, AI.SE'ye hoş geldiniz! Bu şu anda olduğu gibi, ona iyi cevap verebilmemiz için biraz geniş görünüyor. Biraz daraltmak için düzenleyebileceğinizi düşünüyor musunuz ? Teşekkürler!
Soru geniş olmakla birlikte, bu alanda yeni olan biri için açık ve yaygın bir sorudur. Ayrıca, Google'ı kullanarak yanıt bulmak zor olan bir şey (NN hakkındaki çoğu öğretici görüntü tanıma ve dil örneklerine odaklanıyor gibi görünüyor). Oyun oynamak için NN kullanma yaklaşımları ve teknikleri hakkında iyi kaynaklara işaret eden bir cevabı hak ettiğini düşünüyorum, bu durumda özellikle kart oyunları.
— user12889 18:17
Geri dönüşünüz için teşekkür ederiz. Sorumu biraz düzenledim. Öğrenme materyallerine yönelik herhangi bir yön, yardımcı olacaktır. Bahsettiğiniz gibi çoğunlukla görüntü tanıma buluyorum. Öğrenmeye hevesliyim ve basit bir cevaptan ziyade çok sayıda önerilen okumaya sahip olduğum için mutluyum.
İyi bir soru, özellikle NN giriş ve çıkışlarının, mevcut eylemlerin bağlamla büyük ölçüde değiştiği MtG gibi bir kart oyununun mekaniğine nasıl eşlendiğine dair WRT olduğunu düşünüyorum.
Sunmak için gerçekten tatmin edici bir cevabım yok, ancak Galaxy NN tabanlı AI için Keldon'un Yarışı'nı oynadım - mükemmel olduğuna katılıyorum - ve bu sorunu nasıl çözdüğüne baktım.
Keldon AI için en son kod artık aranabilir ve taranabilir olduğunu github .
AI kodu bir dosyada . Biri "el ve aktif kartları değerlendirmek" ve diğeri "rol seçimlerini tahmin etmek" için 2 ayrı NN kullanır.
Fark edeceğiniz şey, oyun mekaniğini modellemek için NN olmayan kodda adil bir miktar kullanmasıdır. Çok hibrit bir çözüm.
Oyun durumunun NN değerlendirmesine eşlenmesi burada yapılır . Çeşitli ilgili özellikler bir sıcak kodludur, örneğin, bu dönüşte satılabilecek malların sayısı.
Karmaşık bir oyunu bir NN'ye eşleştirmedeki bir başka mükemmel vaka çalışması, Deepmind tarafından Blizzard Entertainment ile işbirliği içinde oluşturulan Starcraft II Öğrenme Ortamıdır. Bu makale , bir Starcraft oyununun bir NN'nin yorumlayabileceği bir dizi özelliğe nasıl eşlendiğine ve bir NN ajanı tarafından oyun simülasyonuna eylemlerin nasıl verilebileceğine genel bir bakış sunmaktadır.
Bu tamamen mümkündür, ancak girdilerin haritalanma şekli büyük ölçüde kart oyunu türüne ve nasıl oynandığına bağlıdır.
Birkaç olasılığı dikkate alacağım:
Bu oyunda zaman önemli mi? Geçmiş hareket geleceği etkiler mi? Bu durumda, Tekrarlayan Sinir Ağlarını (LSTM'ler, GRU'lar vb.) Kullanmanız daha iyi olur.
Sinir Ağı'nın topladığınız verilerden öğrenmesini veya kendi başına öğrenmesini ister misiniz? Kendi başına, nasıl? Oyunu onlarca veya yüzlerce kez oynadığınıza dair veri toplarsanız, Sinir Ağına besleyin ve sizden öğrenmesini sağlayın, "Davranışsal Klonlama" adlı bir şey yapıyorsunuz. Ancak, NN'nin kendi kendine öğrenmesini istiyorsanız, bunu 2 şekilde yapabilirsiniz:
a) Takviye Öğrenme - RL, Sinir Ağının kendisine karşı oynayarak öğrenmesini sağlar kez .
b) NEAT / Genetik Algoritma - NEAT, Sinir Ağının genetik bir algoritma kullanarak öğrenmesini sağlar.
Ancak, yine, Neural Net'in giriş ve çıkışlarının nasıl kodlanması gerektiği konusunda daha spesifik olmak için, kart oyununun kendisi hakkında daha fazla bilgi sahibi olmalıyım.
Merhaba, cevap için teşekkürler! Neyin geçerli olduğunu görmek için bu alanları araştıracağım. Oyunun kısa bir açıklaması ekledim, bu sizin için daraltıyor. Motorum geri alma işlemlerini destekler, böylece NN ile birlikte faydalı olabilir. Motor bitmediğinden, bir örnek setim yok, ancak tüm oyun geçmişlerini hosting sunucusundan 2 oyuncu arasında tutmayı planlıyorum. Süreci hızlandırmak için geri yayılmayı kullanmayı düşünüyordum.
Eğer oyun durumu önemliyse, ama bu duruma nasıl ulaştığınız değilse , o zaman zamanın önemli olduğunu söyleyebilir misiniz? Zamanın önemli olduğu ve zamanın önemli olmadığı oyunlardan herhangi bir örnek verebilir misiniz? Şu anda sadece mevcut devlet meselelerinde durumlarda düşünebiliriz (var öyle çevirmek ne bilinen kartları veya oyun adet nerede) ama orada var değil nasıl nerede olduklarını (tek şey konularda olduğu şimdi onlar değil, nerede iki dönüşten önce)
Ağınızın, oyun hakkında AI ajanının sahip olduğu kartlar (değerleri ve türleri), mana havuzu, masada kaç kart ve değerleri, dönüş sayısı vb.Gibi oyun hakkında önemli bilgileri bilmesini istersiniz. Kendi başınıza anlamanız gereken bu şeyler, kendinize sormanız gereken soru "Bu değeri sistemimi nasıl ve neden iyileştireceğini girmek için eklersem" dir. Ancak anlaşılması gereken ilk şey, NN'lerin çoğunun sabit bir giriş boyutuna sahip olacak şekilde tasarlanması ve oyuncuların elinde veya masada farklı miktarda kart olabileceğinden, bu oyunda önemli olduğunu varsayacağım. Örneğin, NN'ye hangi kartlara sahip olduğunu bildirmek istersiniz, oyuncunun elinde en fazla 5 kart olabileceğini ve her kartın 3 değerine (mana, saldırı ve sağlık) sahip olabileceğini varsayalım, böylece bunu 5 olarak kodlayabilirsiniz * 3 vektör, burada ilk 3 değer bir numaralı kartı temsil eder vb. Ancak oyuncunun şu anda 3 kartı varsa, basit bir yaklaşım son 6 girişe sıfır atamak olacaktır, ancak bazı kartlar 0 mana maliyeti veya 0 saldırıya sahip olabileceğinden bu sorunlara neden olabilir. Bu yüzden bu sorunu nasıl çözeceğinizi anlamanız gerekiyor. Değişken giriş boyutunu işleyebilen veya girişi sabit boyutlu bir vektör olarak nasıl kodlayacağınızı anlayabilen NN modelleri arayabilirsiniz.
İkinci olarak, çıktılar da sabit boyutlu vektörlerdir. Bu tür bir oyun durumunda, ajanın yapabileceği eylemleri kodlayan bir vektör olabilir. Diyelim ki 3 eylemimiz var: bir kart koyun, sırayla atlayın ve kabul edin. Yani bir sıcak kodlayıcı olabilir, örneğin 1 0 0 çıkışınız varsa, bu, ajanın bir kart koyması gerektiği anlamına gelir. Hangi kartı koyması gerektiğini bilmek için çıktıya 1 ila 5 arasında bir sayı üretecek başka bir öğe ekleyebilirsiniz (5, eldeki maksimum kart sayısıdır).
Ancak bir sinir ağını eğitmenin en önemli kısmı, görevinize uygun bir kayıp fonksiyonu bulmanız gerektiğidir. Belki Ortalama kare kaybı veya L2 gibi standart kayıp fonksiyonları iyi olacaktır, belki ihtiyaçlarınızı karşılamak için bunları değiştirmeniz gerekecektir. Bu, araştırma yapmanız gereken bölümdür. Daha önce hiç NEAT ile çalışmadım, ama doğru olarak anladığım gibi, NN oluşturmak ve eğitmek için bazı genetik algoritmalar kullanıyor ve GA bir birey seçmek için bazı fitness fonksiyonlarını kullanıyor. Temel olarak, modelinizin ne kadar iyi performans gösterdiğini değerlendirmek için hangi metriği kullanacağınızı bilmeniz gerekir ve bu metriğe dayanarak modelin parametrelerini değiştirirsiniz.
PS. Bu problemi sinir ağı ile çözmek mümkündür, ancak sinir ağları sihir değildir ve tüm sorunlara evrensel bir çözüm değildir. Amacınız bu belirli sorunu çözmekse, aynı zamanda oyun teorisini ve AI'daki uygulamasını incelemenizi de tavsiye ederim. Şunu söyleyebilirim ki, bu sorunun çözümü yapay zekanın farklı alanlarından karmaşık bilgi gerektirecektir.
Ancak, amacınız sinir ağları hakkında bilgi edinmekse, çok daha basit görevler almanızı tavsiye ederim. Örneğin, karşılaştırma veri kümesinde çalışacak olan NN'yi, örneğin MNIST veri kümesindeki rakamları sınıflandıran NN'yi uygulayabilirsiniz. Bunun nedeni, bu veri kümesinde sınıflandırmanın nasıl yapılacağı hakkında çok sayıda makalenin yazılması ve çok şey öğreneceksiniz ve basit şeyleri uygulamaktan daha hızlı öğreneceksiniz.
Soruya Genel Bakış
Sistemin tasarım hedefi, bir kart oyunu oyun motoru ile birlikte bir veya daha fazla yapay ağ kullanarak kazançlı bir stratejik avantaj kazanmak gibi görünüyor.
Soru, Morgenstern ve von Neuman'ın Oyun Teorisi'nde ana hatlarıyla belirtildiği gibi oyunun temelleri hakkında genel bir farkındalığı göstermektedir .
Oyun sırasında belirli noktalarda oyuncu hamle yapmak için gerekli olabilir.
Oyunun kurallarına göre bir dizi hareket seçeneği vardır.
Bir hamle seçmeye yönelik bazı stratejiler, birden fazla oyun üzerinde diğer stratejilerden daha yüksek kazanan rekorlar üretir.
Yapay bir ağ, rastgele hareket seçimini daha sık kazanan oyun oynama stratejileri üretmek için kullanılabilir.
Oyunun diğer özellikleri de belli olabilir veya olmayabilir.
Her hareket noktasında, oyun oynama başarısını iyileştirmeye dahil olan herhangi bir bileşen tarafından ihtiyaç duyulan bir oyun durumu vardır.
Rakibin ne zaman blöf yapacağını bilmemeye ek olarak, kart oyunlarında, karıştırılmış kartların gizli sırası, hareketleri yaklaşık rastgele olan sanal bir oyuncunun eşdeğerini tanıtabilir.
Üç veya daha fazla oyuncu oyununda, ortakların veya potansiyel ortakların sinyalleri, kazanan oyun stratejisini herhangi bir noktada belirlemek için bir karmaşıklık unsuru ekleyebilir. Düzenlemelere göre, bu oyunun böyle karmaşıklıkları var gibi görünmüyor.
Gözdağı verme gibi psikolojik faktörler de oyun kazanmada rol oynayabilir. Motorun rakibe bir yüz gösterip göstermediği bilinmemektedir, bu nedenle bu cevap bunu atlayacaktır.
Ortak Yaklaşım İpuçları
Hem girdileri hem de çıktıları eşlemek için ortak bir yaklaşım vardır, ancak Stack Exchange yanıtında açıklanacak çok fazla şey vardır. Bunlar sadece birkaç temel ilkedir.
Açık bir şekilde yapılabilecek tüm modellemeler yapılmalıdır. Örneğin, yapay bir ağ teorik olarak kartların nasıl sayılacağını (kartların her birinin olası konumlarını takip ederek) öğrenebilse de, basit bir sayım algoritması bunu yapabilir, bu yüzden bilinen algoritmayı kullanın ve bu sonuçları yapay ağa aşağıdaki gibi besleyin giriş.
En iyi çıktı ile ilişkili herhangi bir bilgiyi girdi olarak kullanın, ancak en iyi çıktı ile ilişkilendirilemeyen herhangi bir bilgiyi girdi olarak kullanmayın.
Hem eğitim sırasında hem de otomatik oyun oynarken giriş vektöründe fazlalığı azaltmak için verileri kodlayın. Soyutlama ve genelleme bunu başarmanın iki yaygın yoludur. Özellik çıkarma, soyutlamak veya genelleştirmek için araçlar olarak kullanılabilir. Bu hem girişlerde hem de çıkışlarda yapılabilir. Bir örnek olarak, bu oyunda, J> 10, A> K, K> Q, Q> J ve 10> 9 ile aynı şekilde olursa, kartları 2'den 14'e veya 0'dan 12'ye bir tamsayı olarak kodlarsa birini çıkarmak. Elbiseleri dört metin dizesi yerine 0 - 3 olarak kodlayın.
Görüntü tanıma çalışması, uzaktan görsel olarak ilişkilidir, kartları görsel bir görüntüden tanımanız gerekmedikçe, doğrudan kart oyunu oynamaktan çok farklıdır, bu durumda diğer oyuncuların hamleler için neyi seçtiğini görmek için LSTM gerekebilir. Kazanma stratejilerini öğrenmek, MLP veya RNN tasarımlarından veya bunların türev yapay ağ tasarımlarından birinden daha fazla fayda sağlayacaktır.
Yapay Bir Ağ Ne Yapacak ve Eğitim Örnekleri
Bu tür yapay ağların birincil rolü, örnek verilerden bir işlev öğrenmektir. Gerçek oyunların hamle dizileri varsa, bu projeniz için büyük bir değerdir. Çok sayıda kişi eğitim için çok yardımcı olacaktır.
Örnekleri nasıl düzenlediğiniz ve bunları etiketleyip etiketlemediğiniz ve nasıl etiketlediğiniz dikkate alınmaya değer, ancak kart oyunu kuralları olmadan güvenilir bir yön vermek zordur. Ortak olup olmadığı, puan bazlı olup olmadığı, bir zafere hamle sayısının ve bir düzine başka faktörün, bu kararları almak için gerekli senaryo parametrelerini sağlar.
Verebileceğim ana tavsiye, web üzerindeki çok genel makaleleri okumak değil, yukarıdaki konular hakkında anlayabileceğiniz bazı kitapları ve makaleleri okumaktır. Daha sonra indirebileceğiniz ve ne indireceğinizi bilecek kadar terminolojiyi anladıktan sonra indirebileceğiniz ve deneyebileceğiniz bir kod bulun.
Bu, kitap aramaların ve akademik aramaların sizi genel web aramalarından daha doğru yönde yönlendirme olasılığının yüksek olduğu anlamına gelir. Genel web alanında, AI ilkelerini çok sayıda hatayla açıklayan binlerce posta vardır. Kitap ve akademik makale yayıncıları yazarlarında gerekli özeni gösterirler.