Noughts ve haçlar (TicTacToe) oynatan bir Sinir Ağı

The source-page: http://www.tropicalcoder.com/NeuralNetwork.htm

Neural network

BPN Yapay Sinir Ağının Şeması

Sinir ağları kavramını oldukça etkileyici buluyorum, fakat gerçekten bir taneyle ne yapabilirim? Birkaç farklı tipte ağ geliştirdim ve onlarla oynadım, her biri 5 ile 7 arasındaki basit bir ızgaraya yazılan alfabedeki harfleri tanımak için bir Geri Yayılma Ağının öğretilmesi gibi basit klasik deneyler yaptım. Eğitimli ağ üzerinden bu mektupların çeşitlemelerini yaptım ve tabii ki çoğunu tanıdı. Bunların hepsi daha önce yapıldı. Ne farklı yapabilirdim?

Sonra bana geldi. Şimdi sahip olduğum bir Yenilmez Genetik Algoritma XS ve Os oynamak için, bir sinir ağına oyun öğretmek etmek için kullanabilir. Ben aşağı 17 kurullarına oyunun karmaşıklığı azaltmıştır -database- Ç oyuncu için ve her pozisyona 17 yanıtların ilgili tablo. Bir BPN sinir ağı için bu 17 panoları ve bunların yanıtlarını ezberlemek görev alfabe ezberlemek sonra daha basit olmalıdır. Sadece 18 birimlik bir giriş katmanı ve sadece 9 adet çıkış tabakası gerekir. Ben gizli katman için 15 ünite seçti. Belki de bu TicTacToe oynamanın en basit sinirsel ağ yetenekli dünyalar olurdu.

Şimdi tahtada dokuz kare var ve her biri X, O veya boş değer alabilir. Ağın bir tahtayı görmek için 9 çift girişe ihtiyacı olacaktır. Daha sonra her kare bir giriş çiftine eklenecekti. Çiftin A girişi bir X için, yani bir O olması durumunda B girişi ve boş bir kare olması durumunda hiçbiri aktif olmaz.

9 çıkış olacaktı. Sinir ağları, her panoya girişindeki ‘örneklerin’ veri tabanında sunulması yoluyla eğitilecek ve genetik algoritmanın söz konusu model için geliştirdiği 9 çıktıdan birinin doğru şekilde etkinleştirilmesi gerekli olacaktır.

Sonunda basitti. Ağ, ilk denemede ayarlanan verilere birleştirilmiş. BPN ağı tüm panoları yüksek derecede güvenerek öğrendi.

Oyunun ilk versiyonunda, sinirsel ağlara göndermeden önce eğitim setindeki konfigürasyona uyması için her tahtayı döndürdüm ve/veya yansıttım. Tabii ki o zaman mükemmel bir oyun oynadı. Bunun gerçekten aptalca olduğunu hemen fark ettim. Sinir ağını basit bir arama tablosunun yapacağı bir veri tabanı olarak kullanıyordum. Bu, sinir ağının amacı ya da gücünde, onu eğitmekte başarılı olduğum gerçeğinin ötesinde hiçbir şey göstermedi.

BPN sinir ağını kullanma fikri, örüntü tanıma özelliğini kullanmaktır. Biri onu tanımayı öğrenmesini istediği bazı kalıp örnekleri ile sunmakta ve sinir ağı, bilinmeyen bir kalıbı sınıflandırmak için bu örnek kümeden tahmin etmektedir.

Bunu nasıl değerli bir egzersiz yapabilirim? Sinir ağının, kurulun bir dereceye kadar döndürülmüş olmasına rağmen üzerinde çalıştığı bir oyun durumunun modelini tanıyabilecek olup olmadığını görmenin ilginç olacağına karar verdim.

Oyun tahtası üzerinde Xs ve Os bir model düşünün. Bu tahtayı 90, 180 ve 270 derece döndürebilirsiniz. Hala aynı oyun durumu olacak, ama simetri derecesine bağlı olarak, desen her dönüşte farklı görünecek. Benzer şekilde, o tahtayı aynaya yansıtabilirsiniz (Z düzleminde 180 derece yanal dönüş) ve desen farklı görünecektir (eğer iki taraflı simetriye sahip değilse). Ayrıca, tahtayı yansıttıktan sonra, yine desendeki simetri eksikliğine bağlı olarak, X, Y düzleminde üç derece 90 derece daha dönebiliyorsunuz. Toplamda, aynı tahtanın mümkün olan en fazla sekiz farklı görüşü vardır.

Sinir ağını sadece iki bakış açısıyla, tahtanın veri tabanında göründüğü haliyle ve yansıyan bakış açısıyla eğittim. Bu iki görüş, olası tüm görüşlerin sadece dörtte birini temsil ediyordu. Sinir ağı, daha önce hiç görmediği bir konuma döndürülmüş bir tahtayı doğru bir şekilde sınıflandırabilir mi?

Cevap evetdi, ancak çok karmaşık bir kavramın bu kadar sınırlı örnekleri ile açıkça açıkça bir mücadele oldu. Tanınma oranı sadece% 30’du, ancak bu tek başına hesap verebilecek şansın iki katıydı. Bu, dengeyi sinir ağını kazanma lehine çevirecek kadar da iyiydi. İki oyuncunun rastgele hareketler yapmasıyla, ilk giren oyuncu diğerine göre büyük bir avantaja sahip ve bire yaklaşık iki maç kazanır. Sinir ağım O’yu oynadı, oyuncu ikinci sırayı aldı ve yine de X’i zamanın yarısından daha fazla yendi.

Şimdi, kurulun eğitim setiyle aynı konfigürasyonda olduğu zaman, sinir ağının asla hata yapmadığını fark edeceksiniz. Bunun tek başına ne tür bir avantaj sağladığını görmek için bir deney yapmak, varsayalım ki, durum böyle olunca, sinir ağından gelen yanıtı kullanıyoruz ve tahta bir pozisyondayken sinir ağı hiç görmemiş, sadece rastgele hareket et. Testler rastgele bir oyuncuya karşı bunun sinir ağına avantaj sağlayacak kadar iyi olmadığını ve rakibinin (her zaman ilk önce olan) tüm oyunların yaklaşık% 53’ünü kazanacağını gösterdi. Eğitimli sinir ağı, hiç görmediği modellerin yalnızca% 30’unu tanıdığı için, X’in ilk hareketindeki büyük avantajını ortadan kaldırarak, zamanın yaklaşık% 52’sini kazanır.

Bir sonraki sürüm için orjinal pano listesine başka bir bakış açısı kazandıracak örnek eğitim setini arttırdım. Şimdi orijinal 17 pano ve Z düzleminde 180 derecelik yanal dönmenin yanı sıra, Z düzleminde 180 dikey dönme ekledim. Başka bir deyişle, orjinal tahta listesine, onların ayna görüntülerine ve çevrelerine sahip oldum. Bunun ötesinde, 9 olası ilk X hareketinin hepsini de ekledim (O’nun ilk hamleye tepkisi büyük önem taşıyor.) Yine, bu genişletilmiş örnek setler üzerinde birleşik ağ.

Aynı rasgele oyuncuya sahip 100.000 oyun turnuvasında, bu kez O her iki tarafın da kazandığı tüm oyunların% 87’sini kazandı ve X’in galibiyetlerinin sadece% 13’ünü aldı – her zaman ilk giren rastgele oyuncu.

Sinir ağına gönderilen tüm hareketlerin% 41’i, sinir ağının üzerinde çalıştığı pozisyonların aynısıydı ve dolayısıyla doğrudan bir arama yaptı. Ancak, sinir ağına gönderilen tüm hareketlerin% 58’i daha önce hiç görmediği rotasyonlardı. Bu panolardan, sinir ağı şimdi zamanın% 81’ini harcayan doğru hareketle yanıt verdi. Sınıflandırmayı başaramadığı% 19’unun yarısından fazlası yasadışı hamlelerdi ve bunların yerine rasgele hamleler yapılması gerekiyordu. Ayrıca, oyun sırasında oluşturulan panoların çok az bir kısmı – yaklaşık% 1 – sinir ağının hiç bir şekilde eğitim almadığı ve bu durumlarda da rastgele bir cevap verilen panolardır. Toplamda, tüm hareketlerin yaklaşık% 7’si aslında rastgele hareketlerdir.

Daha sonra ağ kodunu bir DLL’e koydum, eğitimden kazanılan ağırlıkları bir dosyaya koydum, böylece ağ yeniden oluşturulabildi ve sinir ağına karşı nasıl oynandığını görebilmeniz için küçük bir arayüz oluşturuldu. O çok muhalif bir rakip! Genetik algoritmaya karşı oynamak için bir seçenek de var, ama çabucak keşfedeceksiniz ki onu yenmek için bile boşuna. Rasgele sayı üretecine karşı oynama seçeneğini de ekledim. Daha ilginç hale getirmek için, oyuncu tarafından basit bir kazanç elde edilmeyeceğinden ve basit blok atma şansının bilgisayar tarafından asla kaçırılmadığından emin olmak için bir algoritma eklendi. Bu “rakip” genetik algoritmaları büyütmek ve sinir ağlarını test etmek için kullanılanla aynıdır.

Uygulamayı indirebilirsiniz -burayı- [için. 1,2-43 Kb]. Sadece bir klasöre dosyaları unzip ve oynamak için exe tıklayın. Yüklemek veya Windows kayıt yığılmayı şey yok. David M. Skapura, ben sinir ağları okumaya mükemmel kitabın yazarı tarafından BPN ağının standart uygulanmasını kullandı. Bunun için kaynak kodu kullanılabilir -burayı- [6 Kb].