- Bu deney, MNIST el yazısı rakam sınıflandırmasını yalnızca GZIP sıkıştırma ve k-en yakın komşu (k-NN) ile yaklaşık %78 doğruluğa kadar çıkararak, sıkıştırmanın modelsiz bir sınıflandırma aracı olarak kullanılabileceğini gösteriyor
- İki görüntü örneği birlikte sıkıştırıldığında uzunluğun ne kadar değiştiğine göre normalize sıkıştırma mesafesi (NCD) hesaplanıyor ve bu değer görüntüler arası benzerlik ölçütü olarak kullanılıyor
- Her test örneği 100 eğitim örneğiyle karşılaştırılıyor ve mesafesi en yakın k=5 komşunun çoğunluk etiketi tahmin sonucu oluyor
- Hesaplama maliyeti nedeniyle doğruluk tüm test kümesi yerine test görüntülerinin bir kısmı üzerinde ölçüldü; tüm küme kullanılırsa değerlendirme daha doğru olabilir
- Paylaşılan örnekte, sıkıştırma uzunluğu önbelleği oluşturulmasına rağmen bunun gerçek NCD hesabında kullanılmadığı bir refactoring hatası kalmış; önbelleğin kaldırılması veya
compute_ncdiçine yansıtılması gerekiyor
GZIP + k-NN ile MNIST sınıflandırma
- Deney, MNIST el yazısı rakam veri kümesini GZIP + k-NN kombinasyonuyla sınıflandırıyor
- Kısa kod örneği,
gzip.compress(z.tobytes())sonucunun uzunluğunu sıkıştırma uzunluğu olarak kullanıyor, ardından NCD'yi hesaplayıp en yakın 5 komşunun etiketleri arasından en sık görüleni seçiyor - Çalıştırılabilir örnek Jupyter Notebook içinde yer alıyor
- Amaç en yüksek doğruluk değil, sıkıştırmayı modelsiz bir sınıflandırma aracı olarak kullanma fikrini basitçe doğrulamak
- 10 satırdan kısa kod, deneyin özünden çok eğlence amaçlı bir code golf unsuru gibi duruyor
Benzerlik hesabı ve sınıflandırma süreci
- NCD, iki veri noktasını birlikte sıkıştırmanın maliyetinin ayrı ayrı sıkıştırmaya göre ne kadar farklı olduğunu normalize ederek benzerliği ölçüyor
- Sıkıştırma uzunluğu şu şekilde hesaplanıyor
Cx1 = len(gzip.compress(x1.tobytes()))Cx2 = len(gzip.compress(x2.tobytes()))Cx1x2 = len(gzip.compress((x1 + x2).tobytes()))
- NCD formülü
(Cx1x2 - min(Cx1, Cx2)) / max(Cx1, Cx2)biçiminde - Sınıflandırmada her test görüntüsü ile eğitim görüntülerinin mesafesi hesaplanıyor, bunlar yakınlığa göre sıralanıyor ve en yakın 5 etiketin çoğunluk oyu kullanılıyor
- Deneyde karşılaştırma için 100 eğitim örneği baz alındı ve hesaplama maliyeti nedeniyle test kümesinin de yalnızca bir bölümü kullanıldı
İlham alınan fikirler ve kod üzerindeki dikkat noktaları
- Bu yaklaşım, text generation from data compression yazısından ve parameter free text classification makalesinden ilham alıyor
- Yazı yayımlandıktan sonra Andreas Kirsch'ün 2019'da benzer yaklaşımla yazdığı MNIST by ZIP yazısı da fark edilmiş
- Örnek kod, eğitim örnekleri için bir sıkıştırma uzunluğu önbelleği oluşturuyor, ancak gerçek döngüde bu önbellek değerlerini kullanmıyor
- Hem normal sürüm hem de obfuscated sürüm
compressed_lengthsveyaclsoluşturuyor, ancak NCD hesabında önbelleğe alınmış uzunlukları kullanmıyor - Önbelleği kaldırıp doğrudan
training_setkullanmak ya dacompute_ncdişlevini önbellek değerlerinden yararlanacak şekilde değiştirmek, kodun niyetiyle uygulamayı hizalar
- Hem normal sürüm hem de obfuscated sürüm
1 yorum
Hacker News yorumları
Koddaki uzaklık fonksiyonunu daha basit ölçülerle değiştirmeyi denedim; MNIST sınıflandırmasında GZIP uzaklığı hem daha düşük doğruluk veriyor hem de hesaplama maliyeti çok daha yüksek
Gzip uzaklığı: yaklaşık 3 dakika, %78 doğruluk / Öklid uzaklığı: yaklaşık 0,5 saniye, %93 / Jaccard uzaklığı: yaklaşık 0,7 saniye, %94 / Dice benzemezliği: yaklaşık 0,8 saniye, %94
Jaccard ve Dice, görüntüler ikilileştirildikten sonra ölçüldü
GZIP algoritmasına çok aşina değilim ama sonucun bu kadar düşük olması ilginç; görüntü odaklı bir sıkıştırma algoritmasıyla daha iyi olup olmayacağını da merak ediyorum
Yazının kendisi yaratıcı, kodu ve açıklaması da iyiydi; ancak bence yukarıdaki taban çizgileri gzip skoruna bağlam katıyor
NMI skimage: yaklaşık 30 saniye, %95 doğruluk / NMI numba: yaklaşık 0,6 saniye, %95 doğruluk
ChatGPT’nin verdiği
numbakoduyla 2x2 birleşik sayım, entropi ve normalize karşılıklı bilgiyi hesapladımKişisel olarak CIFAR10’da hızlı eğitime ilgi duyuyorum, bu yüzden böyle bir yaklaşım başka alanlarda da epey yararlı olabilir gibi görünüyor
https://github.com/benjamin-recht/mnist_1_pt_2/tree/main
zstandard’ı da ekleyince Zstd(level=3), yaklaşık 3,5 saniyede %88 doğrulukla gzip’ten çok daha hızlıydı
Cx1x2hesaplanırkenx1+x2yerine(x1-x2)*2kullanılırsa zstd %93 doğruluğa kadar çıkıyorİki diziyi toplamak yerine alt alta/üst üste yığarsanız performans tamamen çöküp %20’nin altına düşüyor; ama metin sınıflandırmada bu yöntem iyi çalışıyor gibi göründüğü için ilginç
Diğer tekniklerle karşılaştırınca Linear SVC %92, RBF çekirdekli SVC %96,4, polinom çekirdekli SVC %94,5, lojistik regresyon %89, Naive Bayes ise yaklaşık %81 veriyor
Kaynak: https://dmkothari.github.io/Machine-Learning-Projects/SVM_wi...
Çevrimiçi yazılara bakınca yalnızca K-NN ile bile çok daha iyi sonuçlar mümkün görünüyor; yazar gzip kullanarak işi gereğinden zorlaştırmış olabilir
Basit bir modelle başlayıp karmaşıklığı sonradan artırmayı seviyorum; gerçekten iyi çalışabilecek problemlerde bile sık sık “lojistik regresyon olmaz” dendiğini duydum
MNIST’te taban performansın ne olacağını sorduğumda çoğu kişi %20-30 diye tahmin ediyor
Makine öğrenmesi yapanlar bile model karmaşıklığını ciddi biçimde artırırken azalan getirinin ne kadar hızlı devreye girdiğini sık sık hafife alıyor
Basit modelde performans iyi değilse, daha karmaşık modellerde de harika performans almanın zor olduğu çok durum gördüm
MNIST veri kümesini tanıtan özgün makale de yaklaşık %98 doğruluk elde etmişti; günümüz sinir ağları ise %99,87 doğruluğa kadar çıkıyor
https://paperswithcode.com/sota/image-classification-on-mnis...
Sıkıştırma zaten asıl problemi daha zor hale getirmek için var ve pratikte de hâlâ böyle çalışıyor
Diğer modeller bir yerlerde gürültü ekleme eğiliminde olduğundan, gzip’ten önce özellik mühendisliği koymak nasıl olur diye düşünüyorum
Örneğin önce Gaussian blur ve evrişim uygulayıp ardından özellik seçimi için deep learning kullanmak da mümkün görünüyor
Kod zarif ve kısa olabilir ama MNIST’te %78 doğruluk oldukça kötü
TensorFlow ile yapılmış basit bir dummy model bile kolayca %90 doğruluğa ulaşır; en iyi model ise %99,87’de
Benchmark: https://paperswithcode.com/sota/image-classification-on-mnis...
İlginç olan, bir modeli eğitmeden de sıkıştırmanın sınıflandırmada kullanılabilmesi
Bu da daha ucuz ve kayıplı başka bilgi kuramsal ölçülerin de kullanılıp kullanılamayacağını sorduruyor
To Compress or Not to Compress- Self-Supervised Learning and Information Theory: A Review
[https://arxiv.org/abs/2304.09355\)" class="ud link">https://arxiv.org/abs/2304.09355\](https://arxiv.org/abs/2304.09355\)*
İlginç olan GZip’in güncel en iyi performansa ulaşıp ulaşmaması değil, bir şekilde sınıflandırma yapabilmesi
Bu, bir ayının Mozart’ı kusursuz icra edip etmemesi değil de, piyano çalabiliyor olmasının başlı başına şaşırtıcı olması gibi
Yine de taban çizgisinden 8 kat daha iyi ve sıkıştırmanın temsili öğrenebildiğini gösteriyor
compute_ncdyi Öklid mesafesiyle değiştirirseniz test doğruluğu 15 yüzde puan artıyor ve hesaplama yükü de ciddi ölçüde azalıyordistances = [(np.sqrt(np.sum(np.square(x1-x))), label) for x, _, label in compressed_lengths]gibi değiştirmeniz yeterliBilgi teorisi, sıkıştırma ve öğrenme algoritmaları arasındaki derin bağlantıları ele alan kitaplar arasında MacKay bana en iyisi gelmişti
İyi eğitim almış kişiler için bu genel kültür sayılabilir ama kendi kendine, uygulama odaklı makine öğrenmesi öğrenmiş biri olarak bu konunun parçacık fiziği ve kozmoloji gibi alanlara kadar uzandığını görünce güçlü bir “Aha!” anı yaşamıştım
Bir kişi bile aynı farkındalığı yaşasın diye bırakıyorum
gzip’in temellerinden biri olan özgün Lempel-Ziv sıkıştırmasının, yalnızca boyutu küçültme girişiminden ziyade “sonlu dizilerin karmaşıklığı” araştırmasından çıktığını öğrendiğimde epey etkilenmiştim
https://ieeexplore.ieee.org/document/1055501
Adil olmak gerekirse MNIST, yalnızca UMAP’ten geçirilse bile neredeyse kusursuz biçimde ayrışıyor
Bugünlerde MNIST’te kötü performans almak için epey uğraşmak gerektiğini düşünüyorum
https://github.com/lmcinnes/umap_paper_notebooks/blob/master...
Artık bu veri kümesini emekliye ayırmak daha iyi olur; QuickDraw gibi veri kümelerinin çok daha mantıklı olduğunu düşünüyorum
Kendi başına büyük bir başarı saymak zor ama yine de çalıştığını görmek ilginç
Eve gidince MNIST’i çözmenin görece kolay olduğu noktasını yazıya ekleyeceğim
Yine de basit ve makul algoritmaların çoğu %97 doğruluğa ulaştığı için eğitim aracı ya da Hello world veri kümesi olarak hâlâ değerli
Araçları en baştan kendiniz yapsanız bile ödev ölçeğine uygun ve “posta üzerindeki rakamları tanıma” gibi herkesin anlayabileceği faydalı bir görev
Sıkıştırmayı anlıyorsanız bu yaklaşım da çok basit bir fikir; MNIST’in yayımlandığı ilk gün de yazılabilirdi ve yine %78 doğruluk verirdi
Bu nokta bana oldukça şaşırtıcı geliyor
Depo da UMAP’i tanımlamıyor; ChatGPT’ye güvenecek olursak UMAP, Uniform Manifold Approximation and Projection’ın kısaltması ve makine öğrenmesi ile veri analizinde kullanılan bir boyut indirgeme ve görselleştirme tekniği
Bu alanda hobi düzeyindeyim ama güçlü biçimde sıkıştırılmış verinin, şifrelenmiş veri gibi yüksek entropili olmadığını mı düşünmeliyiz
Sıkıştırılmış veride desenler bulup özgün rakamı anlayabiliyorsanız, o desenleri daha iyi sıkıştırma için kullanabilmeniz gerekmez mi
“7 7”, “7 3”ten daha iyi sıkıştırılmalı; raster görüntüdeki “7 7”nin de “7 3”ten daha iyi sıkıştırılacağı fikri bu
Sıkıştırılamazlık, verimli kriptografik işlemlerin bir özelliğidir
Kolmogorov karmaşıklığı maddesindeki sıkıştırma bölümüne bakın: https://en.wikipedia.org/wiki/Kolmogorov_complexity#Compress...
Sıkıştırmada sevdiğim kavramlardan biri güvercin yuvası ilkesi; buna göre her sıkıştırma algoritmasında girdiden daha büyük çıkan bir çıktı mutlaka vardır
İyi tasarlanmış bir şifreli payload üzerinde de sıkıştırma denenebilir ama ortalamada çıktı girdiden daha büyük olur ve sıkıştırma işe yaramaz hâle gelir; bu yüzden “sıkıştırılamaz” denir
https://en.wikipedia.org/wiki/Pigeonhole_principle#Uses_and_...
Birkaç yıl önce MNIST görüntülerinin boyutunu “meta özellik” olarak kullanan bir örnek vardı sanırım ama hemen bulamıyorum
Görüntüye hiç bakmadan, yalnızca o tek özellikle kabaca %90 civarı doğruluk verdiğini hatırlıyorum
gzip ile sıkıştırılmış boyut mu? Sadece MNIST görüntüsünün ne kadar koyu olduğuna, yani koyu piksel oranına bakarsanız yaklaşık %20 doğruluk elde edersiniz; rastgele tahminden iki kat iyi ama %90’ın çok uzağında
O makalenin yazarları hata yapmış ve sonuçlar benchmark’ın üst sıralarına fırlamış olabilir diye düşünüyorum
O olaydan sonra teorinin tutarlı olmadığını düşünmüştüm ama yine de yalnızca GZIP ile %78 doğruluk etkileyici
Bu problemin sıkıştırma numarası için iyi bir uygulama alanı olup olmamasından bağımsız olarak, deney yapanların
gzipkullanmayı bırakıpzlibkullanması iyi olurİlk satırı
gzip.compresstenzlib.compresse değiştirirseniz aynı sınıflandırma performansıyla hız 3 kat artacaktır