haftanın makalesi etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
haftanın makalesi etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

21 Ocak 2018 Pazar

Haftanın Makalesi (III): "Simulating Physics with Computers"

"...and I'm not happy with all the analyses that go with just the classical theory, becouse nature isn't classical, dammit, and if you want to make a simulation of nature, you'd better make it quantum mechanical and by golly it is  a wonderful problem, because it doesn't look so easy." 
Richard P. Feynman

1980'lerin başında bilgisayarda hesaplama ve simulasyona dair fiziğin üstadı Feynman'ın Caltech'de yaptığı bir konuşmaya dayalı klasik bir makale bu haftanın seçimi: "Simulating Physics with Computers". Doğanın en temelde klasik yasaları olarak bildiğimiz klasik fizikten birçok yönden devrimsel olarak ayrılan kuantum mekaniği (ve en genel anlamda kuantum alan teorileri) tarafından açıklanıyor olması, birçok yönden klasik özelliklere sahip görünen bilgisayarlar tarafından benzetiminin (simulasyon) gerçekten yapılıp yapılamayacağı sorununu doğuruyor. Eğer [kuantum mekaniğine dayalı] doğayı tam olarak modelleyip, elimizdeki bilgisayarlarla simule etmek istiyorsak en temelde olasılıkların yattığı farklı tipte bir 'evrensel hesaplayıcıya' ihtiyacımız olduğunu dile getiriyor Feynman makalede.



Makalenin başında, klasik fizikteki uzay ve zamanın, yerel (local), nedensel (causal) ve tersinebilir (reversible) özellikleri  dolayısıyla aşina olduğumuz bilgisayarlarda simulasyona elverişli olduğu tartışmasını yürütüyor. Sonrasında bilgisayarlarda olasılığının simulasyonunun nasıl yapılacağına değinip, birden fazla parçacıklı kuantum sistemlerindeki olasılık sayısının çok büyümesiyle ilişkili olarak bu tip bir hesabın mümkün olmayacağını dile getiriyor. (Aklıma, bu duruma Monte Carlo yaklaşımları ile nasıl girişilir acaba? sorusu geliyor...)

Makalenin temel noktası dördüncü bölümde ele aldığı konu, büyük ölçekli kuantum mekanik sistemleri simule etmek için işe yarayacak, tıpkı simule etmeye çalıştığı fenomenler gibi kendisinin de kuantum mekaniğinin prensiplerine dayanan bir evresel hesaplayıcı yani bir 'kuantum bilgisayar'. Bu bölümde kuantum alan teorisinden ödünç aldığı fikirlerle parçacıkların spin özelliklerini kullanarak bu tip sistemler oluşturulabileceğini ifade ediyor ama aralarda birçok belirsizlikler ve boşluklar bırakıyor. Makalenin ilerleyen kısmında klasik bir bilgisayarla kuantum sistemlerinin simule edilemeyeceğinin teknik analizini yapıp ortaya çıkacak problemlerden bahsediyor.

Makalenin sonunda bilgisayarlarla doğanın kendisini birebir simule ederek fiziğe dair yeni birçok şey keşfedeceğimizi ve bu amacın peşinden gidilmeyi fazlasıyla hak ettiğini dile getiriyor Feynman. Günümüzdeki kuantum bilgisayarlar için atılan adımlar ve son zamanlardaki gelişmeler bu fikrin birçok insan tarafından paylaşıldığını gösteriyor. Fizikte her zaman yeni ve farklı yaklaşımları geliştirip çocuk merakı ve kurcalama hissiyle doğaya yaklaştığı bilinen Feynman'ın o dönemde hızla gelişen bilgisayarlarla ilgilenmemesi şaşırtıcı olurdu. Kendisinin ayrıca hesaplamaya dair güzel de bir ders serisi var 'Feynman Lectures on Computation' adında. Kuantum bilgisayarların gündemde olduğu fakat bilinenler çok kısıtlı olması sebebiyle alandaki belirsizliklerin bir o kadar büyük olduğu bir dönemde, bu tip bir bilgisayarın fizik için ne anlam ifadeceğini ele alan, temel kuantum mekaniği bilgisiyle okunabilecek güzel bir makale.

Makaleyi okumak için: "Simulating Physics with Computers"(PDF)
Makale üzerine açıklamalara ve detaylı incelemeye yer veren şu makaleyi de tavsiye ederim: 'Richard Feynman: Simulating Physics with Computers' (M.Demmer ve ark.)

14 Ocak 2018 Pazar

Haftanın Makalesi (II): "Statistical Modeling: The Two Cultures"

Bu hafta istatistik ve veri analizi üzerinden iki bakış açısını inceleyen bir makale 'Haftanın Makalesi'nin konusu. Makale için, yazarının bir süre akademide istatistikle uğraştıktan sonra ara verip on yılın üzerinde dışarıda 'gerçek dünya problemleri' üzerine kafa yorup danışmanlık yaptığı, ardından bölüme geri döndüğünde karşılaştığı duruma bir tepki niteliği yazdığı bir yazı demek daha doğru olur belki de. 2001 gibi yakın bir zamanda yayınlandığında belki dönemin istatistikçileri ve belki alternatif olarak bilgisayar bilimcilerini ilgilendiren bir konuya değiniyordu ama günümüzdeki gelişmeleri göz önüne aldığımızda artık hemen hemen tüm bilim alanlarının dert ettiği bir konuya parmak basıyor: model'den yola çıkarak mı yoksa sadece veriden yola çıkarak mı analiz yapacağız?

Makale, başlığında görüldüğü üzere iki tip istatistiksel modelleme kültürü tartışması üzerinden ilerliyor. Birincisi 'Veri Modelleme' (Data Modelling) kültürü. Bu kültürdeki temel yöntem, elimizdeki verinin belirli parametrelere, belirleyici değişkenlere ve rastgele hatayı içeren bir modelden elde edilmiş bağımsız örnekler olduğunu varsayarak ve bu modelin belirli bir model ailesinden olduğu bilgisiyle başlayıp bir takım sonuçlar elde etmek; bu sonuçlardan da bu veriyi oluşturan doğadaki sürecin mekanizmasına dair fikir yürütme. Örneğin veriyi üreten sürecin doğrusal olduğunu varsayan doğrusal ya da lojistik regresyon gibi... İkincisi 'Algoritmik Modelleme' (Algorithmic Modelling) kültürü. Bunda da doğada bir takım girdilere karşı elde edilen çıktıların üretilme mekanizmalarının oldukça karmaşık ve çoğu zaman bilinemeyecek kara kutular olduğunu varsayıp, probleme algoritma perspektifinden yaklaşmak temel yöntem. Çıktıları en iyi üreten ve çalışma mekanizmaları çoğu zaman net bir şekilde yorumlanamayan tipte modelleme şeklinde düşünülebilir. Örneğin günümüzde sıkça duyduğumuz 'yapay sinir ağları' ya da 'karar ağaçları' tipi yapay öğrenme (machine learning) yöntemleri gibi...

Yazar ilk tipten modellemenin çoğu zaman doğadaki mekanizmalarla alakasız ve sonuçları kuşkulu çıkarımlara neden olduğunu ve bu yaklaşımının görüntü işleme, ses tanıma, doğrusal olmayan süreçlerin verileri gibi alanlar için oldukça eksik kaldığını dile getiriyor. Bunun için danışmanlık yaptığı işlerde uğraştığı üç örnek problem üzerinden 'algoritmik modelleme' ile nasıl yaklaşımlar getirdiğini ve bu yaklaşımların standart veri modelleme yaklaşımlarına göre açık ara farklı olduğunu gösteriyor.

Yazarın 'algoritmik modelleme' dediği kültürün tekniklerini çeşitli 'yapay öğrenme' yönemleri oluşturuyor. Günümüzde bu yöntemler elimizin altındaki bilgisayarların işlem gücünün müthiş artışı, özellikle yapay sinir ağlarını eğitmek için oldukça efektif yöntemlerin geliştirilmiş olması ve birçok kanalda 'büyük veri' akışı sebebiyle neredeyse karşı konulamaz bir güce erişmiş durumdalar. Fizik gibi 'veri modelleme' kültürü üzerine inşa edilmiş ve üretilen modelin Ockham'ın Usturası üstrubu gereği yorumlanabilme ölçütü üzerinden değerlendirildiği bir alanda dahi yavaş yavaş kendisine uygulama alanları bulabiliyor. (Durumun geldiği noktayı daha iyi görmek adına geçen sene Science'ın yayınladığı kapak konusu aydınlatıcı olabilir. ) Kısacası yazarın yaklaşın 15 yıl önce vardığı sonuçların en azından şu anda fazlasıyla doğrulandığı ve mevcut "kültür trendini" belirlediği açıkça görülüyor. Elbette bu tip yöntemler oldukça yeniler ve bir  takım darboğazlara da sahipler; 'algoritmik kültürün' hızlı yükselişiyle birlikte zaman hangi kültürün baskın çıkacağını gösterecek.

Makaleyi okumak için: Statistical Modelling: Two Cultures (Statist. Sci. Volume 16, Issue 3 (2001), 199-231.)

6 Ocak 2018 Cumartesi

Haftanın Makalesi (I): "Best Practices for Scientific Computing"

Uzun bir süredir tez çalışmalarımda, kendi araştırmalarımda, aldığım derslerin projelerinde ve verdiğim derslerin uygulamalarında bilgisayar kodu yazıyorum. Çoğu zaman fiziksel/bilimsel bir problemi çözmek üzerine olan bu kodların yapısı genelde "günü kurtaran", bir şekilde çalışıp bir sonuç üreten tipte oluyor. Bu haliyle çoğu zaman içinde kendini tekrar eden kod kümeleri barındıran, nerede-ne yaptığı belli olmayan, iyi belgelenmemiş ve başka birisi aldığında bırakın tekrar çalıştırıp aynı sonuçları üretebilmeyi kodu okuyup ne yaptığını dahi anlaşılmayacak kadar karmaşık türde kodlar yazdığını fark ediyor insan. Küçük çaplı çalışmalarda "iş gören" kodlar, problem biraz karmaşıklığında tam bir baş belasına dönüşebiliyor ve o anda artık biraz "iyi alışkanlıklar" (best practices) takip edip hayatı kolaylaştıran yöntem ve araçlara yönelmek durumunda kalınıyor. Bu hafta okuyup kısaca özetleyeceğim  G. Wilson ve arkadaşları tarafından 2014'de yayınlanan "Best Practices for Scientific Computing" makalesinin temel fikri de tam olarak bu.



Yazarlar öncelikle bilimsel amaçla yazılan programların bir bilim insanı için başka bir tür "deney aracı" olduğunu ve tıpkı fiziksel bir deney aracı gibi yapılandırılıp, kontrol edilerek dikkatli bir şekilde kullanılması gerektiğini belirterek başlıyorlar. Sonrasında da  bilimsel kod yazımında dikkat edilmesi önerilen sekiz maddeyi sıralıyorlar:

1- Yazdığınız kodu bilgisayarlar için değil, insanlar için yazın.

  • Yazılan kodu başkalarının veya özellikle gelecek bir zamanda kendisinin anlayabilmesi için insanların anlık hafızalarının kısıtlılığı, örüntü tanıma becerilerinin hassas bir şekilde ayarlanmış olduğu ve dikkat sürelerinin kısa oluşunu göz önüne alarak yazmak gerektiği vurgulanıyor. Bunun için verilen temel öneri kodu tıpkı bir makaledeki bölümler gibi, belirli amaçlar için oluşturulmuş fonksiyonlara bölmek.
  • Programda kullanılan isim ve etiketleri ayırdedilebilir, tutarlı ve anlamlı bir şekilde vermeli.
  • Kodun her bölümünde stil ve formatı koruyarak ilerlemeli.

2- Bırakın bilgisayarlar işi yapsın.

  • Gerçekleştirilmesi hedeflenen prosedürü tekrar tekrar elle yapmak yerine bir script ile çalıştırılacak komutları otomatize etmeyi ve "build tool"lar kullanmayı öneriyorlar.

3- Değişiklikleri ufak ufak yapın.

  • Küçük adımlarla, sık sık geri bildirim alarak düzenlemeler yapıp ilerlemeyi öneriyorlar. Her iterasyonda çalışan bir program yazmak amaç ve her iterasyondaki değişiklikleri kaydedip gerektiğinde geriye almak için de GitHub gibi versiyon kontrol sistemleri kullanmayı öneriyorlar.

4- Kendinizi (ya da başkalarını) tekrar etmeyin.

  • Bu prensip hem veri için hem de kod için geçerli. Sistemdeki her bir verinin tek bir temsili bulunması gerek; yani kodun bir yerinde değişiklik yapıldığında bu değişiklik tüm her yere paralel olarak yansıması gerek. 
  • Kopya-yapıştır yapmak yerine kodu modüler hale getirmek, fonksiyonlar ve class'lar ile ilerlemek en sağlıklısı.

5- Hatalar için önceden plan yapın.

  • Hatalar kaçınılmaz, sadece onlara karşı "hazırlıklı" olmak gerekiyor. Bunun için "savunmacı programlama" yöntemi geliştirmeyi öneriyorlar. Kodun içine yanlış gitmesi muhtemel durumları kontrol amaçlı "assertion"lar ekleyip gerektiği durumda müdehale etmek gerekiyor. Assertion'lar program içinde örneğin belirli değişkeni, bir fonksiyon çıktısını kontrol edip programın devamını sağlayan mantıksal ifadeler. Bu ifadeleri kullanmanın kodun bölümlerine açıklama yazmaktan daha fazla anlaşılırlık kattığını söylüyorlar.
  • Otomatik testler uygulamak için standart test kütüphaneleri kullanmayı ve bugları bulmak için sembolik debugger'lar kullanmayı öneriyorlar.

6- Programı ancak doğru çalıştıktan sonra optimize edin.

  • Araştırmalarda kod yazan kişilerin kullandıkları dilden bağımsız olarak birim zamanda neredeyse aynı satır sayısında kod yazdığını gözlemişler. Buradan yola çıkarak kodu öncelikle daha az satır kodla yazılabilecek Python, R gibi "yüksek-seviyeli" dillerde prototipleyip ardından daha iyi performans için C, Java gibi düşük seviye dillere geçmeyi öneriyorlar.

7- Tasarım ve amacı dokümante edin, çalışma prensibini değil.

  • Yazılan kodu açıklamak için bir paragraf adım adım nasıl çalıştığını anlatmak yerine, kullanılan arayüzleri açıklayıp amaç ve nedenlerini açıklamak gerektiğini vurguluyorlar. Nasıl çalıştığının adım adım anlatılması gereken kodun tekrar geri dönülüp buna ihtiyaç kalmayacak şekilde tekrar düzenlenmesi gerektiğini söylüyorlar.
  • Dokümantasyonu yazılımın içine gömmeyi öneriyorlar ayrı bir yerde tutmak yerine (örneğin Jupyter Notebook'larda olduğu gibi); böylece program başkaları tarafından modifiye edildiğinde paralel olarak dokumantasyonun da güncellenebileceğini ekliyorlar.

8- Birlikte çalışın.
  • Yazılan programları proje üzerine çalışan kişiler arasında incelenip, gözden geçirilmesini öneriyorlar. Hatayı çok daha aza indirmek için aynı kod üzerinde beraber çalışmayı öneriyorlar.

Araştırmalarda bu tip "iyi alışkanlıkları" edinmek için gerekli öğrenme ve bunları uygulama sürelerinin, sonunda elde edilen verimlilik ile fazlasıyla karşılandığı belirtiliyor. Makalenin başında tıpkı laboratuardaki deneylerde olduğu gibi standartları birebir uygulamanın her zaman mümkün olmadığını ve bu alışkanlıkların hepsini bir anda uygulamaya çalışmaktansa teker teker çalışma rutinlerine entegre edilmesi gerektiğini ifade ediyorlar.

Bu yazıyı okuyup, konuyla uğraşan kişilerin bu tip "iyi alışkanlıklar" önerileri varsa da duymayı çok isterim!

Makaleyi okumak için:  "Best Practices for Scientific Computing" (PLOS Biology - Open Access)