2018'de Google, AlphaGo Sinir Ağı ile GO Şampiyonunu yendi ve çok fazla gürültü koptu. Yeni mükemmel açık kaynak Makine Öğrenme kütüphaneleri erişilebilir hale geldi ve eğitim sürecini hızlandırmak için ev GPU'larını kullanıyordu.
Bunu Abak ile denemeye karar verdim, ancak ilk başladığımda sinir ağının ne olduğunu zar zor biliyordum. Üniversitede (1996) küçük bir deneyimim olmuştu, ancak veri, GPU ve hedef eksikliğinde ele almak zordu. Dahası: Matematik açısından, Sinir Ağları ağır bir konu ve çok fazla ilhama ihtiyacınız var.
Yoğun ve saplantılı araştırmalardan sonra, bir model oluşturmayı ve öğrenmesini sağlamayı başardım.
Devlerin omuzlarında durarak, ilk niyetim 90'larda TD-Gammon'ı geliştiren Dr. Gerald Tesauro'dan öğrenmekti. Doğru hatırlıyorsam, bu bir pekiştirmeli öğrenme algoritmasının ilk pratik uygulamasıydı.
Ancak Abak iki boyutlu bir oyun olduğu için önerilen modeli kullanamadım ve kendiminkini geliştirmek zorunda kaldım. Bazı algoritmaların çıktısını modelin parçası olarak, uzman bilgisi olarak kullanmaya karar verdim, böylece Sinir Ağı öğrenme sürecini daha kolay yaşasın. Bunu yaparken hile yapıyormuş gibi hissettim.
İşte her iki model, Backgammon ve Abak arasında bir karşılaştırma.
Backgammon'un yaygın olarak kullanılan TD modeli sütunları tanımlar. Tahtanın her sütunu için, onu tanımlamak üzere 4 giriş kullanılır.
- Pul yok: [0,0,0,0]
- Bir pul: [1,0,0,0]
- İki pul: [1,1,0,0],
- Üç pul: [1,1,1,0]
- Üçten fazla pul: [1,1,1,1].
Her takıma atıfta bulunmak üzere bu setlerden 28'ine sahiptir (tahtanın her sütunu için bir tane), toplamda 28*2*4 giriş, artı çubuktaki pulları saymak için birkaç tane daha. Ne yazık ki bunu hafızadan yazıyorum, kesin olmayabilir.
Abak'ın modeli çok farklıdır. Pulları tanımlar ve her birinin bir dizi özelliği vardır. Daha yeni sürümlerde, tahtanın basitleştirilmiş bir tanımını tamamlayıcı olarak ekledim, sonuçlar inanılmaz değildi, ancak özellikler hâlâ orada.
Oyun tanımlama modelinin dört bölümü vardır [477 giriş]:
- Pul Tanımı (14x30): Tanım, pul için istatistikleri, mesafeyi, yüksekliği vb. içerir. Modeldeki konumundan miras alınan sınıfı içermez.
- Takım Durumu (4x2): Bazı pul veya durum özelliklerinin sayımı.
- Güç haritası (24x2).
- Oyun durumu: sırada kim var! (1).
Modelin eksiksiz bir tanımını aşağıda görebilirsiniz.
Sürümler:
1.- Python Cumpy (TD-V1).
Bu AI'ın ilk sürümü, GPU üzerinde çalışan Numpy benzeri bir kütüphane olan Cumpy kullanılarak saf Python'da eğitildi. Sıfırdan öğrenmek istiyordum, bu yüzden bir süre Tensorflow ile oynamış olsam da, çıplak gitmeye karar verdim (şey, muhteşem Python ve Cumpy ikilisiyle donanmış olarak).
Özellikler:
- Takım 0'ın oyunu kazanma şansını tahmin eden bir ağ.
- Puanlardan habersiz.
- "Sırada kim var" bayrağına sahip değildi.
- Güç haritasına sahip değildi
- Sigmoid aktivatörlü bir gizli katman.
- Uzman bilgisiyle yazılmış önceki AI'ımı (GOAFI) yenmesi 45.000 oyun sürdü.
- 4.500.000 oyun öğrendi. Ve GOFAI'ye karşı vakaların %75'ini kazandı.
- 2 yıl boyunca üretimde kaldı.
2.- Tensorflow (TD-V2).
Sürüm 1 ile yaşadığım sıkıntı, kazanma şanslarını iyi hesaplayamıyordu çünkü "sırada kim var" bayrağı olmadan eğitilmişti. Bir şekilde, Sinir Ağı sonuçları iyi bir hamle seçmek için oldukça iyiydi, ancak matematik açısından tutarlı değildi. Sürüm 2 bu sorunu çözdü ve oyunun 1, 2 veya 3 puanla bitme olasılığını hesaplamak için yeni bir ağ ekledi.
Bu sefer yeni modeli eğitmek için Tensorflow'u seçtim çünkü bir çerçeve öğrenmek istiyordum ve başlamak için mükemmel bir örnek buldum.
Özellikler:
- Takım 0'ın oyunu kazanma şansını hesaplayan bir ağ.
- Oyunun 1, 2 veya 3 puanla bitme olasılığını hesaplayan bir ağ.
- Yeni güç haritasını içerir.
- Farklı aktivatörlere sahip iki gizli katman: Gizli katmanlar için Leaky RELU ve çıkış katmanı için sigmoid.
- TD-V1'e karşı %50 kazanmak için 12.000 oyun aldı.
- 350.000 oyun öğrendi ve TD-V1'e karşı %80 kazanma oranına ulaştı.
3.- Sürüm 3: Beklemede.
En iyi hamleyi seçme karar alma sürecinin son adımında, en iyi Eşitliği arayan basit bir algoritma vardır [%W*%p1+%W*%p2+%W*%p3].
Maçın amacına, her oyuncunun kazanmak için ihtiyaç duyduğu puan sayısına ve küp değerine bağlı olarak, ağların çıktısını farklı şekilde ağırlıklandırır.
Bunu yöneten bir Sinir Ağı yapmak istiyorum. Bu V3 olacak. Şu anda geliştirme aşamasında değil.
Abak'ın Sinir Ağı Modeli:
Pul Tanımı (14 giriş x 30 pul):
- Eve mesafe x/25
- Üstteki pul sayısı x/4
- Alttaki pul sayısı x/4
- Çubukta [0,1]
- Evde [0,1]
- Güvende (mesafe = 0'da). [0,1]
- Başka bir pulla blok yapıyor [0,1]
- Druid tarafından tuzağa düşürülebilir [0,1]
- Druid tarafından tuzağa düşürülmüş [0,1]
- Tuzağa düşürüyor (bu giriş yalnızca her druid için) [0,1]
- Yakın bölgede (6 pozisyon ileride) vurulma riski [0..1]
- Uzak bölgede (12 pozisyon ileride) vurulma riski [0..1]
- Druid tarafından tuzağa düşürülme riski [0..1]
- Hareket şansları [0..1]
Her takım için oyunla ilgili girişler (4x2):
- Çubuktaki pul sayısı. x/15
- Güvenli pul sayısı. x/15
- Tüm pullar evde. [0,1]
- Güvenli pul 0 sayısı. [0,1]
Güç Haritası: (24*2):
Son olarak, Doktor Tessauros'un Backgammon için önerdiğine benzer, ancak basitleştirilmiş bir güç haritası. Her pozisyon ve her takım için, o bloğun ne kadar güçlü olduğunu temsil eden 0 ile 1 arasında bir sayı vardır:
- 0.0eğer boşsa.
- 0.1eğer bir pul varsa.
- 0.5eğer o pul bir muhafızsa.
- 1.0eğer iki veya daha fazla pul varsa.