Bilgisayarlar satranç oynar mı?

Bu soru nereden aklıma geldi ki yine? Heralde okuduğum psikoloji kitabındaki akıllı Hans adlı atın gerçekte aritmetik işlem yapmadan insanları aritmetik işlem yaptığına inandırması hikayesi yüzünden oldu. Bu gerçek hikayede at sorulan işlemin sonucunu soruyu soran kişinin farkında olmadan verdiği vücut dili işaretlerinden buluyordu. Bu yöntemi kullandığı bilinmediği sürece gerçekten işlem yaptığı düşünülüyordu ve bu yüzden de akıllı lakabı takılmıştı. İşin sırrı çözüldükten sonra ise o kadar da akıllı değilmiş denmiştir heralde ama atın kullandığı yöntem bence çok daha ileri bir zekanın göstergesi olabilir.

Uzun bir süre, bilgisayar programlarının emekleme döneminde bilgisayarların satranç oynamadığı iddia ediliyordu. Programların yaptığı tek şey basit algoritmalar yardımıyla olası pozisyonları değerlendirmek ve en yüksek değerdeki pozisyona götüren hamleyi seçmekti. Bu değerlendirme hesabı da kolaydı. Figürlerin belli değerleri olurdu, kontrol edilen kareler, hareketlilik filan gibi faktörler de hesaba katılırdı. İnsanlar bu kadar fazla hesap yapmadan, daha stratejik oynadıklarından mı yoksa oynarken hissettikleri duygulardan ötürü mü bilmem ama programların satranç oynamadığını düşünürdü. Onların yaptığı matematiksel, algoritmik bir hareketti ve satranç bu şekilde açıklanamaz ya da açıklanmamalı gibi düşünülüyordu. Hala yaptığı hamlenin nedenini insanların anlayabileceği şekilde açıklayabilen bir program yoktur heralde.

Zamanla programlar gelişti. İnsanların kullandığı stratejilerin bazıları yavaş yavaş eklendi. Yaratıcılık dediğimiz sezgiye dayalı şeyler eklenemedi tabii ki. Sanırım bunun ne olduğunu bilinmediğinden nasıl programlanacağı da çözülemedi. Bunun yerine açılış ansiklopedisi ve oyun sonu veri tabanları eklendi ama. Böylece programlar oyun ortası kısmı hariç her yeri neredeyse hatasız oynayabilmeye başladı. Bir süre sonra bilgisayarların yeterince hızlanmasıyla insanın bu hesap gücü karşısında pek bir şansı kalmamıştı. Artık hedef yenilmemek olmuştu ki o da Kasparov’un Deep Blue’ya karşı kaybetmesiyle geçmişte kalmış oldu.

Programlarda yapılan son devrim de yapay zeka oldu. Artık bilgisayarlar yapay zekanın ihtiyacı olan performansı sunabilecek kadar hızlılar. Yapay zeka ile artık programlarla insanlar arasındaki oyun gücü farkı çok yükseldi. Hatta en son AlphaZero adlı program sadece kurallarla başlayıp kendi kendine oynayarak sadece bir gün içinde insanlardan güçlü, üç gün içinde de dünya şampiyonu programları yenebilecek seviyeye gelmeyi başardı. Bu bence ilginç bir adım oldu. Artık bilgisayar insanların programladığı stratejileri kullanmadan, kendi bulduğu stratejilerle oynuyordu ve anlaşılan bizim bulduklarımızdan çok daha güçlü stratejileri bulabiliyor.

Artık yapay zekalı programların bu hamleleri nasıl hesapladığını genelde bilmiyoruz. Aslında teknik olarak biliyoruz da heralde analizi anlayabileceğimiz hale getirmek pek mümkün değil. Oyunu sadece kurallardan öğrenebiliyorlar ve insanların programlara kendilerinden bir şey katmasına da gerek yok. Bu durumda bence en geç şimdi programların satranç oynadıklarını rahatlıkla söyleyebiliriz. Belki oynarken bir şey hissetmiyorlar, ya da bir hamleyi neden yaptıklarını açıklayamıyorlar ama heralde bunları bir tür iletişim eksikliği olarak yorumlayabiliriz.

Peki başta sorduğum soruyu daha da genişletebilir miyiz? Örneğin en basitinden başlayayım. İnsanlar bilgisayarlara göre satranç oynuyor mu? Bu soru bilgisayarların umrunda değildir diyip geçebiliriz ama. Peki ya bilimler? Çok ileri bir uzaylı uygarlığı karşısında yaptığımız şeyler bilgisayarların kırk yıl önceki satranç oynama seviyesi gibi ilkel olamaz mı? O zaman bu uygarlık bizim için aslında fizik yapmıyorlar diyebilir mi? Deseler bile biz fizik yapmadığımızı düşünmeli miyiz?

Çekiç ve çivi

“Eğer sahip olduğun tek aletin çekiç ise her problem çivi gibi görünür.” Twain? Maslow? Kaplan? Kim demişse demiş. Doğru da demiş ama. Yazılım dünyasında hemen hemen her gün bu sözün gerçekleşmesine şahit oluyorum.

Ürettiğimiz makineyi ayarlamak için binlerce parametremiz var. Evet, tahmin ettiğiniz gibi bizim çekicimiz de parametreler. Geçen gün iki eleman yüksek gerilim kaynağı ile haberleşme protokolü üzerine tartışıyordu. Yeni protokol eski protokole de benziyor biraz. En azından ikisi de binary protokol. Yani insan tarafından okunmasına gerek olmayan, sadece makine için tasarlanmış bir protokol. Tabii içerikte de birkaç fark var. Neyse, elemanların biri “bu yeni bir alet, üretici farklı, kullanılan protokol de farklı. O zaman yeni bir protokol tanımlayıp diğerinden ayrı programlaman lazım” derken diğeri de “ama o zaman bir sürü kod yazmam lazım. Protokoller arasındaki farklar da çok değil, üç parametre ile bu işi halledebilirim” tezini savunuyordu. Bunun üzerine ilk eleman “öyle yaparsan ilk protokolü de değiştirmiş olursun, bu durumda eski güç kaynaklarını yine test etmemiz gerekir” şeklinde karşı saldırıya geçti. İkinci eleman da “sadece üç yerde değişiklik olacak. Onların testi de kolayca yapılabilir” diye karşılık verdi. Başka işlerim olduğu için bu tartışmaya pek dalmadım ama kendimi birinci elemanın düşüncesine daha yakın buluyorum. Schrödinger’in programları gibi programları sevmiyorum. Bir bakışta programın ne yaptığını anlamak isterim.

Bu hafta yine buna benzer bir tartışma oldu. Bu sefer işin ucu bana da dokunuyordu. Benim yazdığım modül de yapılacak değişikliklerden etkilenecekti. Kontrol birimi her gün belli bir saatte bana belli bir mesaj gönderece ve ben de bu mesaja göre belli bir işlem yapacağım. Bu işlemin sonucunu da kontrol birimine geri göndereceğim. Yani çok basit ve temel bir işlem. Daha önce de defalarca yapmışız. Tabii ki sorun şu: Harika bir proje yönetimi ve beklenmeyen aksilikler yüzünden bu işi yapmak için bir gün zamanımız kalmış. Problem, aynı anda üç değişik modülde değişiklik yapmak yerine bunu tek modülde değişiklik yaparak nasıl yaparız şekline indirgenmiş. Kontrol biriminin bana göndermesi gereken mesaja benzer bir mesajı zaten daha önce programlamış olduğumuz için bütün işi kontrol birimine yıktık. Bir süre sonra kontrol birimi programcıları bu mesajın aynı işi yapamayacağını buldu. Zaman da azalmıştı. Bunun üzerine yeni bir mesaj tanımlamak yerine (o zaman üç modülde değişiklik gerekecek) bir parametre kullanmayı (sadece bir modül etkilenecek) teklif ettiler. Görünüşe göre istenen çözüm de böyle olmalıydı ama parametrenin sorunu şuydu: Bu parametrenin anlamı ve yaptığı iş normal bir kullanıcı ya da servis elemanı için hiç de kolay anlaşılır bir şey değildi. Dolayısıyla ileride bir sürü gereksiz telefon görüşmesi gerekecekti. Sonuçta parametrenin yaptığı iş şu olacak: İlk modülün gönderdiği mesajın aslında başka bir mesaj olduğunu söyleyecek ve kontrol birimi de bu durumda bu mesajı eski mesajımıza uygun hale getirip (içindeki bir miktar bilgiyi atıp) gönderecek. İşin komik tarafı projedeki asıl plan işin sadece ilk modülde yapılmasıyken birden iş ikinci modüle, kontrol birimine, kaymış oldu. Hiç kimsenin hoşuna gitmedi ama başka türlü pazartesiye yetişmesi de mümkün değildi heralde. Bu arada, ben cuma günü işten çıktığımda kontrol birimi bu işi hala bitirememişti.

Parametrelerle bir çok şey yapılabilir, bir sürü problem çözülebilir ama burada tasarruf ettiğimiz zaman bize dokümantasyon, hata arama, elemanların eğitimi, kullanıcıların hayatını zorlaştırma şeklinde geri dönebilir. Sonuçta parametreler de bir tür programlamadır ve bu tür çekiçler kullanarak işi böylece bizden sonrakilere, yani hem kullanıcılara hem de bu sorunları düzeltecek programcılara bırakmış oluyoruz.

Üçgenin açıortayları (Geogebra)

Bu animasyonda geogebrada bir ABC üçgeni tanımladım ve her köşedeki iç açıortayları çizdirdim. Bu açıortaylar bir D noktasında kesiştiler. Üçgenin köşelerini hareket ettirip yeni üçgenler oluşturduğumda da açılar ve açıortayla değişse de her seferinde üçü de aynı noktada kesişmeye devam etti. İki doğrunun bir noktada kesişmesi çok normal ama belli bir özellikteki üç doğrunun her zaman aynı noktada kesişmesi bence ilginç bir durum. Bu noktanın başka bir özelliği var mı acaba?

Animasyon