Karanlık bir ekranın üzerine birkaç tane “yem” bırakıp, küçücük sanal bir solucanın kıvrıla kıvrıla onlara doğru ilerlediğini izlemek garip biçimde keyifli.
Ama worm-sim'i sıradan bir animasyondan daha ilginç yapan şey ekranda gördüğümüz solucan değil, arka planda çalışan sistem.
Proje, nörobilim dünyasının en meşhur küçük canlılarından biri olan Caenorhabditis elegans'ın sinir sisteminden esinlenen basitleştirilmiş bir hesaplama modeli kullanıyor.
C. elegans yaklaşık bir milimetre uzunluğunda. Buna rağmen sinir sistemi inanılmaz ayrıntılı biçimde haritalanmış durumda. Yetişkin hermafrodit bireyde klasik olarak 302 nöron bulunuyor ve onlarca yıldır yapılan elektron mikroskobu çalışmaları sayesinde bu nöronların birbirleriyle nasıl bağlantı kurduğu oldukça ayrıntılı biçimde biliniyor.
Bunu duyunca insanın aklına doğal olarak şu soru geliyor:
Madem bütün bağlantıları biliyoruz, bu haritayı JavaScript'e aktarıp çalışan bir solucan beyni elde edemez miyiz?
Kısa cevap: Tam olarak değil.
Ama worm-sim'in ilginç olduğu yer de tam burası.
Her Şey Bağlantı Haritasıyla Başlıyor
Projenin merkezinde weights adında oldukça büyük bir JavaScript nesnesi bulunuyor.
Mantık kabaca şöyle:
var weights = {
ADAL: {
ADAR: 2,
ADFL: 1,
AIBL: 1,
AVBR: 7,
RIML: 3,
// ...
},
// ...
};Buradaki her anahtar bir nöronu ya da kaslarla ilişkili bir düğümü temsil ediyor. Karşısındaki değerler ise diğer düğümlere olan bağlantıları ve bu bağlantıların ağırlıklarını gösteriyor.
Simülasyon başlatıldığında BRAIN.setup() bu tabloyu dolaşıyor, mevcut düğümleri keşfediyor ve ağın durumunu dinamik olarak oluşturuyor.
Temel akış şaşırtıcı derecede sade:
duyusal girdi → sinirsel aktivite → ağırlıklı bağlantılar → kas aktivasyonu → vücut fiziği
Aslında bütün sistem bu zincirin etrafında dönüyor.
Kodun temeli daha önce geliştirilen GoPiGo Connectome çalışmalarına dayanıyor. Connectome verileri daha sonra JavaScript'e taşınmış ve worm-sim'in içine dahil edilmiş.
Fakat burada “simülasyon” kelimesini biraz dikkatli kullanmak gerekiyor.
Proje biyolojik bağlantıları bir hesaplama altyapısı olarak kullanıyor ama gerçek bir solucanın elektriksel, kimyasal, moleküler ve biyomekanik özelliklerinin tamamını yeniden üretmiyor.
Kodun içine girdikçe bu fark çok daha açık hale geliyor.
Buradaki Nöronlar Küçük Birer Toplayıcı Gibi Çalışıyor
connectome.js içindeki sanal nöronlar özellikle basit tasarlanmış.
Her düğüm kendi aktivite değerini tutuyor. Gelen bağlantılar da ağırlıkları kadar bu değere ekleniyor.
Sistemin ateşleme eşiği şöyle belirlenmiş:
BRAIN.fireThreshold = 30;Kas olmayan bir nöronun aktivitesi bu değerin üzerine çıktığında, nöron kendi çıkış bağlantıları üzerinden aktiviteyi diğer düğümlere aktarabiliyor.
Her sinirsel güncellemeden sonra kalan aktivite de azaltılıyor:
BRAIN.postSynaptic[ps][BRAIN.nextState] *= 0.85;Yani aktivite sonsuza kadar ağın içinde kalmıyor. Zamanla sönümleniyor.
Ortaya çok hafif, ayrık zamanlı bir sinir ağı dinamiği çıkıyor:
Bazı nöronları uyar.
Gelen ağırlıklı sinyalleri topla.
Eşiği geçen nöronları ateşle.
Aktiviteyi bağlantılar üzerinden yay.
Kas aktivitesini oku.
Kalan aktiviteyi azalt.
Tekrar et.
Burada ayrıntılı zar potansiyelleri, iyon kanalları, nörotransmitter kinetikleri, rastgele vezikül salınımı veya biyolojik olarak gerçekçi aksiyon potansiyelleri yok.
Ve açıkçası olması da şart değil.
Asıl merak uyandıran soru şu:
Bütün bu biyolojik ayrıntıları eklemeden önce bile ne kadar davranış elde edebiliriz?
Solucana Hissedecek Bir Dünya Vermek
Tek başına boşlukta duran bir sinir sistemi pek heyecan verici değil.
Bir çevreye ihtiyacı var.
worm-sim'de bu çevre doğrudan tarayıcı.
Mevcut sürüm solucana birkaç farklı yapay duyusal girdi sağlıyor.
Açlık
Simülasyon çalışırken bazı nöronlar sürekli uyarılıyor:
RIML
RIMR
RICL
RICRBu sayede ağın içerisinde devamlı bir içsel dürtü oluşturuluyor.
Bunu gerçek biyolojik açlık mekanizmasının birebir modeli olarak düşünmek doğru olmaz.
Daha çok sistemin davranış üretmeye devam etmesini sağlayan hesaplamalı bir açlık sinyali gibi düşünebiliriz.
Dokunma
Solucanın başı tarayıcı penceresinin kenarına geldiğinde bir çarpışma mekanizması devreye giriyor.
FLP, ASH, IL1 ve OLQ gruplarındaki bazı duyusal nöronlar uyarılıyor.
Böylece ekranın kenarı görünmez bir duvar gibi davranıyor.
Solucan duvara dokunuyor, duyusal sinyal sinir ağına giriyor ve ortaya çıkan yeni sinirsel durum hareketi etkiliyor.
Basit ama güzel çalışan bir geri bildirim döngüsü.
Yem ve Kemotaksi
Ekrana tıkladığınızda yem bırakabiliyorsunuz.
Simülasyon, solucanın bütün yem kaynaklarına olan uzaklığını kullanarak basit bir “koku” değeri hesaplıyor:
currentSmell += 200 / (dist + 1);Fakat kod yalnızca şunu sormuyor:
Koku ne kadar güçlü?
Daha ilginç bir şeyi ölçüyor:
Koku artıyor mu, azalıyor mu?
BRAIN.foodGradient = currentSmell - lastSmell;Bu değişimin pozitif veya negatif olmasına göre ASEL ya da ASER nöronları uyarılıyor.
Bu seçimin biyolojik bir karşılığı da var. C. elegans'taki ASE nöronları kimyasal algılamada önemli görev üstlenen sağ-sol bir duyusal nöron çifti ve iki tarafın kimyasal yön bulmadaki işlevleri birbirinden farklı.
Burada da elbette gerçek kemotaksinin eksiksiz bir modeli yok.
Ama ortaya çok güzel bir döngü çıkıyor:
hareket et → çevreyi ölç → değişimi fark et → sinir sistemini değiştir → yeniden hareket et
İşte bu noktada sistem basit bir animasyondan çıkıp gerçek anlamda bir bedenlenmiş sistem hissi vermeye başlıyor.
Bağlantı Haritası Tek Başına Solucanı Yürütmüyor
Projeyi incelerken bence en önemli noktalardan biri buydu.
Ekranda kıvrılarak ilerleyen solucanı görünce bütün bu hareketin doğrudan connectome'dan ortaya çıktığını düşünmek çok kolay.
Ama kod aslında bundan biraz daha karmaşık.
Simülasyon, vücut boyunca ilerleyen açık bir salınım sinyali ekliyor.
Baştan kuyruğa doğru olan segmentlere sinüs dalgasına göre dönüşümlü biçimde dorsal ve ventral kas uyarımı gönderiliyor:
if (Math.sin(phase) > 0) {
// dorsal kasları uyar
} else {
// ventral kasları uyar
}Böylece vücutta ilerleyen bir kıvrılma dalgası oluşuyor.
Bunu basitleştirilmiş bir central pattern generator, yani ritmik hareket üreten merkezi bir mekanizma gibi düşünebiliriz.
Kod ayrıca iki sinüs dalgasından oluşan bağımsız bir gezinme sinyali de üretiyor ve bunu özellikle baş bölgesine uyguluyor.
Dolayısıyla sistem aslında şu kadar basit değil:
connectome girer → solucan davranışı çıkar
Daha çok şöyle:
connectome + duyusal geri bildirim + proprioseptif geri bildirim + yapay salınım + yön kontrolü + vücut fiziği → davranış
Bu ilk bakışta biraz daha az “sihirli” görünebilir.
Ama bilimsel açıdan bence tam tersine daha ilginç.
Çünkü gerçek hayvan hareketi de yalnızca beyin tarafından verilen komutlardan ibaret değil. Sinir sistemi, kaslar, vücut ve çevre sürekli birbirini etkileyen kapalı bir döngü oluşturuyor.
C. elegans üzerine yapılan deneysel çalışmalar da vücut bölgeleri ile motor nöronlar arasındaki proprioseptif geri bildirimin, kıvrılma hareketinin baştan kuyruğa aktarılmasında önemli rol oynadığını gösteriyor.
Dolayısıyla worm-sim'deki sinüs dalgasını “solucan hareketinin biyolojik sırrı çözüldü” diye yorumlamak yanlış olur.
Bu daha çok iyi düşünülmüş bir mühendislik çözümü.
Sinirsel Aktivite Nasıl Fiziksel Bir Vücuda Dönüşüyor?
Sanal solucanın vücudu birbirine bağlı 35 fizik düğümünden oluşuyor.
Sinir sisteminden gelen motor çıktılar ise 17 segmentlik aktivasyon gruplarına indirgeniyor.
Her segmentte birkaç temel sinyal takip ediliyor:
dorsal: vücudun bir yöne bükülmesine katkı sağlıyorventral: ters yöne bükülmesine katkı sağlıyorleft/right: yanal kas aktivitesini topluyorturn: sınırlandırılmış bir yön değiştirme sinyali oluşturuyor
Her bölge için dorsal ve ventral aktivite karşılaştırılıyor ve istenen kıvrılma miktarı hesaplanıyor.
Ardından komşu fizik düğümlerine kuvvet uygulanıyor ve vücut bu eğriliğe ulaşmaya çalışıyor.
Ama yalnızca kıvrılmak ileri gitmek için yeterli değil.
Buzun üzerine uzun bir ip koyduğunuzu ve onu dalga şeklinde oynattığınızı düşünün.
İp gayet güzel kıvrılabilir ama neredeyse hiç ilerlemeyebilir.
worm-sim bunu anizotropik sürtünme kullanarak çözüyor.
Vücudun yönüne paralel olan hareket çok az yavaşlatılırken, yana doğru olan hareket çok daha güçlü biçimde bastırılıyor.
Bu fark sayesinde vücutta ilerleyen kıvrılma dalgası gerçek ileri harekete dönüşüyor.
Ayrıca:
komşu noktaları bir arada tutan yay benzeri kuvvetler,
aşırı kıvrılmayı engelleyen sertlik,
vücudun birbirinden uzak parçalarının iç içe geçmesini engelleyen itme kuvvetleri
de bulunuyor.
Burada kolayca gözden kaçabilecek çok önemli bir fikir var:
Davranış yalnızca sinir sisteminden çıkmıyor.
Sinir sisteminin bir vücut üzerinden, bir çevrenin içinde çalışması sonucunda ortaya çıkıyor.
Vücuttan Beyne Giden Basit Bir Geri Bildirim de Var
Projede özellikle hoşuma giden başka bir detay daha var.
Simülasyon yalnızca beyinden vücuda komut göndermiyor.
Vücudun mevcut kıvrılma durumunun bir kısmını tekrar sinir sistemine geri besliyor.
Bir segment belirli bir yöne yeterince kıvrıldığında ilgili dorsal veya ventral kas düğümlerine ek aktivite gönderiliyor.
Yani sistem artık yalnızca:
beyin
↓
kaslar
↓
vücutşeklinde işlemiyor.
Daha çok şuna benziyor:
beyin
↓
kaslar
↓
vücut
↓
proprioseptif geri bildirim
└──────────────→ beyinBu kavramsal olarak oldukça önemli.
Bir sinir sistemi kendi vücudunun ne yaptığını hiç öğrenemiyorsa onu düzgün biçimde kontrol etmesi de zorlaşır.
Gerçek C. elegans çalışmalarında proprioseptif geri bildirimin vücut boyunca ilerleyen kıvrılma dalgalarının koordinasyonunda önemli olduğu biliniyor.
Bu yüzden worm-sim, basit bir sinir ağı görselleştirmesinden daha ilginç bir deney ortamına dönüşüyor.
Peki Bu Gerçek Bir Dijital C. elegans Beyni mi?
Hayır.
En azından “gerçek bir solucan beyninin dijital kopyası” anlamında değil.
Connectome bize temel olarak şunu söyler:
Kim, kime bağlı?
Ama bağlantı haritasını bilmek, bu bağlantıların nasıl çalıştığını tamamen bildiğimiz anlamına gelmez.
Teorik olarak iki sinir sistemi aynı bağlantı grafiğine sahip olabilir ama şu nedenlerden dolayı tamamen farklı davranabilir:
farklı nörotransmitterler,
farklı reseptör dağılımları,
farklı bağlantı güçleri,
nöromodülatörler,
hücresel dinamikler,
plastisite,
duyusal durum,
gelişim geçmişi,
vücut mekaniği.
Connectomics'in en güzel ama aynı zamanda en sinir bozucu taraflarından biri de bu zaten:
Kablolamayı bilmek, algoritmayı bilmek demek değil.
worm-sim'in mevcut sürümünde hareketi mümkün hale getiren açıkça tasarlanmış başka parçalar da bulunuyor.
Örneğin:
vücutta ilerleyen yapay salınım,
prosedürel gezinme sinyali,
fizik sabitleri,
ileri hareket mekanizması,
çarpışma sistemi,
yapay koku gradyanı,
basitleştirilmiş nöral eşik modeli.
Bu nedenle projeye “solucan beyninin eksiksiz dijital kopyası” demek abartılı olur.
Bence çok daha doğru tanım şu:
Connectome'dan esinlenen, bedenlenmiş bir sinir sistemi simülasyonu.
Ve açıkçası bu haliyle bile oldukça etkileyici.
Asıl İlginç Kısım: Bunu Bir Deney Platformuna Çevirmek
Sistemin küçük ve anlaşılabilir olması büyük avantaj.
Çünkü istediğimiz parçayı değiştirip sonucunu gözlemlemek oldukça kolay.
Mesela tek tek nöronları devre dışı bırakıp solucanın hareket yolunun nasıl değiştiğini inceleyebiliriz.
Bağlantı ağırlıklarını değiştirip yem bulma başarısının artıp artmadığını ölçebiliriz.
Proprioseptif geri bildirimi kapatabiliriz.
Mevcut yapay salınım mekanizmasını tamamen kaldırıp başka bir kontrol sisteminin yürümeyi yeniden öğrenip öğrenemeyeceğine bakabiliriz.
Binlerce deneme boyunca nöral aktivite kaydedilebilir.
Farklı ortamlar oluşturulabilir.
Hatta bazı parametreler elle ayarlanmak yerine evrimsel algoritmalarla optimize edilebilir.
Bence özellikle ilginç bir deney, sistemi üç ayrı katmana ayırmak olur:
CONNECTOME
sinirsel bağlantılar ve aktivite
↓
CONTROLLER
öğrenebilen veya evrimleşebilen dinamikler
↓
BODY + WORLD
fizik, yem, dokunma ve duyusal geri bildirimSonra hareket kurallarını tek tek kodlamak yerine yalnızca belirli parametrelerin değişmesine izin verilebilir.
Sistem de yaptığı işe göre ödüllendirilebilir:
yeme ulaşmak,
duvarlardan uzak durmak,
daha az enerjiyle hareket etmek,
simüle edilmiş bir nöron hasarından sonra yeniden uyum sağlamak.
Bu noktada sorduğumuz soru değişiyor.
Artık:
“Bir connectome'u hareket ettirebilir miyiz?”
diye sormuyoruz.
Onun yerine:
“Bu yapının bazı dinamiklerinin öğrenmesine izin verirsek ne kadar karmaşık ve işe yarar davranış ortaya çıkabilir?”
diye soruyoruz.
Bence asıl ilginç deney de burada başlıyor.
Anlayacak Kadar Küçük, Bozacak Kadar Açık
worm-sim'in güzel taraflarından biri de devasa bir framework'ün altında kaybolmaması.
Temel olarak:
JavaScript,
Canvas çizimleri,
sinir bağlantısı verileri,
özel bir fizik sistemi
üzerine kurulmuş.
Duyusal girdiden başlayıp nöron aktivitesine, oradan kaslara ve sonunda ekranda gördüğümüz harekete kadar bütün zinciri kaynak kod üzerinden takip edebiliyorsunuz.
Bunu yapmak için GPU kümesine ya da devasa bir yapay zekâ altyapısına da ihtiyacınız yok.
Proje ayrıca MIT License altında yayınlanmış.
Bu da lisans ve telif bildirimleri korunduğu sürece yazılımı kullanabileceğiniz, kopyalayabileceğiniz, değiştirebileceğiniz, dağıtabileceğiniz ve başka projelerin içine dahil edebileceğiniz anlamına geliyor.
Deneysel bir proje için bu oldukça önemli.
Projeyi fork'layabilirsiniz.
Bozabilirsiniz.
Sinir modelini tamamen değiştirebilirsiniz.
Reinforcement learning ekleyebilirsiniz.
Nöron kaybı deneyleri yapabilirsiniz.
Her sanal nöronun aktivitesini kaydedebilirsiniz.
Hatta projeyi geliştiricisinin hiç düşünmediği başka bir şeye dönüştürebilirsiniz.
Belki de bu küçük sanal solucanın en değerli tarafı tam olarak bu.
Nörobilim ile yazılım mühendisliğinin ilginç bir kesişim noktasında duruyor.
Biyolojik bir bağlantı haritası önce çalıştırılabilir veriye dönüşüyor.
Veri aktiviteye dönüşüyor.
Aktivite kas komutlarına dönüşüyor.
Kas komutları fiziğe dönüşüyor.
Ve fizik tekrar sinir sistemine bilgi gönderiyor.
Bu, eksiksiz bir dijital canlı olmaktan hâlâ çok uzak.
Ama gerçek sorular sorabileceğimiz kadar karmaşık.
Aynı zamanda kaynak kodu açıp sistemin neden öyle davrandığını anlayabileceğimiz kadar da basit.
Bence onu ilginç yapan şey tam olarak bu.
← BILIM