Izgara tabanlı bir oyunu öğrenmek için sinir ağı için giriş / çıkış kodlaması


13

Bunun üzerine derin bir sinir ağını eğitmek amacıyla basit bir oyuncak oyunu yazıyorum. Oyun kuralları kabaca şu şekildedir:

  • Oyunda altıgen hücrelerden oluşan bir tahta var.
  • Her iki oyuncu da tahtada serbestçe konumlandırmayı seçebilecekleri aynı parça koleksiyonuna sahiptir.
  • Konumlarına ve konfigürasyonlarına bağlı olarak farklı parçaların yerleştirilmesi puan verir (veya rakibin puanlarını azaltır).
  • Kim daha fazla puan kazanırsa.

Ek kurallar (dönüşler, sayı ve parça türleri, vb ...) vardır, ancak bu soru bağlamında önemli değildir. Kendisine karşı oynayarak tekrar tekrar öğrenebilecek derin bir sinir ağı oluşturmak istiyorum. Sorularım girdi ve çıktının temsiliyle ilgili. Özellikle:

  • Parça deseni önemli olduğundan, en azından bazı evrişimsel katmanlara sahip olmayı düşünüyordum. Kart çeşitli boyutlarda olabilir ancak prensip olarak çok küçük olabilir (testlerimde 6x10, birkaç hücre tarafından genişletilecek). Mantıklı geliyor? Ne tür bir havuz kullanabilirim?
  • Her iki tarafı nasıl temsil edebilirim? In Bu yazıda halindeyken hakkında yazarlar iki giriş matrisleri, beyaz taşlardan diğeri siyah taşlar için birini kullanın. Bu durumda da işe yarayabilir mi? Ancak, A, B, C ve D gibi farklı parça türlerim olduğunu unutmayın. 2x4 giriş matrisi kullanmalı mıyım? Bana göre çok seyrek ve çok az verimli görünüyor. Korkarım evrişimsel katmanların çalışmasının çok seyrek olacağından korkuyorum.
  • Çıktının, tahta pozisyonlarını temsil eden matris üzerinde olasılıkların bir dağılımı ve ayrıca hangi parçanın çalınacağını gösteren ayrı bir olasılık dizisi olabileceğini düşündüm. Ancak, çok önemli olan dönüşü geçme yeteneğini de temsil etmem gerekiyor . Diğer olasılıklar arasındaki önemini seyreltmeden nasıl yapabilirim?
  • Ve en önemlisi , sadece kazanan hamleleri mi yoksa hamleleri de mi kaybederim? Kazanan hamleleri zorlamak kolaydır çünkü istenen olasılıkları 1'e ayarladım. Ancak kaybettiğinde ne yapabilirim? Olasılıkı 0'a ve diğerlerini aynı değere getirin mi? Ayrıca, kabaca olasılık olan çıktıların anlamlarına aykırı olsa da, son skor farkıyla hamleleri zorlamak mantıklı mıdır?

Ayrıca, oyun motorunu node.js'de Synaptic'i çerçeve olarak kullanmayı düşünerek geliştirdim, ancak kıvrımlı ağlarla çalışabileceğinden emin değilim (yerel algı alanlarıyla ilişkili ağırlıkları düzeltmenin bir yolu olduğundan şüpheliyim). Düğümle uyumlu diğer kütüphaneler hakkında tavsiyeleriniz var mı?


Makinenin bilinmeyen oyunu öğrenmesini ve sonra nasıl kazanacağınızı öğrenmesini istediğinizi varsayalım mı? (Kurallar, makine öğrenme yazılımını yazmadan önce programcı tarafından kullanılabilen bir oyunu nasıl kazanacağını öğrenmenin aksine)
FauChristian

Yanıtlar:


1
  • Parçaları temsil etmek için tek bir giriş matrisi kullanabilmeniz gerekir. Farklı parça türleri için bir tamsayı belirtmeniz yeterlidir. Beyaz taşlar pozitif tamsayı olabilir ve siyah taşlar negatif olabilir.

  • Kart konumu güveni için sigmoid ve parça tanımlayıcı için lineer aktivasyon kullanabilirsiniz. pass başka bir sigmoid çıktı olacaktır. Ne hakkında endişe zorunda sanmıyorum pas seyreltilmiş olan. Bu kadar değerli bir eylem olduğu için, skor çok fazla geçiş çıkışına bağlı olacak ve büyük bir eğime sahip olacak. Takviye öğrenme amaçları için yüksek frekanslı geçiş eylemini seçmeniz gerekiyorsa , rastgele seçim işlevinizde geçiş eylemine daha yüksek bir olasılık atfedin.

  • Nihai skor farkının, hamlelerin arzu edilirliği üzerinde büyük bir etkisi vardır. Büyük bir puan farkı, fonksiyon üzerinde büyük bir etkiye yol açmalıdır. Bu nedenle, kayıp fonksiyonunuza puan farkının büyüklüğünü dahil etmek isteyebilirsiniz.

Bu, Deep Q Learning'in yaptığı iş türüdür. Belki de buna bakmak istersiniz.


1

Bir resmi giriş olarak beslemediğiniz için dönüşümlü katmanlara ihtiyacınız yoktur (aşağıya bakın). Alternatif olarak, tahtanın bir resmini kullanmayı deneyebilirsiniz (farklı parçalar farklı şekillere sahip). Bu da işe yarayabilir. Sonra 2 döngü katmanı, adım 1, çekirdek boyutu yarım parça boyutu eşit giderdim. Tek bir max havuzu ile denemek istiyorsunuz.

Diğer cevabın aksine, giriş sayısı olarak 3d tensörü kullanmanızı öneririm, kanal sayısı farklı parçalara eşit. Diğer iki boyut eşittir tahtadaki hücre sayısına karşılık gelir. NN'nizdeki çeşitli dönüşümler, çoklu tamsayıları çok iyi ayırt edemeyecektir. Bu yüzden parça türlerinin sıcak bir kodlamasına sahip olmak daha iyidir.

Çıktı için yalnızca n + 1 bileşenli bir vektör kullanırdım: tüm olası hareketler için n ve geçiş için 1. Olasılığı değil, her hareket için beklenen ödülü kodlayacaktı.

Hareketleri uygulayarak ne demek istediğinizden emin değilim. Fakat bunu Q-learning gibi bir şeyle eğiteceğiniz zaman, belirli bir olasılıkla (rastgele bir olasılıkla) her seferinde tamamen rastgele bir hamle yapmak mantıklı olacaktır. Arama https://en.wikipedia.org/wiki/Reinforcement_learning


Tensörler aşırı yüklü.
FauChristian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.